1、Operating System Principles作業系統原理 CHAPTER 4 多執行緒著者ABRAHAM SILBERSCHATZYale UniversityPETER BAER GALVINCorporate TechnologiesGREG GAGNEWestminster College譯者駱詩軒 駱詩富 鄧俊修投影片編撰 鄧有光CHAPTER 4 多執行緒4.1 概論4.2 多執行緒模式4.3 執行緒程式庫4.4 執行緒的事項4.5 作業系統範例 執行緒 輕量級行程 使用 CPU 資源的基本單元 包含了一個程式計數器、一組暫存器和一個堆疊空間 與其他的執行緒共用同一個位址空
2、間 傳統的行程 重量級行程 可看成是只有一個執行緒在執行的行程 4.1 概論4.1 概論 執行緒是 CPU使用時的一個基本單位,它是由一個執行緒ID、程式計數器、一組暫存器,以及一個堆疊空間所組成。4.1.1 動 機許多在桌上型PC執行的套裝軟體都是多執行緒。應用程式通常都製作成有許多執行緒控制的個別行程。網頁瀏覽器可能有一個執行緒顯示影像或文字,而另一執行緒則從網路擷取資料。文書處理器可能有一個執行緒在顯示圖形,另一個執行緒從使用者讀入按鍵,而第三個執行緒在背景下執行拼字和文法校正。4.1.2 利 益 撰寫多執行緒程式的好處可以分成四個主要類別:1.應答:將交談式的應用程式多執行緒化,可以在
3、一個程式某一部份被暫停,或程式在執行冗長操作時,依然繼續執行,因此增加了對使用者的應答。2.資源分享:執行緒間將共用它們所屬行程的記憶體和資源。程式碼和資料共用的好處是讓應用程式有數個不同的執行緒在同一位址空間活動。3.經濟:對於行程產生所配置的記憶體和資源耗費很大。反之,因為執行緒共用它們所屬行程的資源,所以執行緒的產生和內容交換就比較經濟。(通常產生或維護一個行程會比執行緒更費時)4.使用多處理器架構:在多處理器的架構下,多執行緒的利益可以大幅提升,因為每一執行緒可以並行地在不同的處理器上執行。不論有多少CPU可以使用,單一執行緒只能在一個CPU上執行。在作業系統中,有兩種方式來支援執行緒
4、 使用者執行緒 利用執行緒函式庫來提供的 建立與管理執行緒時比較有效率 核心執行緒 由作業系統直接支援 建立與管理執行緒時比使用者執行緒來得慢 4.2 多執行緒模式4.2.1 多對一模式 多個使用者層次的執行緒對應到一個核心執行緒。如果其中一個執行緒暫停,整個行程就會暫停。一次只有一個執行緒可以存取核心,數個執行緒不能在多個處理器上並行執行。4.2.2 一對一模式一個使用者層次的執行緒對應到一個核心執行緒。如果其中一個執行緒暫停,可允許另一個執行緒執行。多個執行緒可在多個處理器上並行執行。產生使用者執行緒時,就要產生相對應的核心執行緒,會造成應用程式性能上的負擔。Ex.Windows系列、Li
5、nux4.2.3 多對多模式多個使用者層次的執行緒對應到多個核心執行緒。如果其中一個執行緒暫停,可允許另一個執行緒執行。多個執行緒可在多個處理器上並行執行。4.3 執行緒程式庫(thread library)4.3.1 Pthreads Pthreads依據POS以(IEEE1003.1c)標準定義執行緒產生和同步的API。Pthreads是執行緒行為的規格,而非製作。作業系統設計者可以用任何他們期望的方式製作此規格。4.3.2 Win32執行緒 使用Win32執行緒程式庫產生執行的技巧與Pthreads技巧,在許多方面很相似。當使用Win32API時,必須含有windows.h的標題檔。4.
6、3.3 Java執行緒 執行緒是在Java程式、Java語言和JavaAPI中程式執行的基本模式。所有Java程式至少包含一個單一執行緒控制,即使只包含一個main()方法的Java程式也是以一個單一執行緒在JVM下執行。4.4 一些執行緒的注意事項 4.4.1 fork()和exec()等系統呼叫 如果程式中的一個執行緒呼叫fork(),則新的行程複製所有的執行緒,或是新的行程是單執行緒呢?有些UNIX系統選擇了擁有兩種版本的fork(),一個是複製所有的執行緒,另一個則是只複製呼叫系統呼叫fork()的那一個執行緒。如果一個執行緒呼叫了系統呼叫exec()之後,exec()參數所指定的程式
7、將取代整個行程(包括所有的執行緒)。4.4.2 取消執行緒取消(thread cancellation)是在一個執行緒完成之前結束它。1.非同步取消(asynchronous cancellation):一個執行緒立即終止目標執行緒。2.延遲取消(deferred cancellation):目標執行緒可以週期地檢查它是否該被取消。4.4.3 信號處理 信號由於特定事件的發生而產生 產生的信號被送到一個行程。一旦送達後,此信號必須處理。一個信號應該被傳送到那裡呢?通常有以下的選擇存在:1.傳送信號到此信號作用的執行緒。2.傳送信號到行程中的每一個執行緒。3.傳送信號到行程中特定的執行緒。4.指
8、定一個特定的執行緒來接收該行程的所有信號。4.4.4 執行緒池 在行程開始執行時,就先產生一些執行緒,並放入一個池中,等待工作。執行緒池的優點有:當服務某項要求時,使用現存的執行緒比產生一個新的執行緒快。執行緒池限制執行緒的個數,這對於無法支援大量並行執行緒的系統特別重要。4.4.5 執行緒的特定資料 某些情況下,每一個執行緒可能需要某些資料的自有拷貝。我們稱這些資料為執行堵的特定資料(thread specific data)。4.4.6 排班程式活化作用 在使用者執行緒程式庫與核心之間通信其中一個技巧稱為排班程式活化作用(scheduler activation)。它以下列方式工作:核心以
9、一組虛擬處理器提供給一個應用程式,應用程式在虛擬處理器上排班執行。核心必須通知應用程式一些事件,這種流程稱為向上呼叫(upcall)。執行緒用向上呼叫處理程式(upcall handler)處理向上呼叫。向上呼叫必須在虛擬處理器上執行。4.5 作業系統範例 4.5.1 Windows XP 執行緒使用者的資料結構 4.5.2 Linux 執行緒 Linux提供一個fork()系統呼叫,它擁有傳統的複製行程功能。Linux也提供clone()系統呼叫來產生執行緒。然而Linux無法區分行程與執行緒。Linux通常使用任務而不是行程或執行緒。啟動clone()時 傳遞一組旗標,決定父任務與子任務之間的共用資源。(相當於執行緒)若不傳遞旗標,則無共用資源。(相當於行程)