1. 程式人生 > >現代作業系統: 第八章 多處理機系統

現代作業系統: 第八章 多處理機系統

多處理機系統模型主要有三類:分別是共享儲存器多處理機、訊息傳遞多計算機、廣域分散式系統

  • 共享儲存器多處理機:獲得高速的一種處理方式就是使用並行處理機。這些機器使用許多CPU, 每一個都以“通常”的速度執行,但是總體上會比單個CPU強大得多的計算能力。
  • 訊息傳遞多處理機系統:許多CPU-儲存器通過某種高速網際網路絡連線在一起。這種系統稱為訊息傳遞型多計算機。
  • 廣域分散式系統:所有計算機通過一個廣域網連線起來,如因特網構成了一個分散式系統。

在這裡插入圖片描述

8.1 多處理機

共享儲存器多處理機是有兩個或更多的CPU全部共享訪問的一個公用的RAM,執行在任何一個CPU上的程式都看到一個普通的(通常是分頁)的虛擬地址空間。這個系統唯一特別的性質是,CPU可對儲存器字寫入某個值,然後讀會這個字,得到一個不同的值(因為另一個CPU改寫了它)。

8.1.1 多處理機硬體

所有多處理機都具有每個CPU可訪問全部儲存器的性質,而有些多處理機仍有一些其它的性質,即讀出每個儲存器字的速度是一樣快的。這種及其稱為UMA(統一儲存器訪問)多處理機,而另一種則稱為NUMA(非一致儲存器訪問)多處理機。

1. 基於匯流排的UMA多處理機體系結構

通過給每個CPU新增一個快取記憶體(cache),這個快取記憶體可以位於CPU晶片內部,CPU附近,處理器板上或所有三種方式的組合。因為許多讀操作可以在快取記憶體中得到滿足,匯流排流量被大大減少了,這樣系統就能支援更多的CPU。

在這裡插入圖片描述

快取記憶體一致性協議:每一個快取記憶體塊或者被標記為只讀(此時可以存在與多個告訴快取中),或者被標記為讀寫(不能出現在多個快取記憶體)。如果CPU試圖在一個或多個遠端快取記憶體中寫入一個字,匯流排硬體檢測到寫,並把一個訊號放到總線上通知所有其它的快取記憶體。如果其他快取記憶體有個"乾淨"的副本,也就是同儲存器內容完全一樣的副本,那麼它們就可以丟棄該副本並讓寫在修改之前從儲存器中取出快取記憶體塊。如果某些其它快取記憶體中有“髒”副本(被修改的副本),它必須在處理寫之前把資料寫回儲存器或者它通過匯流排直接傳送到寫者上。快取記憶體這一套規則被稱為快取記憶體一致性協議。

2.使用交叉開關的UMA處理機

連線n個CPU到k個儲存器的最簡單的電路就是交叉開關。

在這裡插入圖片描述

交叉開關最好的一個特性是它是一個非阻塞網路,即不會因有些交叉點或連線已經被佔據而拒絕連線。

3.使用多級交換網路的UMA多處理機

在這裡插入圖片描述

有一種完全不同的、基於簡單2X2開關的多處理機的設計。這個開關有兩個輸入和兩個輸出。到達任意一個輸入線的訊息可以被交換至另一個輸出線上去。就我們的目標而言,訊息可用由四個部分組成。Module(模組)域指明使用哪個儲存器。Address(地址)域指定在模組中的地址。Opcode(操作碼)給定了操作,如READ或者WRITE。最後一個可選的Value(值)域中可包含一個運算元。

這個2X2開關有多種使用方式,用於構建大型的多級交換網路。

在這裡插入圖片描述

4. NUMA多處理機

這種機器為所有CPu提供一個統一的地址空間,但是訪問本地儲存器模組快於訪問遠端儲存器模組。因此,在NUMA機器執行的所有NUMA程式無須做任何改變,但是相同的時鐘速率下其效能不如UMA機器的效能。

所有NUMA機器都具有以下三種關鍵特性:

  1. 就有對所有CPU都可見的的單個地址空間。
  2. 通過LOAD和STORE指令訪問遠端儲存器。
  3. 訪問遠端儲存器慢於訪問本地儲存器。

5.多核晶片

將兩個或者多個完整的CPU。通常稱為核(Core),放到同一個晶片上(技術上來說是同一個小矽片)。雙核、四核和八核的晶片已經很普及了。

6.眾核晶片

眾核晶片是指包括幾十、幾百甚至成千上萬個核心的多核處理器。

7.異構多核

一些晶片會把異構GPU和一些通用的處理器核心放在一起。在一塊晶片上封裝了不同的處理器的系統被統稱為異構多核處理器。

8.在多核心上程式設計

8.1.2 多處理機作業系統型別

1.每個CPU都有自己的作業系統

靜態地把儲存器劃分成和CPU一樣多的各個部分,為每個CPU提供其素有儲存器以及作業系統的各自私有副本。這樣的明顯優點是,允許所有CPu共享作業系統的程式碼,而且只需要提供資料的私有副本。

在這裡插入圖片描述

2.主從多處理機

在這種模型下,作業系統的一個副本機器資料表都在一個CPU上,所有的系統呼叫都重定向到CPU1上。如果有剩餘的CPu時間,還可以在CPU1上執行使用者程序。這種模型稱為主從模型。

當某個CPU空閒下來時,它向CPU1上的作業系統請求一個程序執行,並被分配一個程序。這個模型的問題是,如果有很多CPU,那麼出CPU會稱為瓶頸。

在這裡插入圖片描述

3.對稱多處理機

在儲存器中有作業系統的一個副本,但任何CPU都可以執行它。在有系統呼叫時,進行系統呼叫但CPU陷入核心並處理系統呼叫。

在這裡插入圖片描述

當一個CPU要執行作業系統時,它必須首先獲得互斥訊號量。如果互斥訊號量被鎖住。就得等待。按照這種方式,任何CPu都可以執行作業系統,但任意時刻只有一個CPU可執行作業系統。這樣就需要把作業系統分割成互不影響但臨界區。每個臨界區由其互斥訊號量保護,所以一次只能有一個CPU執行它。

由於這一事實,可以將作業系統分割成不同的互不影響的臨界區。每個臨界區由其互斥訊號量保護,所以一次只有一個CPU可以執行它。採用這種方式,可以實現更多的並行操作。而某些表格,如程序表,可能恰巧被多個臨界區使用。

大多數但現代多處理機都採用這種安排。更進一步,要儘量避免死鎖。

8.1.3 多處理機同步

我們仔細討論一下指令TSL(Test and Set Lock)是如果實現臨界區的。這條指令的做法:讀出一個儲存器字並把它儲存到一個暫存器中。同時,它對該暫存器字寫入一個1.當然這需要兩個匯流排週期來完成儲存器的讀寫。在單處理機中,只要該指令不被中途中斷,TSL指令就如實正常執行。

在這裡插入圖片描述

TSL指令必須首先鎖住匯流排,阻止其它CPU訪問他,然後進行儲存器的讀寫訪問,再解鎖匯流排。對匯流排枷鎖的典型做法是,先使用通風的匯流排協議請求匯流排,然後申明已擁有某些特定的匯流排線路,直到兩個週期全部完成。只要始終保持擁有這一特性的匯流排線路,那麼其他CPU就不會得到匯流排的訪問權。這個指令只有在擁有必要的線路和使用它們的協議上才能實現。

如果正確的實現和使用TSL,就能保證互斥機制正常工作。但是這種互斥方法使用了自旋鎖。因為請求的CPU只是在原地儘可能快得對鎖進行迴圈測試

快取記憶體的實現也許能夠消除匯流排競爭的問題,但事實並非如此。理論上,只要提出CPU已經讀取了鎖字(Lock word),它就可以在其快取記憶體中得到一個副本。只要沒有其他CPU試圖使用該鎖,提出請求的CPU就能夠用完其快取記憶體,當擁有鎖的CPU寫入一個0快取記憶體並釋放它時,搞快取會自動將它在遠端快取記憶體中的所有副本失效,要求再次讀取正確的值。

問題:通常,擁有鎖的CPU也需要這個鎖周圍的字。由於TSL指令是一個寫指令(因為它修改了鎖),所以它需要互斥地訪問含有鎖的快取記憶體塊。這樣每一個TSL指令都使鎖持有者的快取記憶體中的塊失效,並且為請求的CPU取一個私有的、唯一的副本。只要鎖擁有者訪問到該鎖的鄰接字,該快取記憶體塊就被送到其機器。這樣一來,整個包含鎖的高速緩衝塊就會不斷地在鎖的擁有者和鎖的請求者之間來回穿梭,導致了比單個讀取一個鎖字更大的匯流排流量。

解決方案:

  • CPU首先進行一個存讀操作來觀察鎖是否是空閒的,就可以實現這個目標。只有在鎖是空閒的,TSL指令才去真正獲取它。這種小小的變化,導致的是大多的行為變成讀而不是寫。
  • 減少匯流排流量的方式是泗洪柱面的乙太網二進位制指數補償演算法。不採用輪詢,而將一個延遲插入輪詢之間,每次延遲時間加倍。
  • 一個更好的思想是,讓每個打算獲得互斥訊號量的CPU都擁有歌詞用於測試的私有鎖變數。

在這裡插入圖片描述

自旋與切換

需要加鎖的互斥訊號量的CPU只是保持等待。有時對於提出請求的CPU而言,只有等待,不存在其他等待的辦法。

自旋直接浪費了CPU週期,重複地測試鎖並不是搞笑的工作。不過,切換也浪費了CPU週期,因為必須儲存當前執行緒的狀態,必須獲得保護就緒連結串列的鎖,還必須選擇一個執行緒,必須裝入其狀態,並且使其開始執行。

多數研究工作是用來一種新的模型:一個未能獲得互斥訊號量的執行緒先自旋一段時間,若時間超過某個闕值,則切換。

8.1.4 多處理機排程

對於多執行緒的排程,可以分為兩類:分別是使用者執行緒的排程和核心執行緒的排程。

  • 使用者執行緒的排程:,如果執行緒是由使用者空間庫維護,而對核心不可見。那麼排程一如既往的基於單個程序。如果核心並不知道執行緒的存在,它就不能排程執行緒。
  • 核心執行緒的排程:而對核心執行緒,是核心選擇執行緒作為排程單位,核心可以選擇任意一個程序的任一執行緒。

1.分時

處理獨立執行緒的最簡單的演算法是,為就緒執行緒維護一個系統級的資料結構,它可能只是一個連結串列,但更多但情況下可能是對應不同優先順序但一個連結串列集合。

在這裡插入圖片描述

使用單一資料結構排程一個多處理機,存在的缺點:

  • 隨著CPU數量增加引起但對排程資料結構對潛在競爭
  • 執行緒由於IO阻塞而因為對上下文切換對開銷。

當執行緒時間片用完時,也可能會發生上下文切換。

為了避免這種情況,一些系統採用智慧排程演算法。獲得自旋鎖的程序設定一個程序範圍的標誌表示它目前擁有自旋鎖,當釋放時,就清除該標誌。這樣排程程式就不會停止擁有自旋鎖的執行緒,相反,還會給更多的時間。

為了預裝緩衝塊將提高快取記憶體的命中率,從而提高執行緒的速度。有些多處理機使用了親和排程。其基本思想是,儘量使一個執行緒在前一次執行過的同一個CPU上執行。建立這種請合理的一個途徑是採用一種兩級排程演算法。

兩級排程演算法:在一個執行緒建立的時候,他被分給了一個CPU,列如,可以基於哪個CPU在此刻有最小的負載。這種把執行緒分給CPU的工作在演算法的頂層進行,其結果是每個CPU獲得了自己的執行緒集。

兩級排程演算法有三個優點:

  • 將負載大致平均的分配在可用的CPU上。
  • 儘可能發揮了快取記憶體親和力的優勢
  • 每個CPU提供一個私有的就緒執行緒連結串列,使得對就緒執行緒連結串列的競爭見到最小,因為試圖使用另一個CPU就緒執行緒連結串列的機會相對較小。

2.空間共享

當執行緒之間以某種方式彼此相關聯的時候,可以使用多處理機排程方法。在多個CPU同時排程多個執行緒稱為空間共享

最簡單的空間共享演算法的基本思想:

假設一組相關的執行緒時一次性建立的。在其建立的時刻,排程程式檢查是否有同線程數量一樣多的空閒CPU存在。如果有,每個執行緒獲得各自的CPU並且都開始執行。如果沒有足夠的CPU,就沒有現車開始執行,直到有足夠的CPU開執行。

8.2 多計算機

多計算機是緊耦合CPU,不共享儲存器。每臺計算機中有自己的儲存器。

在這裡插入圖片描述

8.2.1 多計算機硬體

一個多計算機系統的基本節點包括一個CPU、儲存器、一個網路介面、有時候還有一個硬碟。

1. 互聯技術

在每個節點上有一個網絡卡,帶有一根或兩根網絡卡上接出的電纜。這些電纜或者連線到其他節點上去,或者連結到交換機上。

在多計算機中可採用兩種交換機制:

  • 儲存轉發包交換:每個訊息首先被分解(由使用者軟體或網路介面進行)稱為有最大長度限制的快,稱為報。該交換機制稱為儲存轉換包交換,由源節點的網路介面卡注入到第一個交換機的報組成。
  • 電路交換:它包括由第一個交換機建立的,通過所有交換機而到達目標交換機的一條路徑。一旦電路建立,位元流就從源到目的地通過整個線路不停的傳輸。在所設計的交換機彙總,沒有中間快取,電路交換需要有一個建立階段,它需要一點時間。但是一旦建立完成,速度就很快。在包傳送結束後,該路徑必須被刪除。

在這裡插入圖片描述

2. 網路介面

在多計算機中,所有節點裡都有一塊插卡板,它包含節點與互連網路的連線,這使得多計算機連城一體。

很多介面板上有一個完整的CPU,可能另外還有一個或多個DMA通道。它們被稱為網路處理器,並且其功能日趨強大。這種設計一位這主CPU將一些工作分給網絡卡。

8.2.2 底層通訊軟體

問題:如果說進出RAM的複製是效能瓶頸,那麼進出核心的額外複製會將端到端的延遲加倍 ,並把吞吐量降低一半。為了避免進出RAM的複製稱為系統性能瓶頸。我們有以下三種解決方案:

  1. 將介面板對映到所有需要它的程序中去,但是這樣做就需要有一個機制來避免競爭。
  2. 需要某種同步機制,如注入一些同步互斥訊號量。

1. 節點至網路介面通訊

最快的方法是使用板上的DMA晶片直接將他們從RMA複製到板上,這種方法的問題上,DMA使用實體地址。而使用者程序通常不知道有關的實體地址,並且獨立於CPU執行,除非存大I/O MMU。

2. 遠端直接記憶體訪問

在上述情況下,降低資料的複製量都需要很大的代價。為了應對這個問題,一些網路介面支援遠端直接記憶體訪問技術,允許一臺機器直接訪問另一臺機器的記憶體。RDMA不需要作業系統地參與,直接從應用的記憶體空間中讀取或者寫入資料。

8.2.3 使用者層通訊軟體

1.傳送和接受

傳送一條訊息的系統呼叫:

send(dest,&mptr); 

接受訊息的呼叫:

receive(addr,&mptr)

2.阻塞呼叫和非阻塞呼叫

阻塞呼叫:當一個程序呼叫send時,它指定一個目標以及傳送訊息到該目標的緩衝區。當訊息傳送時,傳送程序被阻塞(掛起)。在訊息已經完成傳送出去之前,不會執行跟隨在呼叫send後面的指令。

非阻塞呼叫:如果send是非阻塞的,在訊息發出之前,它立即將控制返回給呼叫者。這種機制的

在這裡插入圖片描述

通常是由系統設計者作出在阻塞原語和非阻塞原語之間的選擇。當然少數系統兩種都可以使用。

問題:非阻塞原語的效能優點被其缺點抵消了——直到訊息被送出傳送者才能修改訊息緩衝區。程序在傳輸過程中重寫訊息的後果十分嚴重,更糟的是,傳送程序不知道傳輸何時結束,所以根本不知道什麼時候重用緩衝區是安全的。

解決方案:

  1. 讓核心複製訊息到核心緩衝區,然後讓程序繼續。
  2. 當訊息傳送之後中斷髮送,告知緩衝區又可以使用了(使用者級中斷引發程式設計問題,而且可能引發競爭條件)
  3. 讓緩衝區寫時複製。在訊息傳送出去之前,若有修改,則進行復制(會引發不必要的複製)

這樣在傳送端的選擇是:

  1. 阻塞傳送(CPU在訊息傳輸期間空閒)
  2. 待有複製操作的非阻塞傳送(CPU時間浪費在額外的複製上)。
  3. 帶有中斷操作的非阻塞傳送(造成程式設計困難)。
  4. 寫時複製(最終可能造成額外的複製)

8.2.4 遠端過程呼叫

儘管訊息傳遞模型提供了一種構造多計算機作業系統的便利,但是它也有不可救藥的缺陷:構造所有相同通訊的泛型都是輸入/輸出。

遠端過程呼叫:執行程式呼叫其他CPU的過程。當機器1的程序呼叫機器2的過程時,在機器1中的呼叫程序被掛起,在機器2中被呼叫的過程被執行。可以在引數中傳遞從呼叫者到呼叫者的資訊,並且可以在過程的處理結果中返回訊息。根本不存在對程式可見的訊息傳遞或者I/O。這種技術成為遠端過程呼叫(RPC)。

在這裡插入圖片描述

8.2.6 多計算機排程

將程序分配到工作節點的工作十分重要。

因為每個節點都擁有自己的程序,因此可以應用任何本地排程演算法,但是仍有可能使用多處理機排程。

8.2.7 負載均衡

1.圖論確定演算法

將節點分為子網,尋找子網之間流量最小的組合

在這裡插入圖片描述

2.傳送者發起的分散式啟發演算法

在這裡插入圖片描述

當程序建立時,他就執行在建立它的節點上,除非該節點過載了。如果該節點過載了,該節點則隨機選擇一個節點並詢問其負載情況。探查工作不會永遠進行,在N次探查之後,如果沒有合適的主機,演算法就終止。且程序繼續在原有機器上執行。

在負載重的情況下,所有機器都會持續得對其他機器進行探查,徒勞地試圖找到一臺願意接收工作的機器,這樣的嘗試會導致巨大的開銷。

3.接受者發起的分散式啟發演算法

由接受者要求更多的工作

8.3 分散式系統

分散式系統的每一個節點都是一臺完整的計算機,帶有全部的外部裝置。其次一臺多計算機的所有節點一般分佈在一個房間內,這樣他們就可以通過專門的網路進行高速網路通訊。而分散式系統中的節點則可能分散在全世界範文內。

8.3.1 網路硬體

網路主要有兩種——覆蓋一棟建築物的LAN(區域網)和更大範圍的WAN(廣域網)

LAN最重要的型別是乙太網

在這裡插入圖片描述

1.乙太網

乙太網有其最大電纜長度限制,以及可連線的最多的計算機臺數限制。要想超過其中一個限制,就要在一座大建築物或校園中連線多個乙太網,然後用一種成為橋接器的裝置把這些意外網連線起來。

為了避免碰撞問題,現代乙太網使用交換機。如果能人後較大的交換機成本,可以使每臺機器都擁有自己的埠,從而消除所有的碰撞。作為一種妥協方案,每個埠上連線少量計算機還是可能的。

2.因特網

Internet包括了兩類計算機,主機和路由器。主機有PC機,路由器是專用的交換計算機,它在許多進線中的一條線上接收進來的包,並在許多個出口線中的一條線傻姑娘按照其路徑傳送包。

當一個包到達某個路由器使,該路由器抽取目的地地址並在一個表格進行查詢,以找出用哪根出口線傳送該包以及傳送哪個路由器。路由表是高度動態的,並且隨著路由器和鏈路維護,恢復以及通訊條件的變壞在連續不斷的更新。

8.3.2 網路服務和協議

1.網路服務

計算機網路為使用網路的主機和程序提供服務。面向連線的服務是對電話系統的一種模仿,而無連線服務則是對郵政系統的一種模仿。

可靠的,面向連線的服務有兩種變種——訊息序列和位元組流

不可靠的(意味著沒有確認)無連線服務,常常稱作是資料報服務。

2. 網路協議

用於特定計算機通訊的這些規則的集合稱為協議。

所有的現代網路都使用所謂的協議棧把不同的協議一層層疊加起來。每一層解決不同的問題。

大多數分散式系統都使用Internet 作為基礎,因為這些系統使用的關鍵協議是IP和TCP協議。IP協議是資料報協議,傳送者可以向網路上發出長達64kb的資料報並且網它們到達。TCP使用IO來提供面向連線的資料流。為了使用TCP,程序需要首先與一個遠端程序建立連線。被請求的程序需要通過機器的IP地址和機器的埠號確定,而對進入的連線感興趣的程序監聽埠。這些工作完成之後,只需要把位元組流放入連線。

DNS作為一個數據庫把主機的ASCII名稱名稱對映為對應的IP地址。

8.3.4 基於檔案系統的中介軟體

分散式系統採用一個檔案系統模型意味著只存在一個全域性檔案系統,全世界的使用者都能夠讀寫他們各自具有授權的檔案。通過一個程序將資料寫入檔案而另一個程序把資料讀出的辦法可以實現通訊。

8.3.5 基於物件的中介軟體

8.3.6 基於協作的中介軟體