線程可分爲用戶級線程(User Thread)和內核級線程(Kernel Thread),後者又稱爲內核支持的線程或輕量級進程。在多線程操做系統中,各個系統的實現方式並不相同,在有的系統中實現了用戶級線程,有的系統中實現了內核級線程。程序員
用戶線程:不須要內核支持而在用戶程序中實現的線程,其不依賴於操做系統核心,應用進程利用線程庫提供建立、同步、調度和管理線程的函數來控制用戶線程。不須要用戶態/核心態切換,速度快,操做系統內核不知道多線程的存在,所以一個線程阻塞將使得整個進程(包括它的全部線程)阻塞。因爲這裏的處理器時間片分配是以進程爲基本單位,因此每一個線程執行的時間相對減小。算法
內核線程:由操做系統內核建立和撤銷。內核維護進程及線程的上下文信息以及線程切換。一個內核線程因爲I/O操做而阻塞,不會影響其它線程的運行。Windows NT和2000/XP支持內核線程。多線程
用戶線程運行在一箇中間系統上面。目前中間系統實現的方式有兩種,即運行時系統(Runtime System)和內核控制線程。「運行時系統」實質上是用於管理和控制線程的函數集合,包括建立、撤銷、線程的同步和通訊的函數以及調度的函數。這些函數都駐留在用戶空間做爲用戶線程和內核之間的接口。用戶線程不能使用系統調用,而是當線程須要系統資源時,將請求傳送給運行時,由後者經過相應的系統調用來獲取系統資源。內核控制線程:系統在分給進程幾個輕型進程(LWP),LWP能夠經過系統調用來得到內核提供的服務,而進程中的用戶線程可經過複用來關聯到LWP,從而獲得內核的服務。併發
如下是用戶級線程和內核級線程的區別:函數
(1) 內核支持線程是OS內核可感知的,而用戶級線程是OS內核不可感知的。操作系統
(2) 用戶級線程的建立、撤消和調度不須要OS內核的支持,是在語言(如Java)這一級處理的;而內核支持線程的建立、撤消和調度都需OS內核提供支持,並且與進程的建立、撤消和調度大致是相同的。線程
(3) 用戶級線程執行系統調用指令時將致使其所屬進程被中斷,而內核支持線程執行系統調用指令時,只致使該線程被中斷。blog
(4) 在只有用戶級線程的系統內,CPU調度仍是以進程爲單位,處於運行狀態的進程中的多個線程,由用戶程序控制線程的輪換運行;在有內核支持線程的系統內,CPU調度則以線程爲單位,由OS的線程調度程序負責線程的調度。接口
(5) 用戶級線程的程序實體是運行在用戶態下的程序,而內核支持線程的程序。實體則是能夠運行在任何狀態下的程序。進程
內核線程的優勢:當有多個處理機時,一個進程的多個線程能夠同時執行。
內核線程的缺點:由內核進行調度。
用戶級線程的優勢:
(1) 線程的調度不須要內核直接參與,控制簡單。
(2) 能夠在不支持線程的操做系統中實現。
(3) 建立和銷燬線程、線程切換代價等線程管理的代價比內核線程少得多。
(4) 容許每一個進程定製本身的調度算法,線程管理比較靈活。這就是必須本身寫管理程序,與內核線程的區別
(5) 線程可以利用的表空間和堆棧空間比內核級線程多。
(6) 同一進程中只能同時有一個線程在運行,若是有一個線程使用了系統調用而阻塞,那麼整個進程都會被掛起。另外,頁面失效也會產生一樣的問題。
用戶級線程的缺點:資源調度按照進程進行,多個處理機下,同一個進程中的線程只能在同一個處理機下分時複用
注:以上轉載於:http://col1.blog.163.com/blog/static/1909775192012719114033352/
用戶實際使用的線程不是內核線程,而是存在於用戶態的用戶線程。用戶態線程並不必定在操做系統內核裏對應同等數量的內核線程。
一對一模型
一個用戶使用的線程惟一對應一個內核使用的線程(反之否則,一個內核裏的線程在用戶態不必定有對應的線程存在)。
優勢:線程之間的併發是真正的併發,一個線程由於某種緣由阻塞時,其餘線程不會受到影響。Linux使用clone能夠產生一對一線程。Windows使用APICreateThread來建立一個一對一的線程。
缺點:
1)因爲許多操做系統限制了內核線程的數量,所以一對一線程會讓用戶的線程數量受到限制;
2)許多操做系統內核線程調度時,上下文切換的開銷較大,致使用戶線程的執行效率降低
多對一模型
多對一模型將多個用戶級線程映射到一個內核線程上,線程之間的切換由用戶態的代碼來完成。
多對一模型的一大缺點是:若是其中一個用戶線程阻塞,那麼全部用戶線程豆漿沒法執行,由於此時內核內的線程也將隨之阻塞了。
多對多模型
將多個用戶線程用射到少數但不止一個的內核線程上。