根據操作系統內核是否對線程可感知,可以把線程分為內核線程和用戶線程。
內核線程建立和銷毀都是由操作系統負責、通過系統調用完成的,操作系統在調度時,參考各進程內的線程運行情況做出調度決定,如果一個進程中沒有就緒態的線程,那么這個進程也不會被調度占用CPU。
和內核線程相對應的是用戶線程,用戶線程指不需要內核支持而在用戶程序中實現的線程,其不依賴於操作系統核心,用戶進程利用線程庫提供創建、同步、調度和管理線程的函數來控制用戶線程。用戶線程多見於一些歷史悠久的操作系統,例如Unix操作系統,不需要用戶態/核心態切換,速度快,操作系統內核不知道多線程的存在,因此一個線程阻塞將使得整個進程(包括它的所有線程)阻塞。由於這里的處理器時間片分配是以進程為基本單位,所以每個線程執行的時間相對減少為了在操作系統中加入線程支持,采用了在用戶空間增加運行庫來實現線程,這些運行庫被稱為“線程包”,用戶線程是不能被操作系統所感知的。
引入用戶線程,具體而言,有以下四個方面的優勢:
(1)可以在不支持線程的操作系統中實現。
(2)創建和銷毀線程、線程切換代價等線程管理的代價比內核線程少得多。
(3)允許每個進程定制自己的調度算法,線程管理比較靈活。
(4)線程能夠利用的表空間和堆棧空間比內核級線程多。
用戶線程的缺點主要有以下兩點:
(1)同一進程中只能同時有一個線程在運行,如果有一個線程使用了系統調用而阻塞,那么整個進程都會被掛起。
(2)頁面失效也會產生類似的問題。
內核線程的優缺點剛好跟用戶線程相反。實際上,操作系統可以使用混合的方式來實現線程。