1. 程式人生 > >使用者級執行緒與核心級執行緒

使用者級執行緒與核心級執行緒

1、使用者級執行緒 把整個執行緒實現部分放在使用者空間中,核心對執行緒一無所知,核心看到的就是一個單執行緒程序。 只有一個使用者棧
優點: 1)整個使用者級執行緒的切換髮生在使用者空間,這樣的執行緒切換至少比陷入核心要快一個數量級(不需要陷入核心、不需要上下文切換、不需要對記憶體快取記憶體進行重新整理,這就使得執行緒排程非常快捷) 2)使用者級執行緒有比較好的可擴充套件性,執行緒能夠利用的表空間和堆疊空間比核心級執行緒多,這是因為在核心空間中核心執行緒需要一些固定的表格空間和堆疊空間,如果核心執行緒的數量非常大,就會出現問題。
3)可以在不支援執行緒的作業系統中實現。 4)建立和銷燬執行緒、執行緒切換代價等執行緒管理的代價比核心執行緒少得多, 因為儲存執行緒狀態的過程和呼叫程式都只是本地過程 5)允許每個程序定製自己的排程演算法,執行緒管理比較靈活。這就是必須自己寫管理程式,與核心執行緒的區別 6)執行緒的排程不需要核心直接參與,控制簡單。 缺點: 1)一個執行緒阻塞,會阻塞該程序中其他所有的執行緒(具體,舉個例子) 比如:執行緒發生I/O或頁面故障引起的阻塞時,如果呼叫阻塞系統呼叫則核心由於不知道有多執行緒的存在,而會阻塞整個程序從而阻塞所有執行緒
頁面失效也會產生類似的問題。 2)如果一個執行緒開始執行,那麼該程序中其他執行緒就不能執行,除非第一個執行緒自動放棄CPU。因為在一個單獨的程序內部,沒有時鐘中斷,所以不能用輪轉排程(輪流)的方式排程執行緒 2、核心級執行緒 在核心中有一個用來記錄系統中所有執行緒的執行緒表(TCB,程序表PCB),當某個執行緒希望建立一個新執行緒或撤銷一個已有執行緒時,它進行一個系統呼叫,這個系統呼叫通過對執行緒表的更新完成執行緒的建立或撤銷工作。 一個使用者棧,一個核心棧,分別儲存在使用者空間和核心空間,TCB切換髮生在核心空間,TCB切換會造成這兩個棧的切換

優點: 1)當一個執行緒阻塞時,核心根據選擇,可以運行同一個程序或其他程序 缺點: 1)在核心中建立和撤銷執行緒的開銷比較大,速度慢 3、使用者級、核心級執行緒相結合:

在一些系統中,使用組合方式的多執行緒實現, 執行緒建立完全在使用者空間中完成,執行緒的排程和同步也在應用程式中進行. 一個應用程式中的多個使用者級執行緒被對映到一些(小於或等於使用者級執行緒的數目)核心級執行緒上。

下圖說明了使用者級與核心級的組合實現方式, 在這種模型中,每個核心級執行緒有一個可以輪流使用的使用者級執行緒集合

平時我們使用的pthread執行緒庫就是一個組合方式的多執行緒


4、使用者級、核心級執行緒優缺點、區別: 1)核心支援執行緒是 OS 核心可感知的,而使用者級執行緒是 OS 核心不可感知的。 2) 使用者級執行緒的建立、撤消和排程不需要 OS 核心的支援,是在語言(如 Java )這一級處理的;而核心支援執行緒的建立、撤消和排程都需 OS 核心提供支援,而且與程序的建立、撤消和排程大體是相同的。 3)使用者級執行緒執行系統呼叫指令時將導致其所屬程序被中斷,而核心支援執行緒執行系統呼叫指令時,只導致該執行緒被中斷。 4)在只有使用者級執行緒的系統內, CPU 排程還是以程序為單位,處於執行狀態的程序中的多個執行緒,由使用者程式控制執行緒的輪換執行;在有核心支援執行緒的系統內, CPU 排程則以執行緒為單位,由 OS 的執行緒排程程式負責執行緒的排程。 5) 使用者級執行緒的程式實體是執行在使用者態下的程式,而核心支援執行緒的程式實體則是可以執行在任何狀態下的程式。 5、當一個多執行緒程序建立新的程序時面臨的問題: 1)子程序是否繼承所有的執行緒; 2)訊號是發給程序而不是執行緒的,那麼當一個訊號到達時,由那個執行緒來處理,執行緒可以“註冊”它們感興趣的訊號

參考書籍:《現代作業系統》

一個介紹比較詳細的部落格:https://blog.csdn.net/gatieme/article/details/51892437