1. 程式人生 > >Python線程與進程的區別

Python線程與進程的區別

操作 沒有 方式 啟動進程 外部 共享 重啟 資源分配 不能

進程的基本概念

概念
進程就是一個程序在一個數據集上的一次動態執行過程。 進程一般由程序、數據集、進程控制塊三部分組成。我們編寫的程序用來描述進程要完成哪些功能以及如何完成;數據集則是程序在執行過程中所需要使用的資源;進程控制塊用來記錄進程的外部特征,描述進程的執行變化過程,系統可以利用它來控制和管理進程,它是系統感知進程存在的唯一標誌。

線程的基本概念

概念
線程是進程中執行運算的最小單位,是進程中的一個實體,是被系統獨立調度和分派的基本單位,線程自己不擁有系統資源,只擁有一點在運行中必不可少的資源,但它可與同屬一個進程的其它線程共享進程所擁有的全部資源。一個線程可以創建和撤消另一個線程,同一進程中的多個線程之間可以並發執行。

好處

  • 易於調度。
  • 提高並發性,通過線程可方便有效地實現並發性。進程可創建多個線程來執行同一程序的不同部分。
  • 開銷少,創建線程比創建進程要快,所需開銷很少

進程的基本狀態及狀態之間的關系
狀態:運行、阻塞、掛起阻塞、就緒、掛起就緒

狀態之間的轉換:

  1. 準備就緒的進程,被CPU調度執行,變成運行態;
  2. 運行中的進程,進行I/O請求或者不能得到所請求的資源,變成阻塞態;
  3. 運行中的進程,進程執行完畢(或時間片已到),變成就緒態;
  4. 將阻塞態的進程掛起,變成掛起阻塞態,當導致進程阻塞的I/O操作在用戶重啟進程前完成(稱之為喚醒),掛起阻塞態變成掛起就緒態,當用戶在I/O操作結束之前重啟進程,掛起阻塞態變成阻塞態;
  5. 將就緒(或運行)中的進程掛起,變成掛起就緒態,當該進程恢復之後,掛起就緒態變成就緒態;

進程和線程的關系:

  • 一個線程只能屬於一個進程,而一個進程可以有多個線程,但至少有一個線程。
  • 資源分配給進程,同一進程的所有線程共享該進程的所有資源。
  • 處理機分給線程,即真正在處理機上運行的是線程
  • 線程在執行過程中,需要協作同步。不同進程的線程間要利用消息通信的辦法實現同步。線程是指進程內的一個執行單元,也是進程內的可調度實體.

###進程與線程的區別:

  • 運行方式不同

    • 進程不能單獨執行,它只是資源的集合。
    • 進程要操作CPU,必須要先創建一個線程。
    • 所有在同一個進程裏的線程,是同享同一塊進程所占的內存空間。
  • 關系

    • 進程中第一個線程是主線程,主線程可以創建其他線程;其他線程也可以創建線程;線程之間是平等的。
    • 進程有父進程和子進程,獨立的內存空間,唯一的標識符:pid。
  • 速度

    • 啟動線程比啟動進程快
    • 運行線程和運行進程速度上是一樣的,沒有可比性
    • 線程共享內存空間,進程的內存是獨立的。
  • 創建

    • 父進程生成子進程,相當於復制一份內存空間,進程之間不能直接訪問
    • 創建新線程很簡單,創建新進程需要對父進程進行一次復制
    • 一個線程可以控制和操作同級線程裏的其他線程,但是進程只能操作子進程。
  • 交互

    • 同一個進程裏的線程之間可以直接訪問。
    • 兩個進程想通信必須通過一個中間代理來實現。
  • 調度
    • 線程作為調度和分配的基本單位,進程作為擁有資源的基本單位
  • 並發性
    • 不僅進程之間可以並發執行,同一個進程的多個線程之間也可並發執行
  • 擁有資源:
    • 進程是擁有資源的一個獨立單位,線程不擁有系統資源,但可以訪問隸屬於進程的資源.
  • 系統開銷:
    • 在創建或撤消進程時,由於系統都要為之分配和回收資源,導致系統的開銷明顯大於創建或撤消線程時的開銷。

Python線程與進程的區別