linux中用戶線程、內核線程、輕量級進程的區別

原文鏈接:http://www.cnitblog.com/tarius.wu/articles/2277.html

內核線程

內核線程就是內核的分身,一個分身可以處理一件特定事情。這在處理異步事件如異步IO時特別有用。內核線程的使用是廉價的,唯一使用的資源就是內核棧和上下文切換時保存寄存器的空間。支持多線程的內核叫做多線程內核(Multi-Threads kernel )。

輕量級進程(LWP)

輕量級線程(LWP)是一種由內核支持的用戶線程。它是基於內核線程的高級抽象,因此只有先支持內核線程,纔能有LWP。每一個進程有一個或多個LWP,每個LWP由一個內核線程支持(這種模型實際上就是一對一線程模型)。在這種實現的操作系統中,LWP就是用戶線程。

由於每個LWP都與一個特定的內核線程關聯,因此每個LWP都是一個獨立的線程調度單元。即使有一個LWP在系統調用中阻塞,也不會影響整個進程的執行。

輕量級進程具有侷限性。首先,大多數LWP的操作,如建立、析構以及同步,都需要進行系統調用。系統調用的代價相對較高:需要在用戶態和內核態中切換。其次,每個LWP都需要有一個內核線程支持,因此LWP要消耗內核資源(內核線程的棧空間)。因此一個系統不能支持大量的LWP。

將之稱爲輕量級進程的原因可能是:在內核線程的支持下,LWP是獨立的調度單元,就像普通的進程一樣。所以LWP的最大特點還是每個LWP都有一個內核線程支持。

備註:
(1)K:kernel Thread,操作系統內核線程
(2)P:Process

用戶級線程

LWP雖然本質上屬於用戶線程,但LWP線程庫是建立在內核之上的,LWP的許多操作都要進行系統調用,因此效率不高。而這裏的用戶線程指的是完全建立在用戶空間的線程庫,用戶線程的建立,同步,銷燬,調度完全在用戶空間完成,不需要內核的幫助。因此這種線程的操作是極其快速的且低消耗的。

不需要內核支持而在用戶程序中實現的線程,不依賴於操作系統核心。應用進程利用線程庫提供的創建、同步、調度和管理線程的函數控制用戶線程。不需要用戶態/內核態的切換,速度快,操作系統內核不知道多線程的存在,因此一個線程的阻塞將使得整個進程(包括它的所有線程)阻塞。由於這裏的cpu時間片分配是以進程爲基本單位的,所以每個線程執行的時間相對減少。

加強版的用戶線程—用戶線程+LWP

這種屬於多對多模型。用戶線程庫還是完全建立在用戶空間中,因此用戶線程的操作還是很廉價,因此可以建立任意多個需要的用戶線程。操作系統提供了LWP作爲用戶線程和內核線程之間的橋樑。LWP還是和前面提到的一樣,具有內核線程支持,是內核的調度單元,並且用戶線程的系統調用要通過LWP,因此進程中某個用戶線程的阻塞不會影響整個進程的執行。用戶線程庫將建立的用戶線程關聯到LWP上,LWP與用戶線程的數量不一定一致。當內核調度到某個LWP上時,此時與該LWP關聯的用戶線程就被執行。

很多文獻中都認爲輕量級進程就是線程,實際上這種說法並不完全正確,只有在用戶線程完全由輕量級進程構成時,纔可以說輕量級進程就是線程。

 

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

1.內核支持的線程是內核可感知的,而用戶級線程是內核無感知的。

2.用戶級線程的創建、撤銷、調度不需要內核支持,在語言層(如java)處理,而內核線程的創建、撤銷、調度需要內核支持。

3.用戶級線程的程序實體運行在用戶態下的程序中,而內核級線程的程序實體可以運行在任何形態下的線程。

 

 

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