1 .內核級線程:切換由內核控制,當線程進行切換的時候,由用戶態轉化為內核態。切換完畢要從內核態返回用戶態;可以很好的利用smp,即利用多核cpu。windows線程就是這樣的。 2. 用戶級線程內核的切換由用戶態程式自己控制內核切換,不需要內核干涉,少了進出內核態的消耗,但不能很好的利用多核Cpu ...
1 .內核級線程:切換由內核控制,當線程進行切換的時候,由用戶態轉化為內核態。切換完畢要從內核態返回用戶態;可以很好的利用smp,即利用多核cpu。windows線程就是這樣的。
2. 用戶級線程內核的切換由用戶態程式自己控制內核切換,不需要內核干涉,少了進出內核態的消耗,但不能很好的利用多核Cpu,目前Linux pthread大體是這麼做的。
線 程的實現可以分為兩類:用戶級線程(User-Level Thread)和內核線線程(Kernel-Level Thread),後者又稱為內核支持的線程或輕量級進程。在多線程操作系統中,各個系統的實現方式並不相同,在有的系統中實現了用戶級線程,有的系統中實 現了內核級線程。
用戶線程指不需要內核支持而在用戶程式中實現的線程,其不依賴於操作系統核心,應 用進程利用線程庫提供創建、同步、調度和管理線程的函數來控制用戶線程。不需要用戶態/核心態切換,速度快,操作系統內核不知道多線程的存在,因此一個線 程阻塞將使得整個進程(包括它的所有線程)阻塞。由於這裡的處理器時間片分配是以進程為基本單位,所以每個線程執行的時間相對減少。
內核線程:由操作系統內核創建和撤銷。內核維護進程及線程的上下文信息以及線程切換。一個內核線程由於I/O操作而阻塞,不會影響其它線程的運行。Windows NT和2000/XP支持內核線程。
用戶線程運行在一個中間系統上面。目 前中間系統實現的方式有兩種,即運行時系統(Runtime System)和內核控制線程。“運行時系統”實質上是用於管理和控制線程的函數集合,包括創建、撤銷、線程的同步和通信的函數以及調度的函數。這些函數 都駐留在用戶空間作為用戶線程和內核之間的介面。用戶線程不能使用系統調用,而是當線程需要系統資源時,將請求傳送給運行時,由後者通過相應的系統調用來 獲取系統資源。內核控制線程:系統在分給進程幾個輕型進程(LWP),LWP可以通過系統調用來獲得內核提供的服務,而進程中的用戶線程可通過復用來關聯 到LWP,從而得到內核的服務。
以下是用戶級線程和內核級線程的區別:
(1)內核支持線程是OS內核可感知的,而用戶級線程是OS內核不可感知的。
(2)用戶級線程的創建、撤消和調度不需要OS內核的支持,是在語言(如Java)這一級處理的;而內核支持線程的創建、撤消和調度都需OS內核提供支持,而且與進程的創建、撤消和調度大體是相同的。
(3)用戶級線程執行系統調用指令時將導致其所屬進程被中斷,而內核支持線程執行系統調用指令時,只導致該線程被中斷。
(4)在只有用戶級線程的系統內,CPU調度還是以進程為單位,處於運行狀態的進程中的多個線程,由用戶程式控制線程的輪換運行;在有內核支持線程的系統內,CPU調度則以線程為單位,由OS的線程調度程式負責線程的調度。
(5)用戶級線程的程式實體是運行在用戶態下的程式,而內核支持線程的程式實體則是可以運行在任何狀態下的程式。
內核線程的優點:
(1)當有多個處理機時,一個進程的多個線程可以同時執行。
缺點:
(1)由內核進行調度。
用戶進程的優點:
(1) 線程的調度不需要內核直接參与,控制簡單。
(2) 可以在不支持線程的操作系統中實現。
(3) 創建和銷毀線程、線程切換代價等線程管理的代價比內核線程少得多。
(4) 允許每個進程定製自己的調度演算法,線程管理比較靈活。
(5) 線程能夠利用的表空間和堆棧空間比內核級線程多。
(6) 同一進程中只能同時有一個線程在運行,如果有一個線程使用了系統調用而阻塞,那麼整個進程都會被掛起。另外,頁面失效也會產生同樣的問題。
缺點:
(1)資源調度按照進程進行,多個處理機下,同一個進程中的線程只能在同一個處理機下分時復用
========================================================================================================
內核線程
內核線程只運行在內核態,不受用戶態上下文的拖累。
- 處理器競爭:可以在全系統範圍內競爭處理器資源;
- 使用資源:唯一使用的資源是內核棧和上下文切換時保持寄存器的空間
- 調度:調度的開銷可能和進程自身差不多昂貴
- 同步效率:資源的同步和數據共用比整個進程的數據同步和共用要低一些。
輕量級進程
輕量級進程(LWP)是建立在內核之上並由內核支持的用戶線程,它是內核線程的高度抽象,每一個輕量級進程都與一個特定的內核線程關聯。內核線程只能由內核管理並像普通進程一樣被調度。
輕量級進程由clone()系統調用創建,參數是CLONE_VM,即與父進程是共用進程地址空間和系統資源。
與普通進程區別:LWP只有一個最小的執行上下文和調度程式所需的統計信息。
- 處理器競爭:因與特定內核線程關聯,因此可以在全系統範圍內競爭處理器資源
- 使用資源:與父進程共用進程地址空間
- 調度:像普通進程一樣調度
用戶線程
用戶線程是完全建立在用戶空間的線程庫,用戶線程的創建、調度、同步和銷毀全又庫函數在用戶空間完成,不需要內核的幫助。因此這種線程是極其低消耗和高效的。
- 處理器競爭:單純的用戶線程是建立在用戶空間,其對內核是透明的,因此其所屬進程單獨參與處理器的競爭,而進程的所有線程參與競爭該進程的資源。
- 使用資源:與所屬進程共用進程地址空間和系統資源。
- 調度:由在用戶空間實現的線程庫,在所屬進程內進行調度
Linux使用的線程庫
LinuxThreads是用戶空間的線程庫,所採用的是線程-進程1對1模型(即一個 用戶線程對應一個輕量級進程,而一個輕量級進程對應一個特定 的內核線程),將線程的調度等同於進程的調度,調度交由內核完成,而線程的創建、同步、銷毀由核外線程庫完成(LinuxThtreads已綁定到 GLIBC中發行)。
在LinuxThreads中,由專門的一個管理線程處理所有的線程管理工作。當進程第 一次調用pthread_create()創建線程時就會先 創建(clone())並啟動管理線程。後續進程pthread_create()創建線程時,都是管理線程作為pthread_create()的調用 者的子線程,通過調用clone()來創建用戶線程,並記錄輕量級進程號和線程id的映射關係,因此,用戶線程其實是管理線程的子線程。
LinuxThreads只支持調度範圍為PTHREAD_SCOPE_SYSTEM的調度,預設的調度策略是SCHED_OTHER。
用戶線程調度策略也可修改成SCHED_FIFO或SCHED_RR方式,這兩種方式支持優先順序為0-99,而SCHED_OTHER只支持0。
- SCHED_OTHER 分時調度策略,
- SCHED_FIFO 實時調度策略,先到先服務
- SCHED_RR 實時調度策略,時間片輪轉
SCHED_OTHER是普通進程的,後兩個是實時進程的(一般的進程都是普通進程,系 統中出現實時進程的機會很少)。SCHED_FIFO、 SCHED_RR優先順序高於所有SCHED_OTHER的進程,所以只要他們能夠運行,在他們運行完之前,所有SCHED_OTHER的進程的都沒有得到 執行的機會。