1. 程式人生 > >現代作業系統筆記——多處理機系統

現代作業系統筆記——多處理機系統

  • 多處理機三種模型
    • 共享儲存器多處理機
    • 訊息傳遞多計算機
    • 廣域分散式系統
      在這裡插入圖片描述

多處理機的構造

  • 快取記憶體一致性協議
    • 為了緩解多個DUP對匯流排的爭奪,為每個CPU添加了快取記憶體
    • 如果CPU試圖在一個或多個遠端快取記憶體中寫入一個字,匯流排硬體檢測到寫,並把一個訊號放到總線上通知所有其它的快取記憶體。如果其他快取記憶體有個"乾淨"的副本,也就是同儲存器內容完全一樣的副本,那麼它們就可以丟棄該副本並讓寫在修改之前從儲存器中取出快取記憶體塊。如果某些其它快取記憶體中有“髒”副本(被修改的副本),它必須在處理寫之前把資料寫回儲存器或者它通過匯流排直接傳送到寫者上
  • 多處理機型別
    • 每個CPU都有自己的作業系統
      • 儲存器劃分成和CPU一樣多的各個部分,為每個CPU提供其素有儲存器以及作業系統的各自私有副本
      • 優點是允許所有CPu共享作業系統的程式碼,而且只需要提供資料的私有副本
      • 問題是很有可能出現負載不均勻的情況,並且可能多個cache同時被修改過,導致資料不一致
    • 主從多處理機
      • 一個主機執行作業系統,所有的系統呼叫都重定向到該CPU,剩下的CPU執行使用者程序
      • 含有單一個儲存器
      • 問題在於主CPU由於要處理所有的系統呼叫,可能過載,一般用於小型多處理機
    • 對稱多處理機
      • 任何CPU都可以執行儲存器上的作業系統,這是大多數現代多核處理器的組織形式
      • 問題在於如果連個CPU同時執行相同程序或者請求同樣的空前儲存頁面怎麼辦?
      • 解決方法是用互斥量所處作業系統
      • 由於作業系統的很多部分可以獨立工作,所以可以單獨鎖住不同的臨界區
        在這裡插入圖片描述

在這裡插入圖片描述
在這裡插入圖片描述

多處理機的同步

  • 為了防止多CPU的競爭,必須在訪問臨界區的時候鎖住匯流排
  • 我線上程與程序那一章介紹的TSL指令就是用來實現互斥的
    • TSL指令使用了自旋鎖,當一個CPU鎖住臨界區的時候,別的請求CPU必須不斷詢
    • 同時TSL指令還是一個寫操作,每次一個詢問都會使持有鎖的CPU的cache失效
    • TSL的鎖變數雖然很小,但是每一次寫操作都會使得整個cache頁面失效,而持有鎖的CPU很有可能會訪問該鎖變數周圍的記憶體,於是cache不停被調入調出
    • 解決方法是請求CPU先進行一個純讀操作檢視鎖是否空閒,只有空閒才會寫
  • 乙太網二進位制指數回退法
    • 對於自旋鎖的連續輪詢對匯流排負載太大
    • 該方法將一條延遲迴圈插在輪詢之前,如果鎖任然忙,加倍延遲時間,直到達到最大值
  • 自旋與切換
    • 對於單處理機,自旋鎖沒有意義,總是採用阻塞的方法
    • 對於多處理機,除了自旋鎖,還可以選擇切換執行緒
    • 但是切換的代價除了要儲存當前狀態,還可能導致cache失效,造成更多的快取未命中

多處理機的排程

  • 對於核心級執行緒,不僅要考慮接下來排程哪個執行緒,還要考慮由哪個CPU使用

  • 分時排程

    • 如果有 CPU 空閒則選擇優先順序佇列中的最優先執行緒到此 CPU
    • 智慧排程
      • 當一個執行緒持有自旋鎖時,如果因為時間片用完而切換掉,等待自旋鎖的CPU將會一直自旋
      • 解決方法是當一個CPU持有自旋鎖時,給與一個標誌,使其不被自動切換掉
    • 親和排程
      • 當執行緒A在某個CPU執行一段時間被切換後,當A重新開始執行時,最好還在該CPU,此時可以重用一些還存在的cache塊
      • 兩級排程演算法採用了這種觀念,他使得每個CPU有自己的執行緒集
        • 這種方法使得負載在各個CPU上大致平均分配了
  • 空間共享

  • 相互關聯的一組執行緒(比如一個程序中的執行緒)同時排程

  • 直到有大於等於執行緒數的CPU空閒才開始執行所有執行緒

  • 減少了相關執行緒切換的開銷,互相通訊更方便

多計算機與分散式系統

在這裡插入圖片描述

  • 分散式系統
  • 分散式系統的每個節點都有自己的私有儲存器,沒夠共享物理儲存
  • 每個節點可以執行不用的作業系統,因此缺少共同的底層模型和介面
  • 分散式系統在底層網路上添加了一些通用的模型,稱之為中介軟體,某種意義上是分散式系統的作業系統
    在這裡插入圖片描述