1. 程式人生 > >現代作業系統之多處理機系統(上)

現代作業系統之多處理機系統(上)

多處理機

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

多處理機硬體

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

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

通過給每個CPU新增一個快取記憶體(cache),這個快取記憶體可以位於CPU晶片內部,CPU附近,處理器板上或所有三種方式的組合。因為許多讀操作可以在快取記憶體中得到滿足,匯流排流量被大大減少了,這樣系統就能支援更多的CPU。 每一個快取記憶體塊或者被標記為只讀(此時可以存在與多個告訴快取中),或者被標記為讀寫(不能出現在多個快取記憶體)。如果CPU試圖在一個或多個遠端快取記憶體中寫入一個字,匯流排硬體檢測到寫,並把一個訊號放到總線上通知所有其它的快取記憶體。 如果某些其它快取記憶體中有“髒”副本,它必須在處理寫之前把資料寫回儲存器或者它通過匯流排直接傳送到寫者上。快取記憶體這一套規則被稱為快取記憶體一致性協議。


使用交叉開關的UMA多處理機

即使擁有最好的快取記憶體,單個匯流排的使用還是把UMA多處理機的數量限制在16個到32個CPu,連線n個CPU到k個儲存器的最多簡單的電路是交叉開關。 交叉開關最好的一個特性是它是一個非阻塞網路,即不會因有些交叉點或連線已經被佔據而拒絕連線。 交叉開關最差的一個特性是,交叉點數量以n的平方速度上漲。無論如何對於中等規模的系統而言,交叉開關的設計是可用的。

使用多級交換的UMA多處理機

需要log2 n級,沒幾n/2個開關,總數為n/2 * log 2 你個開關。Omega網路稱為全混洗,因為每一級訊號的混合就像把一副牌分成兩半。 在訊息通過交換網路後,模組號左端的值就不再需要了。它們可以用作應答訊息找回返回路徑。 若發生衝突,則其中一個必須等待。Mnerga網路是一種阻塞網路。 可以在多個莫垮肩均勻地分散對儲存器的引用。一種常用的奇數是把地位作為模組好。然後連續的字會放在連續的模組中。而連續字被放在不同模組裡的儲存器系統稱作交叉儲存器系統。

NUMA多處理機

這種機器為所有CPu提供一個統一的地址空間,但是訪問本地儲存器模組快於訪問遠端儲存器模組。因此,在NUMA機器傻姑娘執行的所有UMA程式無須做任何改變,但是相同的時鐘速率下其效能不如UMA機器傻姑娘的效能。 在對於遠端儲存器的訪問時間不被隱藏時(因為沒有快取記憶體),系統被稱為NC-NUMA(無快取記憶體NUMA)。在有一致性快取記憶體時,系統被稱為CC-NUMA(快取記憶體一致NUMA) 目前構造大小CC-NUMA多處理機最常見的方法是基於目錄的多處理機。其基本思想是,維護一個數據庫來記錄快取記憶體行的位置機器狀態,當一個快取記憶體被引用時,查詢資料庫找出快取記憶體行的位置以及他是否感覺。必須配有專門的硬體來提速。 即使在一個所謂的“”共享儲存器多處理機,在下層仍然有大量的訊息傳遞。 該設計有一個明顯的限制,級一行只能被一個節點快取記憶體。要想允許一行能夠在多個節點上被快取記憶體,我們需要某種對所有行定位的方法。

多核晶片

雖然CPU可能共享或不共享快取記憶體,但是它們必然共享記憶體。考慮到每個記憶體總是有唯一的值,這些記憶體是一致的。特殊的硬體電路可以確保一個字同時出現在兩個或都給快取記憶體中的情況下,當其中某個CPU修改來該字,所有其它快取記憶體中的該字都會被自動地並且原子性刪除以保證一致,這個過程稱為窺探。 這樣設計的結果是多核晶片就相當於小的多處理機。實際上,多核晶片時常被稱為片級多處理機(CMP) CPM跟更大的多處理機之間的一個差異是容錯。CPM的一個共享模組失效可能導致許多CPU同時出錯,而這樣的情況在傳統多處理機上是很少出現的。 除了所有核都是對等的對稱多核晶片,還有一類多核晶片被稱為片上系統。這些晶片含有一個或者多個主CPU,但同時海包含若干個專用核,例如視訊和音訊解碼器,加密晶片或者網路介面。這些和共同構成來完整的片上計算機系統。

多處理機作業系統型別

每個CPU有自己的作業系統

靜態地把儲存器劃分成和CPU一樣多的各個部分,為每個CPU提供其素有儲存器以及作業系統的各自私有副本。這樣的明顯優點是,允許所有CPu共享作業系統的程式碼,而且只需要提供資料的私有副本。 這樣要比有n個分離的計算機好得多,因為它允許所有機器共享一套磁碟和其它的IO裝置,他還允許靈活的共享儲存器。 程序之間可以高效通訊,而且從作業系統的角度上看,每個CPu都有自己的作業系統非常自然。 該設計涉及4個方面(P302) 這個模型已經很少使用了

主從多處理機

在這種模型下,作業系統的一個副本機器資料表都在一個CPU上,所有的系統呼叫都重定向到CPU1上。如果有剩餘的CPu時間,還可以在CPU1上執行使用者程序。這種模型稱為主從模型。 當某個CPU空閒下來時,它向CPU1上的作業系統請求一個程序執行,並被分配一個程序。 這個模型的問題是,如果有很多CPU,那麼出CPU會稱為瓶頸。


對稱多處理機

在儲存器中有作業系統的一個副本,但任何CPU都可以執行它。在有系統呼叫時,進行系統呼叫但CPU陷入核心並處理系統呼叫。 當一個COU要執行作業系統時,它必須首先獲得互斥訊號量。如果互斥訊號量被鎖住。就得等待。按照這種方式,任何CPu都可以執行作業系統,但任意時刻只有一個CPU可執行曹旭哦系統。 這樣就需要把作業系統分割成互不影響但臨界區。每個臨界區由其互斥訊號量保護,所以一次只能有一個CPU執行它。 大多數但現代多處理機都採用這種安排。為這類機器編寫作業系統但苦難不在於實際程式碼,而在於如何將其劃分成可以由不同但CPU冰箱指向但臨界區而互不干擾。 更進一步,要儘量避免死鎖。 理論上,所有但表都可以被賦予整數值,而且其所有但臨界區都應該以升序但方式獲得表。


多處理機同步

在多處理機中,禁止中斷的操作隻影響到完成禁止中斷操作的這個CPU,其它的CPU繼續執行並且可以訪問鄰接表。因此需要合適和互斥協議。 任何實用的胡吃遍了核心都是一條特殊治療,該指令允許檢測一個儲存器字並以一種不可見的操作設定。 TSL指令必須首先鎖住匯流排,阻止其它CPU訪問他,然後進行儲存器的讀寫訪問,再解鎖匯流排。對匯流排枷鎖的典型做法是,先使用通風的匯流排協議請求匯流排,然後申明已擁有某些特定的匯流排線路,直到兩個週期全部完成。只要始終保持擁有這一特性的匯流排線路,那麼其他CPu就不會得到匯流排的訪問權。這個指令只有在擁有必要的線路和使用它們的協議上才能實現。 如果正確的實現和使用TSL,就能保證互斥機制正常工作。但是這種互斥方法使用了自旋鎖。因為請求的CPU只是在原地儘可能快得對鎖進行迴圈測試。 當兩者同時看到鎖是空閒的,於是同時也哦那個TSL指令去獲得他。只有一個會成功,所以這裡沒有競爭條件,因為真正的獲取是由TSL指令進行的,這條指令是原子性的。即使看到了鎖空閒,然後歷史用TSL指令試圖獲得它,也不能保證真正得到它。 另一個減少匯流排流量的方式是泗洪柱面的乙太網二進位制指數補償演算法。不採用輪詢,而將一個延遲插入輪詢之間,每次延遲時間加倍。 一個更好的思想是,讓每個打算獲得互斥訊號量的CPU都擁有歌詞用於測試的私有鎖變數。 給一個未能活動的鎖的CPu分配一個鎖變數並且把它負載等待該鎖的CPU連結串列的末端。在當前鎖的持有者退出臨界區時,它釋放連結串列中的首個CPU正在測試的似有所,然後在CPU進入臨界區

自旋和切換

有時對於提出請求的CPU而言,只有等待,不存在其他等待的辦法。 然而,在另外一些情形中,卻存在著別的選擇。 自旋直接浪費了CPU週期,重複地測試鎖並不是搞笑的工作。不過,切換也浪費了CPU週期,因為必須儲存當前執行緒的狀態,必須獲得保護就緒連結串列的鎖,還必須選擇一個執行緒,必須裝入其狀態,並且使其開始執行。 通過事後演算法可以對可行演算法進行策略的基準評測標準, 一個未能獲得互斥訊號量的執行緒先自旋一段時間,若時間超過某個闕值,則切換。

多處理器排程

執行緒是核心執行緒還是使用者執行緒是至關重要的,如果執行緒是由使用者空間庫維護,而對核心不肯叫。那麼核心不能排程執行緒。 而對核心執行緒,是核心選擇執行緒作為排程單位,執行緒叢書的程序對於排程演算法只有很少(乃至於沒有)的影響。 在多處理機上,排程是二維的,排程程式必須決定哪一個程序執行以及在哪一個CPU上執行。 另一個造成複雜性的因素是,在與嘔血系統中所有的執行緒是不相關的,而在另外一些系統中它們是承租的,同屬於一個應用並且協同曹旭哦,

分時

處理獨立執行緒的最低暗淡演算法是,為就緒執行緒維護一個系統級的資料結構,它可能只是一個連結串列,但更多但情況下可能是對應不同優先順序但一個連結串列集合。 由所有CPU‘使用但單個排程資料結構分時共享這些CPU,就像還在一個但處理機系統中一樣。不過有量缺點——意識隨著CPU數量增加引起但對排程資料結構對潛在競爭,而是執行緒由於IO阻塞而因為對上下文切換對開銷。當執行緒時間片用完時,也可能會發生上下文切換。 為了避免這種情況,一些系統採用智慧排程演算法。獲得自旋鎖的程序設定一個程序範圍的標誌表示它目前擁有自旋鎖,當釋放時,就清除該標誌。這樣排程程式就不會停止擁有自旋鎖的執行緒,相反,還會給更多的時間。 有些多處理機使用了親和排程。其基本思想是,儘量使一個執行緒在前一次執行過的同一個CPU上執行。建立這種請合理的一個途徑是採用一種兩級排程演算法。 通過試圖讓一個執行緒在其生命週期在同一個CPU上執行,快取記憶體的親和力得到最大化。不過,如果某一個CPU沒有執行緒執行,就選擇另一個執行緒執行而不是空轉。 兩級排程演算法有三個優點——將負載大致平均的分配在可用的CPU傻姑娘;儘可能發揮了快取記憶體親和力的有時;為每個CPU提供一個私有的就緒執行緒連結串列,使得對就緒執行緒連結串列的競爭見到最小,因為試圖使用另一個CPU就緒執行緒連結串列的機會相對較小

空間共享

在多處理機系統中國年的一個演算法是選擇需要CPU週期數最少的執行緒執行,次小的為候選執行緒。 在這個簡單的分割槽模型中國年,一個執行緒請求一定數量的CPu,然後全部得到或者等待全部等到。另一種方法是主動管理執行緒的並行度,關係並行度的一種途徑是使用一箇中心伺服器,用它跟蹤哪些執行緒正在執行,哪些執行緒希望執行以及所需CPU的最小數量和最大數量


群排程

空間共享的一個明顯優點是消除多道程式設計,從而消除了上下文切換的開銷。但是統一的一個缺點是當CPU被阻塞或無事可做時時間被良妃了 。 而一個解決方法是群排程,它是協同排程發展的產物。
  1. 把一組相關執行緒作為一個單位,級一個群,一起排程
  2. 一個群中國年的所有成員在不同的分時CPU上同時執行
  3. 群中的所有成員共同開始和結束其時間片
使群排程正確工作的關鍵是同步排程所有CPu,這一位這把時間劃分為離散的時間片。在每一個新的時間片開始時,所有CPU都重新排程,在每個CPU上都開始一個新的執行緒。在後續時間片開始是,另一個排程時間發生。在這之間,沒有排程行為。如果某個執行緒被阻塞,則保持CPU空轉,直到對應的時間片結束為止。 群排程的思想是,讓一個程序的所有執行緒一起執行,這樣,如果其中一個執行緒想另一個執行緒傳送請求,接收方几乎會立即得到訊息,並且幾乎能偶立即應答