天天看點

使用者線程和核心線程

1.核心級線程:切換由核心控制,當線程進行切換的時候,由使用者态轉化為核心态。切換完畢要從核心态傳回使用者态;可以很好的利用smp,即利用多核cpu。windows線程就是這樣的。使用者态轉化為核心态的時候需要進行上下文的切換,是耗時的操作,因為有寄存器值的儲存裝載,記憶體緩存的失效和載入,中斷程式的執行等。

2. 使用者級線程核心的切換由使用者态程式自己控制核心切換,不需要核心幹涉,少了進出核心态的消耗,但不能很好的利用多核Cpu,目前Linux pthread大體是這麼做的。

線程的實作可以分為兩類:使用者級線程(User-Level Thread)和核心線線程(Kernel-Level Thread),後者又稱為核心支援的線程或輕量級程序。在多線程作業系統中,各個系統的實作方式并不相同,在有的系統中實作了使用者級線程,有的系統中實作了核心級線程。

使用者線程指不需要核心支援而在使用者程式中實作的線程,其不依賴于作業系統核心,也就是不需要進行系統調用。應用程序利用線程庫提供建立、同步、排程和管理線程的函數來控制使用者線程。不需要使用者态/核心态切換,速度快,作業系統核心不知道多線程的存在,是以一個線程阻塞将使得整個程序(包括它的所有線程)阻塞,線程不存在時間片引起的中斷,是以讓出CPU全靠自覺。由于這裡的處理器時間片配置設定是以程序為基本機關,是以每個線程執行的時間相對減少。

核心線程:由作業系統核心建立和撤銷。核心維護程序及線程的上下文資訊以及線程切換。一個核心線程由于I/O操作而阻塞,不會影響其它線程的運作。Windows NT和2000/XP支援核心線程。

使用者線程運作在一個中間系統上面。目前中間系統實作的方式有兩種,即運作時系統(Runtime System)和核心控制線程。“運作時系統”實質上是用于管理和控制線程的函數集合,包括建立、撤銷、線程的同步和通信的函數以及排程的函數。這些函數都駐留在使用者空間作為使用者線程和核心之間的接口。使用者線程不能使用系統調用,而是當線程需要系統資源時,将請求傳送給運作時,由後者通過相應的系統調用來擷取系統資源。核心控制線程:系統在分給程序幾個輕型程序(LWP),LWP可以通過系統調用來獲得核心提供的服務,而程序中的使用者線程可通過複用來關聯到LWP,進而得到核心的服務。

以下是使用者級線程和核心級線程的差別:

(1)核心支援線程是OS核心可感覺的,而使用者級線程是OS核心不可感覺的。

(2)使用者級線程的建立、撤消和排程不需要OS核心的支援,是在語言(如Java)這一級處理的;而核心支援線程的建立、撤消和排程都需OS核心提供支援,而且與程序的建立、撤消和排程大體是相同的。

(3)使用者級線程執行系統調用指令時将導緻其所屬程序被中斷,而核心支援線程執行系統調用指令時,隻導緻該線程被中斷。

(4)在隻有使用者級線程的系統内,CPU排程還是以程序為機關,處于運作狀态的程序中的多個線程,由使用者程式控制線程的輪換運作;在有核心支援線程的系統内,CPU排程則以線程為機關,由OS的線程排程程式負責線程的排程。

(5)使用者級線程的程式實體是運作在使用者态下的程式,而核心支援線程的程式實體則是可以運作在任何狀态下的程式。

核心線程的優點:

(1)當有多個處理機時,一個程序的多個線程可以同時執行。

缺點:

(1)由核心進行排程。

使用者程序的優點:

(1) 線程的排程不需要核心直接參與,控制簡單。

(2) 可以在不支援線程的作業系統中實作。

(3) 建立和銷毀線程、線程切換代價等線程管理的代價比核心線程少得多。

(4) 允許每個程序定制自己的排程算法,線程管理比較靈活。這就是必須自己寫管理程式,與核心線程的差別

(5) 線程能夠利用的表空間和堆棧空間比核心級線程多。

(6) 同一程序中隻能同時有一個線程在運作,如果有一個線程使用了系統調用而阻塞,那麼整個程序都會被挂起。另外,頁面失效也會産生同樣的問題。

缺點:

(1)資源排程按照程序進行,多個處理機下,同一個程序中的線程隻能在同一個處理機下分時複用

繼續閱讀