250 likes | 542 Views
Operating System Principles 作業系統原理 CHAPTER 4 多執行緒. 著者 ABRAHAM SILBERSCHATZ Yale University PETER BAER GALVIN Corporate Technologies GREG GAGNE Westminster College 譯者 駱詩軒 駱詩富 鄧俊修. CHAPTER 4 多執行緒. 4.1 概論 4.2 多執行緒模式 4.3 執行緒程式庫 4.4 執行緒的事項 4.5 作業系統範例. 4.1 概論. 4.1 概論
E N D
Operating System Principles作業系統原理CHAPTER 4 多執行緒 著者 ABRAHAM SILBERSCHATZ Yale University PETER BAER GALVIN Corporate Technologies GREG GAGNE Westminster College 譯者 駱詩軒 駱詩富 鄧俊修
CHAPTER 4 多執行緒 4.1 概論 4.2 多執行緒模式 4.3 執行緒程式庫 4.4 執行緒的事項 4.5 作業系統範例
4.1 概論 • 4.1 概論 • 執行緒是 CPU使用時的一個基本單位,它是由一個執行緒巾、程式計數器、一組暫存器,以及一個堆疊空間所組成。 • 它和屬於同一行程的其他執行緒共用程式碼區域,資料區域和作業系統資源。 • 傳統的行程只有單一的執行緒控制,因為多執行緒有多個執行緒控制,所以行程可以一次執行一項以上的任務。
4.1.1 動 機 • 許多在桌上型PC執行的套裝軟體都是多執行緒。應用程式通常都製作成有許多執行緒控制的個別行程。網頁瀏覽器可能有一個執行緒顯示影像或文字,而另一執行緒則從網路擷取資料。文書處理器可能有一個執行緒在顯示圖形,另一個執行緒從使用者讀入按鍵,而第三個執行緒在背景下執行拼字和文法校正。 • 在某些情況,單一應用程式可能被要求執行一些類似的工作。 • 網頁伺服器接受客戶端要求網頁、影像、聲音等資料。 • 一個忙碌的網頁伺服器可能有數個客戶同時存取,如果只一次只服務一個客戶,客戶等待被服務的時間可能很長。 • 解決方法: 產生一個個別的行程去服務該項要求,但對系統是負擔。 • 比較有效率的方法是讓一個行程包含許多的執行緒來達到相同目的。 • 伺服器產生另一個執行緒來服務要求,而非另一個行程
4.1.2 利 益 撰寫多執行緒程式的好處可以分成四個主要類別: • 應答:將交談式的應用程式多執行緒化,可以在一個程式某一部份被暫停,或程式在執行冗長操作時,依然桂續執行,因此增加了對使用者的應答。 • 資源分享:執行緒間將共用它們所屬行程的記憶體和資源。程式碼和資料共用的好處是讓應用程式有數個不同的執行緒在同一位址空間活動。 • 經濟:對於行程產生所配置的記憶體和資源耗費很大。反之,因為執行緒共用它們所屬行程的資源,所以執行緒的產生和內容交換就比較經濟。憑經驗去測量出產生和維護行程比執行緒多出多少時間可能很困難,但通常產生和維護行程會比執行緒更費時。 • 使用多處理器架構:在多處理器的架構下,多執行緒的利益可以大幅提升,因為每一執行緒可以並行地在不同的處理器上執行。不論有多少CPU可以使用,單一執行緒只能在一個CPU上執行。多處理器上並行增加多執行緒。
4.2 多執行緒模式 • 執行緒的支援可以由使用者層次提供(使用者執行緒,user thread) ,或者是由核心提供 (核心執行緒,kernel thread) • 使用者執行緒的支援是在核心之上,而且沒有核心支援下管理,因此核心執行緒直接由作業系統管理。
4.2 多執行緒模式 • 4.2.1 多對一模式 • 多對一模式對應多個使用者層次的執行緒到一個核心執行緒。 • 執行緒的管理在使用者空間執行,所以很有效率,但當一個執行緒執行暫停的系統呼叫時,整個行程就會暫停。 • 只有一個執行緒可以存取核心,數個執行緒不能在多個處理器上並行的執行。
4.2.2 一對一模式 • 一對一的模式對應一個使用者執行緒到一個核心執行緒,提供比多對一更多的並行功能,因為當一個執行緒執行暫停的系統呼叫時,它允許另一個執行緒執行;他也允許多個執行緒在多處理器上並行的執行。 • 唯一的缺點是,產生使用者執行緒就要產生相對應的核心執行緒,造成應用程式性能上的負擔,
4.2.3 多對多模式 • 多對多模式對應許多使用者執行緒到較少或相等數目的核心執行緒。 • 程式發展者可以產生自己所需要的執行緒,相對應的核心執行緒可以在多處理器上平行的執行。
多對多模式中一種常用的變化形式仍多重發送多個使用者層次的執行緒到一個較小或相等數目的執行緒,但也允許使用者層次的執行緒限制核心執行緒。多對多模式中一種常用的變化形式仍多重發送多個使用者層次的執行緒到一個較小或相等數目的執行緒,但也允許使用者層次的執行緒限制核心執行緒。
4.3 執行緒程式庫 (thread library) • 執行緒程式庫 (thread library) • 提供程式設計者一個API 來產生和管理執行緒。 • 製作執行緒有兩個方法 • 在沒有核心支援下在使用者空間提供完整的程式庫,也就是載入程式庫的函數,在使用者產生區域函數而不是系統呼叫。 • 製作一個直接由作業系統支援的核心層式庫,程式庫的程式碼和資料存在於核心空間。程式庫在API載入函數對核心產生一個系統呼叫。 • 今日三個使用的主要執行緒程式庫 • POSIX Pthreads • Win 32 • Java
4.3.1 Pthreads • Pthreads 可提供使用者層次或核心層次程式庫。 • Pthreads依據POS以 (IEEE1003.1c)標準定義執行緒產生和同步的API。 • Pthreads是執行緒行為的規格,而非製作。作業系統設計者可以用任何他們期望的方式製作此規格。
4.3.2 Win32執行緒 • 一個用於Windows系統核心層次程式庫。 • 使用Win32執行緒程式庫產生執行的技巧與Pthreads技巧,在許多方面很相似。當使用Win32API時,必須含有windows.h的標題檔。
4.3.3 Java執行緒 • Java 執行緒 API 讓在Java程式直接產生和管理執行緒。然而,因為大部分的情況下,JVM 在主機端作業系統頂端上執行,通常使用主機端系統的執行緒程式製作,在Windows下 Java執行緒通常使用Win32 API製作;UNIX和Linux通常使用Pthreads. • 執行緒是在Java程式、Java語言和JavaAPI中程式執行的基本模式,Java的API提供執行緒的產生與管理一組豈富的特性。所有Java程式至少包含一個單一執行緒控制,即使只包含一個main()方法的Java程式也是以一個單一執行緒在JVM下執行。
4.4 執行緒的事項 • 4.4.1 fork()和exec()等系統呼叫 • 如果程式中的一個執行緒呼叫fork(),則新的行程複製所有的執行緒,或是新的行程是單執行緒呢?有些UNIX系統選擇了擁有兩種版本的fork(),一個是複製所有的執行緒,另一個則是只複製呼叫系統呼叫fork()的那一個執行緒。 • 如果一個執行緒呼叫了系統呼叫exec()之後,exec()參數所指定的程式將取代整個行程(包括所有的執行緒)。
4.4.2 取消 • 執行緒取消(thread cancellation)是在一個執行緒完成之前結束它。 • 非同步取消 (asynchronous cancellation):一個執行緒立即終止目標執行緒。 • 延遲取消 (deferred cancellation):目標執行緒可以週期地檢查它是否該被取消,逼允許目標執行緒有機會以有條不紊的方式結束自己。
4.4.3 信號處理 • 信號由於特定事件的發生而產生 • 產生的信號被送到一個行程。 • 一旦送達後,此信號必須處理。 • 一個信號應該被傳送到那裡呢?通常有以下的選擇存在: • 傳送信號到此信號作用的執行緒。 • 傳送信號到行程中的每一個執行緒。 • 傳送信號到行程中特定的執行緒。 • 指定一個特定的執行緒來接收該行程的所有信號。
4.4.4 執行緒池 • 當伺服器接到一項要求時,它就產生一個個別的執行緒以服務此要求。但仍有問題 • 產生的執行緒必須花很多時間量,以及完成工作時必須拋棄 • 同時發生的要求都用一個新的執行緒,沒有限制的執行續可能耗進系統資源。 • 執行緒池 • 再行程開始執行時產生一些執行緒,並放入一個池中等待工作 • 執行緒池的優點有: • 通常對於服務一項要求時,使用現存的執行緒比等待產生一個執行緒快。 • 執行緒限制了任何時候執行緒的個數。這對於無法支援大量並行執行緒的系統特別重要。
4.4.5 執行緒的特定資料 • 某些情況下,每一個執行緒可能需要某些資料的自有拷貝。我們稱這些資料為執行堵的特定資料(thread specific data)。 • 為了使每一個執行緒和識別碼相結合,我們可以使用執行緒的特定資料。大部份的執行緒程式庫(包括win32和Pthread對於執行緒的特定資料都提供某些形式的支援。Java
4.4.6 排班程式活化作用 • 在使用者執行緒程式庫與核心之間通信其中一個技巧稱為排班程式活化作用(scheduler activation)。 • 它以下列方式工作:核心以一組虛擬處理器 (LWPs)提供一個應用程式,並且應用程式在可用的虛擬處理器上排班執行。再者,核心必須通知應用程式一些事件,這種流程稱為向上呼叫(upcall)。執行緒程式庫用一個向上呼叫處理程式 (upcall handler)處理向上呼叫,而且向上呼叫必須在虛擬處理器上執行。
4.5 作業系統範例 • 4.5.1 Windows XP 執行緒
4.5.2 Linux 執行緒 • Linux提供一個fork()系統",它擁有傳統的複製行程功能。Linux也提供clone()系統呼叫來產生執行緒。然而Linux無法區分行程與執行緒。事實上,當在程式內一連串控制時。Linux通常使用任務而不是行程或執行緒。當啟動。clone(),它傳遞一組旗標,決定有多少共用發生在父任務與于任務之間。下列是這些旗標當中的一部份。