實現線程主要有三種方式:使用內核線程實現,使用用戶線程實現和使用用戶線程加輕量級進程混合實現。
使用內核線程實現
內核線程(KLT,Kernel-Level Thread),直接由操作系統內核(Kernel,即內核)支持的線程。由內核來完成線程切換,內核通過操縱調度器(Scheduler)對線程進行調度,並負責將線程的任務映射到各個處理器上。每個內核線程可以視為內核的一個分身,這樣操作系統就有能力同時處理多件事情,支持多線程的內核叫做多線程內核。
程序一般不會去直接使用內核線程,而是去使用內核線程的一種高級接口——輕量級進程(LWP),即通常意義上的線程*。由於每個輕量級進程都由一個內核線程支持,因此只有先支持內核線程,才能有輕量級進程。*輕量級進程與內核線程之間1:1關系稱為一對一的線程模型。
內核線程保證了每個輕量級進程都成為一個獨立的調度單元,即時有一個輕量級進程在系統調用中阻塞了,也不會影響整個進程的繼續工作。
局限:基於內核線程實現,因此各線程操作等需要系統調用,系統調用代價高,需要在用戶態和內核態來回切換,其次,每個輕量級進程都需要一個內核線程的支持,因此輕量級進程要消耗一定的內核資源,如內核線程的棧空間,因此一個系統支持輕量級進程的數量是有限的。
使用用戶線程實現
廣義上,內核線程以外,就是用戶線程。輕量級也算用戶線程,但輕量級進程的實現始終是建立在內核上的,許多操作都要進行系統調度,效率會受到限制。
狹義上,用戶線程指完全建立在用戶空間的線程庫上。這種線程不需要切換內核態,效率非常高且低消耗,也可以支持規模更大的線程數量,部分高性能數據庫中的多線程就是由用戶線程實現的。這種進程與用戶線程之間1:N的關系稱為一對多的線程模型。
用戶線程優勢在於不需要系統內核支援,劣勢也在於沒有系統內核的支援,所有的線程操作都是需要用戶程序自己處理。阻塞處理等問題的解決十分困難,甚至不可能完成。所以使用用戶線程會非常復雜。
用戶線程加輕量級進程混合實現
內核線程與用戶線程混合使用。可以使用內核提供的線程調度功能及處理器映射,並且用戶線程的系統調用要通過輕量級線程來完成,大大降低整個進程被完全阻塞的風險。用戶線程與輕量級進程比例是N:M。
Java線程的實現
JDK1.2之前,綠色線程——用戶線程。JDK1.2——基於操作系統原生線程模型來實現。Sun JDK,它的Windows版本和Linux版本都使用一對一的線程模型實現,一條Java線程就映射到一條輕量級進程之中。
Solaris同時支持一對一和多對多。