【好文轉發---linux 用戶線程、LWP、內核線程學習筆記】html
在現代操做系統中,進程支持多線程。進程是資源管理的最小單元;而線程是程序執行的最小單元。一個進程的組成實體能夠分爲兩大部分:線程集合資源集。進程中的線程是動態的對象;表明了進程指令的執行。資源,包括地址空間、打開的文件、用戶信息等等,由進程內的線程共享。 線程有本身的私有數據:程序計數器,棧空間以及寄存器。 Why Thread?(傳統單線程進程的缺點) 1. 現實中有不少須要併發處理的任務,如數據庫的服務器端、網絡服務器、大容量計算等。 2. 傳統的UNIX進程是單線程的,單線程意味着程序必須是順序執行,不能併發;既在一個時刻只能運行在一個處理器上,所以不能充分利用多處理器框架的計算機。 3. 若是採用多進程的方法,則有以下問題: a. fork一個子進程的消耗是很大的,fork是一個昂貴的系統調用,即便使用現代的寫時複製(copy-on-write)技術。 b. 各個進程擁有本身獨立的地址空間,進程間的協做須要複雜的IPC技術,如消息傳遞和共享內存等。 多線程的優缺點 多線程的優勢和缺點其實是對立統一的。 支持多線程的程序(進程)能夠取得真正的並行(parallelism),且因爲共享進程的代碼和全局數據,故線程間的通訊是方便的。它的缺點也是因爲線程共享進程的地址空間,所以可能會致使競爭,所以對某一塊有多個線程要訪問的數據須要一些同步技術。 三種線程——內核線程、輕量級進程、用戶線程 內核線程 內核線程就是內核的分身,一個分身能夠處理一件特定事情。這在處理異步事件如異步IO時特別有用。內核線程的使用是廉價的,惟一使用的資源就是內核棧和上下文切換時保存寄存器的空間。支持多線程的內核叫作多線程內核(Multi-Threads kernel )。 輕量級進程[*] 輕量級線程(LWP)是一種由內核支持的用戶線程。它是基於內核線程的高級抽象,所以只有先支持內核線程,纔能有LWP。每個進程有一個或多個LWPs,每一個LWP由一個內核線程支持。這種模型實際上就是恐龍書上所提到的一對一線程模型。在這種實現的操做系統中,LWP就是用戶線程。 因爲每一個LWP都與一個特定的內核線程關聯,所以每一個LWP都是一個獨立的線程調度單元。即便有一個LWP在系統調用中阻塞,也不會影響整個進程的執行。 輕量級進程具備侷限性。首先,大多數LWP的操做,如創建、析構以及同步,都須要進行系統調用。系統調用的代價相對較高:須要在user mode和kernel mode中切換。其次,每一個LWP都須要有一個內核線程支持,所以LWP要消耗內核資源(內核線程的棧空間)。所以一個系統不能支持大量的LWP。 LWP.JPG 注: 1. LWP的術語是借自於SVR4/MP和Solaris 2.x。 2. 有些系統將LWP稱爲虛擬處理器。 3. 將之稱爲輕量級進程的緣由多是:在內核線程的支持下,LWP是獨立的調度單元,就像普通的進程同樣。因此LWP的最大特色仍是每一個LWP都有一個內核線程支持。 用戶線程 LWP雖然本質上屬於用戶線程,但LWP線程庫是創建在內核之上的,LWP的許多操做都要進行系統調用,所以效率不高。而這裏的用戶線程指的是徹底創建在用戶空間的線程庫,用戶線程的創建,同步,銷燬,調度徹底在用戶空間完成,不須要內核的幫助。所以這種線程的操做是極其快速的且低消耗的。 Uthread1.JPG 上圖是最初的一個用戶線程模型,從中能夠看出,進程中包含線程,用戶線程在用戶空間中實現,內核並無直接對用戶線程進程調度,內核的調度對象和傳統進程同樣,仍是進程自己,內核並不知道用戶線程的存在。用戶線程之間的調度由在用戶空間實現的線程庫實現。 這種模型對應着恐龍書中提到的多對一線程模型,其缺點是一個用戶線程若是阻塞在系統調用中,則整個進程都將會阻塞。 增強版的用戶線程——用戶線程+LWP 這種模型對應着恐龍書中多對多模型。用戶線程庫仍是徹底創建在用戶空間中,所以用戶線程的操做仍是很廉價,所以能夠創建任意多須要的用戶線程。操做系統提供了LWP做爲用戶線程和內核線程之間的橋樑。LWP仍是和前面提到的同樣,具備內核線程支持,是內核的調度單元,而且用戶線程的系統調用要經過LWP,所以進程中某個用戶線程的阻塞不會影響整個進程的執行。用戶線程庫將創建的用戶線程關聯到LWP上,LWP與用戶線程的數量不必定一致。當內核調度到某個LWP上時,此時與該LWP關聯的用戶線程就被執行。 Uthread2.JPG 小結: 不少文獻中都認爲輕量級進程就是線程,實際上這種說法並不徹底正確,從前面的分析中能夠看到,只有在用戶線程徹底由輕量級進程構成時,才能夠說輕量級進程就是線程。linux
原文地址:http://www.cnitblog.com/tarius.wu/articles/2277.html數據庫