[multithreading] 進程和線程有什麼區別?


Answers

處理
每個進程都提供執行程序所需的資源。 進程具有虛擬地址空間,可執行代碼,系統對象的打開句柄,安全上下文,唯一進程標識符,環境變量,優先級類別,最小和最大工作集大小以及至少一個執行線程。 每個進程都使用單線程啟動,通常稱為主線程,但可以從其任何線程創建其他線程。


線程是可以安排執行的進程中的實體。 進程的所有線程共享其虛擬地址空間和系統資源。 另外,每個線程維護異常處理程序,調度優先級,線程本地存儲,唯一線程標識符以及系統將用於保存線程上下文直到它被調度的一組結構。 線程上下文包括線程的一組機器寄存器,內核堆棧,線程環境塊以及線程進程地址空間中的用戶堆棧。 線程也可以有自己的安全上下文,可用於模擬客戶端。

在MSDN上找到這裡:
關於進程和線程

Microsoft Windows支持搶先式多任務處理,這可以創建同時執行多個進程中多個線程的效果。 在多處理器計算機上,系統可以同時執行與計算機上的處理器一樣多的線程。

Question

進程和線程之間的技術區別是什麼?

我感覺像'過程'這樣的詞被過度使用,並且還有硬件和軟件線程。 Erlang語言中的輕量級過程如何? 有一個明確的理由使用一個術語而不是另一個術語?




示例1:JVM在單個進程中運行,JVM中的線程共享屬於該進程的堆。 這就是為什麼幾個線程可以訪問同一個對象。 線程共享堆並擁有自己的堆棧空間。 這是一個線程如何調用一個方法以及它的局部變量是如何保持線程安全的。 但是堆不是線程安全的並且為了線程安全必須進行同步。




從採訪者的角度來看,我基本上只想听到3件主要的事情,除了像流程這樣明顯的東西可以有多個線程:

  1. 線程共享相同的內存空間,這意味著線程可以從其他線程內存訪問內存。 過程通常不能。
  2. 資源。 資源(內存,句柄,套接字等)在進程終止時釋放,而不是線程終止。
  3. 安全。 一個進程有一個固定的安全令牌。 另一方面,線程可以模擬不同的用戶/令牌。

如果你想要更多,Scott Langham的回應幾乎涵蓋了一切。 所有這些都來自操作系統的角度。 不同的語言可以實現不同的概念,如任務,輕便線程等,但它們只是使用線程(Windows上的光纖)的方式。 沒有硬件和軟件線程。 有硬件和軟件異常中斷 ,或用戶模式和內核線程




進程是應用程序的執行實例。

那是什麼意思? 那麼,例如,當您雙擊Microsoft Word圖標時,就會啟動運行Word的進程。

線程是進程內的執行路徑。 另外,一個進程可以包含多個線程。

當您啟動Word時,操作系統將創建一個進程並開始執行該進程的主線程。




線程和進程都是操作系統資源分配的原子單位(即有一個描述CPU時間如何分配的並發模型,以及擁有其他操作系統資源的模型)。 有以下不同之處:

  • 共享資源(線程根據定義共享內存,除了堆棧和局部變量外,它們不擁有任何內容;進程也可以共享內存,但是由OS維護的還有一個單獨的機制)
  • 分配空間(進程的內核空間與線程的用戶空間)

上面的Greg Hewgill對於“process”一詞的Erlang含義是正確的, here有一個關於Erlang為什麼可以做輕量級處理的討論。




它們幾乎一樣...但關鍵的區別是線程輕量級,並且在上下文切換,工作負載等方面,進程是重量級的。




  1. 線程在共享內存空間中運行,但進程在單獨的內存空間中運行
  2. 線程是一個輕量級的過程,但一個過程是一個重量級的過程。
  3. 線程是進程的子類型。



處理:

  1. 過程是一個沉重的過程。
  2. 進程是一個單獨的程序,具有獨立的內存,數據,資源等。
  3. 過程使用fork()方法創建。
  4. 進程之間的上下文切換非常耗時。

例:
說,打開任何瀏覽器(Mozilla,Chrome,IE)。 此時新流程將開始執行。

主題:

  1. 線程是輕量級進程。線程捆綁在進程內。
  2. 線程有一個共享內存,數據,資源,文件等
  3. 線程是使用clone()方法創建的。
  4. 線程之間的上下文切換不像Process那麼耗時。

例:
在瀏覽器中打開多個選項卡。




應用程序由一個或多個進程組成。 一個最簡單的過程就是一個執行程序。 一個或多個線程在進程的上下文中運行。 線程是操作系統分配處理器時間的基本單位。 線程可以執行進程代碼的任何部分,包括當前由另一個線程執行的部分。 光纖是必須由應用程序手動調度的執行單元。 光纖在安排它們的線程的上下文中運行。

herehere




過程 :執行中的程序被稱為過程

線程 :線程是基於“one with other”的概念與程序的其他部分一起執行的功能,所以線程是進程的一部分。




嘗試從Linux Kernel的OS View中回答它

一個程序在啟動到內存後就成為一個進程。 一個進程有自己的地址空間,這意味著內存中有不同的段,例如用於存儲編譯代碼的.text segement,用於存儲未初始化的靜態或全局變量的.bss等等。每個進程都有自己的程序計數器和用戶級存儲 。 在內核中,每個進程都有自己的內核堆棧(為了安全問題與用戶空間堆棧分開)和一個名為task_struct的結構,它通常被抽象為進程控制塊,存儲所有關於進程的信息,例如其優先級,狀態,(和其他很多塊)。 一個進程可以有多個執行線程。

來到線程,它們駐留在一個進程中,並共享父進程的地址空間以及線程創建期間可以傳遞的其他資源,例如文件系統資源,共享未決信號,共享數據(變量和指令),從而使線程輕量級,因此允許更快的上下文切換 在內核中,每個線程都有自己的內核堆棧以及定義線程的task_struct結構。 因此內核查看與不同實體相同進程的線程,並且可以自行調度。 同一進程中的線程共享一個稱為線程組ID( tgid )的公共ID,並且它們具有稱為進程ID( pid )的唯一ID。




流程和線程的真實世界示例 這將給您關於線程和流程的基本概念

我從Scott Langham的答案中藉用了上述信息 - 謝謝




  • 每個進程都是一個線程(主線程)。
  • 但是每個線程都不是一個過程。 它是一個過程的一部分(實體)。



首先,我們來看看理論方面。 您需要理解流程在概念上是什麼,才能理解流程和線程之間的差異以及它們之間共享的內容。

我們從2.2.2節Tanenbaum的現代操作系統3e中 的經典線程模型

流程模型基於兩個獨立的概念:資源分組和執行。 有時將它們分開是有用的; 這是線程進入的地方....

他繼續:

查看流程的一種方式是,它可以將相關資源分組在一起。 進程具有包含程序文本和數據的地址空間以及其他資源。 這些資源可能包括打開的文件,子進程,待處理的警報,信號處理程序,會計信息等等。 通過將它們以流程的形式放在一起,可以更輕鬆地進行管理。 過程所具有的另一個概念是執行的線程,通常簡稱為線程。 線程有一個程序計數器,用於跟踪下一個要執行的指令。 它有寄存器,它保存當前的工作變量。 它有一個包含執行歷史的堆棧,每個過程調用一個幀但尚未返回。 雖然線程必須在某個進程中執行,但線程及其進程是不同的概念,可以分別處理。 過程用於將資源組合在一起; 線程是計劃在CPU上執行的實體。

再往下,他提供了下表:

Per process items             | Per thread items
------------------------------|-----------------
Address space                 | Program counter
Global variables              | Registers
Open files                    | Stack
Child processes               | State
Pending alarms                |
Signals and signal handlers   |
Accounting information        |

我們來處理硬件多線程問題。 通常,CPU將支持單個執行線程,通過單個程序計數器和一組寄存器來維護線程的狀態。 但是如果有一個緩存未命中會發生什麼? 從主存儲器獲取數據需要很長時間,而這種情況發生時,CPU只是坐在那裡閒置。 所以有人想到基本上有兩組線程狀態(PC +寄存器),以便另一個線程(可能在同一進程中,也許在另一個進程中)可以在另一個線程在主存儲器上等待時完成工作。 這個概念有多種名稱和實現,例如超線程和同時多線程 (簡稱SMT)。

現在讓我們看看軟件方面。 基本上有三種方法可以在軟件方面實現線程。

  1. 用戶空間線程
  2. 內核線程
  3. 兩者的結合

您需要實現線程的所有功能都是能夠保存CPU狀態並維護多個堆棧,在很多情況下可以在用戶空間中完成。 用戶空間線程的優點是超快速的線程切換,因為您不必陷入內核並能夠按照自己喜歡的方式安排線程。 最大的缺點是無法阻止I / O(阻塞整個進程以及它的所有用戶線程),這是我們首先使用線程的一個重要原因。 在很多情況下,使用線程阻塞I / O大大簡化了程序設計。

內核線程的優點是能夠使用阻塞I / O,除了將所有調度問題留給操作系統。 但是每個線程切換都需要陷入可能相對較慢的內核中。 但是,如果因為I / O阻塞而切換線程,這並不是一個真正的問題,因為I / O操作可能已經將您困在內核中了。

另一種方法是將兩者結合起來,使用多個內核線程,每個線程都有多個用戶線程。

回過頭來看術語問題,你可以看到一個過程和一個執行線程是兩個不同的概念,你選擇使用哪個術語取決於你在說什麼。 關於“輕量級過程”這個術語,我個人並沒有看到它的意義,因為它並沒有真正傳達正在發生的事情以及“執行線程”這個術語。




線程是CPU利用率的基本單位; 它包含線程ID,程序計數器,寄存器組和堆棧。 它與屬於同一進程的其他線程的代碼段,數據段和其他操作系統資源(如打開的文件和信號)共享。 傳統(或重量級)流程具有單一控制線程。 如果一個進程有多個控制線程,它一次可以執行多個任務




Links