使用者級執行緒和核心級執行緒(輕量級程序)
在乙個純粹的使用者級執行緒軟體中,有關執行緒管理的所有工作都由應用程式完成,核心意識不到執行緒的存在。
使用使用者級執行緒而非核心級執行緒有很多優點:
(1)由於所有執行緒管理資料結構都在乙個程序的使用者位址空間中,執行緒切換不需要核心態特權,因此,程序不需要為了執行緒管理而切換到核心態,這節省了兩次狀態轉換(從使用者態到核心態,從核心態返回到使用者態)的開銷。
(2)排程可以是應用程式相關的。乙個應用程式可能更適合簡單的輪轉排程演算法,二零乙個應用程式可能更適合基於優先順序的排程演算法。可以做到為應用程式量身定做排程演算法而不影響底層的作業系統排程程式。
(3)使用者級執行緒可以在任何作業系統中執行,不需要對底層核心進行修改以支援使用者級執行緒。執行緒庫是一組供所有應用程式共享的應用程式共享的應用程式級別的函式。
使用者級執行緒相對於核心級執行緒的缺點:
(1)在典型的作業系統中,許多系統呼叫會引起阻塞。因此,當使用者級執行緒執行乙個系統呼叫時,不進這個執行緒會被阻塞,程序中所有執行緒都會被阻塞。
(2)在純粹的使用者級執行緒中,乙個多執行緒應用程式不能利用多處理技術。核心一次只把乙個程序分配給乙個處理器,因此乙個程序中只有乙個執行緒可以執行。
解決辦法:
(1)把應用程式寫成乙個多程序應用程式而非多執行緒應用程式,但這種方法消除了執行緒的主要優點:每次切換都變成了程序間的切換,而不是執行緒間的切換,導致開銷過大。
(2)使用jacketing技術,jacketing目標是把乙個產生阻塞的系統呼叫轉換成乙個非阻塞的系統呼叫。
在乙個純粹的核心級應用軟體中,有關執行緒的所有工作都是由核心完成的,應用程式部分沒有進行執行緒管理的**,只有乙個到核心執行緒設施的應用程式程式設計介面(api)。
核心為程序及其內部的每個執行緒維護上下文資訊,排程是基於執行緒完成的。
該方法克服了使用者級執行緒的兩個基本缺陷:
首先,核心可以同時把同乙個程序中的多個執行緒排程到多個處理器中,再者,如果程序中的乙個執行緒被阻塞,核心可以排程同乙個執行緒中的另乙個執行緒。
核心級執行緒方法的優點是:核心例程自身也是可以使用多執行緒的。
缺點:在把控制從乙個執行緒傳送到同乙個程序內的另乙個執行緒時,需要到核心的狀態切換。
下表是單處理器vax機上執行類unix作業系統的測量結果。
進行了兩種測試:null fork(測試創間,排程,執行和完成乙個呼叫空過程的程序/執行緒的時間,即就是派生乙個程序、執行緒的開銷)和single-wait(測量程序/執行緒給正在等待的程序/執行緒發訊號,然後在某個條件上等待所需要的時間,即就是兩個程序/執行緒的同步時間)。
從上表可以看出,使用者級執行緒和核心級執行緒之間、核心級執行緒和程序之間都有乙個數量級以上的效能差異。
從表面上看,雖然使用核心級程序和多執行緒技術會比使用單執行緒的程序有明顯的速度提高,使用使用者級執行緒卻比核心級執行緒有額外的提高。不過額外的提高取決於應用程式的性質。如果應用程式中大多數執行緒切換都需要核心態的訪問,那麼基於使用者級執行緒的方案不會比基於核心級執行緒的方案好多少。
混合方法:
在混合系統中,執行緒建立完全在使用者空間中完成,現成的排程和同步也在應用程式中進行。
乙個應用程式中的多個使用者及線槽被對映到一些(小於或者等於使用者級執行緒的數目)核心到執行緒上。程式設計師可以為特定的應用程式和處理器調節核心級執行緒的數目,以達到最佳效果。
在混合方法中,同乙個應用程式中的多個執行緒可以在多個處理器上並行的執行,某個會引起阻塞的系統呼叫不會阻塞整個程序。
執行緒池的分類
在實際使用中,執行緒是很占用系統資源的,如果對執行緒管理不善很容易導致系統問題。因此,在大多數併發框架中都會使用執行緒池來管理執行緒,使用執行緒池管理執行緒主要有如下好處 執行緒池的常用型別主要有如下三大類 建立乙個可根據需要建立新執行緒的執行緒池,但是在以前構造的執行緒可用時將重用它們,並在需要時...
執行緒池分類
executor介面 執行器 裡面有乙個方法void execute runnable command 執行runnable這個任務,下面是executor介面原始碼 public inte ce executorexecutorservice介面 執行器服務,一堆執行器在等著扔任務,你扔了乙個ru...
多執行緒鎖的分類說明
synchronized 可重入 重型鎖 鎖公升級 volatile 可見,禁止指令重排 atomic integer reetrantlock countdownlatch 倒數等待執行緒計數器,倒計數器為0時執行緒執行。cyclicbarrier 滿員執行緒執行。marriage phar 階段...