Linux用戶級線程和內核級線程區別
線程的實現可以分為兩類:用戶級線程和內核級線程。
在用戶級線程中,有關線程管理的所有工作都由應用程序完成,內核意識不到線程的存在。應用程序可以通過使用線程庫設計成多線程程序。
在內核級線程中,線程管理的所有工作都由內核完成,應用程序沒有進行線程管理的代碼,只有一個到內核級線程的編程接口。內核為進程及內部的每個線程維護上下文信息,調度也在內核基於線程架構的基礎上完成。
- 區別
- 內核級線程:
(1)線程的創建、撤銷和切換等,都需要內核直接實現,即內核了解每一個作為可調度實體的線程。
(2)這些線程可以在全系統內進行資源的競爭。
(3)內核空間內為每一個內核支持線程設置了一個線程控制塊(TCB),內核根據該控制塊,感知線程的存在,並進行控制。
在一定程度上類似於進程,只是創建、調度的開銷要比進程小。有的統計是1:10
- 用戶級線程:
(1)用戶級線程僅存在於用戶空間。
(2)內核並不能看到用戶線程。
(3)內核資源的分配仍然是按照進程進行分配的;各個用戶線程只能在進程內進行資源競爭。
- 多線程模型:
1、多對一模型
將多個用戶級線程映射到一個內核級線程,線程管理在用戶空間完成。用戶級線程對操作系統不可見(透明)。
優點:線程管理是在用戶空間進行的,因而效率比較高
缺點:一個線程在使用內核服務時被阻塞,整個進程都會被阻塞。
2、一對一模型
將每個用戶級線程映射到一個內核級線程。
優點:當一個線程被阻塞時,允許另一個線程繼續運行,並發能力強。
缺點:每創建一個用戶級線程都需要創建一個內核級線程與其對應,這樣創建線程的開銷比較大,會影響到應用程序的性能。
3、多對多模型
將n個用戶級線程映射到m個內核級線程上,要求m<=n;
特點:前兩者的折中。