1. 程式人生 > >線程及與進程的對比

線程及與進程的對比

減少 可見 博文 單位 多個 質量 分發 .com 之間

一、為什麽要引入線程

  進程是為了提高CPU的執行效率,減少因程序等待帶來的CPU空轉以及其他計算機軟硬件資源而提出來的。進程是一個資源擁有者,因而在進程的創建、撤消和切換中,系統必須為之付出較大的時空開銷。也正因為如此,在系統中所設置的進程數目不宜過多,進程切換的頻率也不宜太高,但這也就限制了並發程度的進一步提高。如何能使多個程序更好地並發執行,同時又盡量減少系統的開銷,已成為近年來設計操作系統時所追求的重要目標。於是,有不少操作系統的學者們想到,可否將進 程的上述屬性分開,由操作系統分開來進行處理。即對作為調度和分派的基本單位,不同時作為獨立分配資源的單位,以使之輕裝運行;而對擁有資源的基本單位, 又不頻繁地對之進行切換。正是在這種思想的指導下,產生了線程概念。即,為了減少進程切換和創建的開銷,提高執行效率和節省資源

,人們在開始操作系統中引入“線程”(thread)的概念。

二、線程

1、線程的基本概念

線程是進程的一部分,有時候也被稱為輕量級進程(light weight process)。線程是進程中執行運算的最小單位,亦即執行處理機調度的基本單位。如果把進程理解為在邏輯上操作系統所完成的任務,那麽線程表示完成該任務的許多可能的子任務之一。

2、引入線程的好處

(1)易於調度。

(2)提高並發性。通過線程可方便有效地實現並發性。進程可創建多個線程來執行同一程序的不同部分。

(3)開銷少。創建線程比創建進程要快,所需開銷很少。。

(4)利於充分發揮多處理器的功能。通過創建多線程進程(即一個進程可具有兩個或更多個線程),每個線程在一個處理器上運行,從而實現應用程序的並發性,使每個處理器都得到充分運行。

3、線程的適用範圍

線程可以有效地提高系統的執行效率,但並不是在所有計算機系統中都是適用的,如某些很少做進程調度和切換的實時系統。使用線程的最大好處是有多個任務需要處理機處理時,可以減少處理機的切換時間;而且,線程的創建和結束所需要的系統開銷也比進程的創建和結束要小得多。最適用使用線程的系統是多處理機系統、網絡系統或分布式系統。

4、線程分類與執行

線程的兩個基本類型是用戶級線程和內核級線程(系統級線程)。

1、用戶級線程

用戶級線程的管理過程全部由用戶程序完成,為了對用戶級線程進行管理,操作系統提供一個在用戶空間執行的線程庫。該線程庫提供創建、調度和撤銷線程功能。同時,該線程庫也提供線程見的通信、線程的執行以及存儲線程上下文的功能。用戶級線程只使用用戶堆棧和分配給所屬進程的用戶寄存器。

(1)用戶級線程的調度算法和調度過程全部由用戶自行選擇和確定,與操作系統內核無關。

(2)用戶級線程的調度算法只進行線程上下文切換而不進行處理機切換。

(3)因,用戶級線程的上下文切換和內核無關,所以可能出現,盡管相關進程的狀態是阻塞的或等待的,但所屬線程的狀態卻是執行的

2、內核級線程

由操作形同內核進行管理。操作系統內核給應用程序提供相應地系統調用和應用程序接口,以使用戶可以創建、執行和撤銷線程。操作系統內核既負責進程的調度,也負責進程內不同線程的調度,故,內核級線程不會出現進程出於阻塞或等待狀態,而線程處於執行狀態的情況。

系統開銷:用戶級線程<內核級進程<進程

3、執行

線程有3個基本狀態:執行、就緒和阻塞。有五種基本操作:派生、阻塞、激活、調度和結束。

三、進程與線程

1、進程和線程的關系

(1)一個線程只能屬於一個進程,而一個進程可以有多個線程。線程是操作系統可識別的最小執行和調度單位。一個沒有線程的進程可以被看作是單線程。

(2)資源分配給進程,同一進程的所有線程共享該進程的所有資源。

2、線程與進程的區別

(1)線程的改變只代表了CPU執行過程的改變,而進程所擁有的資源都沒有發生改變。或者說,除了CPU之外,計算機內的軟硬件資源的分配與線程無關,線程只能共享它所屬進程的資源。

(2)與進程控制表和 PCB 相似,每個線程也有自己的線程控制表 TCB ,而這個 TCB 中所保存的線程狀態信息則要比 PCB 表少得多,這些信息主要是相關指針用堆棧(系統棧和用戶棧),寄存器中的狀態數據。

(3)進程擁有一個完整的虛擬地址空間,不依賴於線程而獨立存在;反之,線程是進程的一部分,沒有自己的地址空間,與進程內的其他線程一起共享分配給該進程的所有資源。

3、線程與進程對比(來自L_free的博文進程與線程的區別和聯系)

我們從調度、並發性、 系統開銷、擁有資源等方面,來比較線程與進程。

1.調度

在傳統的操作系統中,擁有資源的基本單位和獨立調度、分派的基本單位都是進程。而在引入線程的操作系統中,則把線程作為調度和分派的基本單位。而把進程作 為資源擁有的基本單位,使傳統進程的兩個屬性分開,線程便能輕裝運行,從而可顯著地提高系統的並發程度。在同一進程中,線程的切換不會引起進程的切換,在 由一個進程中的線程切換到另一個進程中的線程時,將會引起進程的切換。

2.並發性

在引入線程的操作系統中,不僅進程之間可以並發執行,而且在一個進程中的多個線程之間,亦可並發執行,因而使操作系統具有更好的並發性,從而能更有效地使 用系統資源和提高系統吞吐量。例如,在一個未引入線程的單CPU操作系統中,若僅設置一個文件服務進程,當它由於某種原因而被阻塞時,便沒有其它的文件服 務進程來提供服務。在引入了線程的操作系統中,可以在一個文件服務進程中,設置多個服務線程,當第一個線程等待時,文件服務進程中的第二個線程可以繼續運 行;當第二個線程阻塞時,第三個線程可以繼續執行,從而顯著地提高了文件服務的質量以及系統吞吐量。

3.擁有資源

不論是傳統的操作系統,還是設有線程的操作系統,進程都是擁有資源的一個獨立單位,它可以擁有自己的資源。一般地說,線程自己不擁有系統資源(也有一點必 不可少的資源),但它可以訪問其隸屬進程的資源。亦即,一個進程的代碼段、數據段以及系統資源,如已打開的文件、I/O設備等,可供問一進程的其它所有線 程共享。

4.系統開銷

由於在創建或撤消進程時,系統都要為之分配或回收資源,如內存空間、I/o設備等。因此,操作系統所付出的開銷將顯著地大於在創建或撤消線程時的開銷。類 似地,在進行進程切換時,涉及到整個當前進程CPU環境的保存以及新被調度運行的進程的CPU環境的設置。而線程切換只須保存和設置少量寄存器的內容,並 不涉及存儲器管理方面的操作。可見,進程切換的開銷也遠大於線程切換的開銷。此外,由於同一進程中的多個線程具有相同的地址空間,致使它們之間的同步和通信的實現,也變得比較容易。在有的系統中,線程的切換、同步和通信都無須

另外,

Linux下,從函數調用上來說,進程創建使用fork()操作;線程創建使用clone()操作。

Ref:

進程與線程的區別和聯系

應屆生經典面試題:說說進程與線程的區別與聯系

張堯學老師編著《計算機操作系統教程(第4版)》

線程及與進程的對比