用戶級線程和內核級線程的區別

1 .內核級線程:切換由內核控制,當線程進行切換的時候,由用戶態轉化爲內核態。切換完畢要從內核態返回用戶態;可以很好的利用smp,即利用多核cpu。windows線程就是這樣的。

  1. 用戶級線程內核的切換由用戶態程序自己控制內核切換,不需要內核干涉,少了進出內核態的消耗,但不能很好的利用多核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) 同一進程中只能同時有一個線程在運行,如果有一個線程使用了系統調用而阻塞,那麼整個進程都會被掛起。(why 用戶級線程阻塞是會影響整個進程)另外,頁面失效也會產生同樣的問題。

缺點:

(1)資源調度按照進程進行,多個處理機下,同一個進程中的線程只重點內容能在同一個處理機下分時複用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章