1. 多處理機簡介
共享存儲器多處理機
每個 cpu 都可同樣訪問消息傳遞多計算機
通過某種高速互聯網絡連接在一起, 每個存儲器局部對應一個 cpu, 且只能被該 cpu 訪問, 這些 cpu 通過互聯網絡發送多字消息通信
易於構建, 編程難廣域分佈式系統
通過廣域網連接, 如 Internet,多處理機是共享存儲器多處理機的簡稱, 多個 cpu 共享一個公用的 RAM.
2. 多處理機硬件
所以多處理機都具有每個 cpu 可訪問全部存儲器的性質, 而有些多處理機有一些特性,
2.1. UMA(Uniform Memory Access)
讀出每個存儲器字的速度一樣快
2.1.1. 基於總線的 UMA 多處理機體系結構
2.1.2. 基於交叉開關的 UMA 多處理機
2.1.3. 基於多級交換的 UMA 多處理機
此開關檢查 module 域來決定連入哪個存儲器, 即連接 x 還是 y
例如 Omega網絡
n 個 cpu / 存儲器, 有 log2n 級, 每級只需 n/2 個開關,
比較:
網絡 | 開關數 | 是否阻塞 |
---|---|---|
交叉開關 | n2 | 不阻塞 |
Omega 網絡 | n/2*log2n | 阻塞 |
2.2. NUMA(nonuniform memory access)
特性:
* 具有對所有 cpu 都可見的單個地址空間
* 通過 LOAD 和 STORE 指令來訪問運程存儲器
* 訪問遠程存儲器慢於訪問本地存儲器
基於文件的多處理機
基本思想: 維護一個數據庫來記錄告訴緩存行的位置及其狀態. 當一個高速緩存行被引用時, 就查詢數據庫找出高速緩存行的位置以及它的 dirty 記錄,(是否被修改過),
2.3. 多核芯片
每個核就是一個完整的 CPU , 可以共享內存, 但是 cache 不一定共享. 時常被成爲 片級多處理機(Chip-level MultiProcessors, CMP)
.
與基於總線的多處理機和使用交換網絡的多處理機的差別不大:
* 基於總線的 每個 CPU 都有自己的 cache
* CMP 容錯性低: 連接緊密, 一個共享模塊的失效可能導致其他 CPU 出錯
片上系統 (system on a chip)
芯片包含多個核, 但是同時還包含若干個專業核, 比如視頻與音頻解碼器, 加密芯片, 網絡接口等
3. 多處理機操作系統類型
3.1. 每個 CPU 都有自己的操作系統
優點: 共享操作系統代碼
注意
* 在一個進程進行系統調用時, 是在本機的 CPU 上被捕獲並處理的, 並使用操作系統表中的數據結構
* 因爲每個操作系統都有自己的表, 那麼也有自己的進程集合, 通過自身調度這些進程, 而沒有進程共享. 如果一個用戶登陸到 CPU1 , 那麼他的進程全在 CPU1 上, 也就是可能導致其他 CPU 空載
* 沒有頁面共享: 可能出現 CPU2 不斷進行頁面替換而 CPU1 卻有多餘的頁面
* cache 不一致
3.2. 主從多處理機
問題
如果有很多 CPU , 主 CPU 會成爲瓶頸, 速度慢
3.3. 對稱多處理機 (Symmetric MultiProcessor, SMP)
消除了主從處理機的不對稱性, 在存儲器中有操作系統的一個副本, 但任何 CPU 都可以運行它.
這個模型動態平衡進程和存儲器, 因爲它只有一套操作系統數據表.
它存在的問題: 當兩個或多個 CPU 同時運行操作系統代碼時, 如請求同一個空閒存儲器頁面, 這時應該使用互斥信號量 (鎖), 使整個系統成爲一大臨界區. 這樣在任一時刻只有一個 CPU 可運行操作系統
4. 多處理機調度
調度對象: 單進程還是多進程, 線程是內核進程還是用戶線程.
* 用戶線程: 對內核不可見, 那麼調度單個進程,.
* 內核線程: 調度單元是線程,
4.1. 分時
先討論調度獨立線程的情況, 如果有 CPU 空閒則選擇優先級隊列中的最優先線程到此 CPU
缺點:
* 隨着 CPU 數量增加引起對調度數據結構的潛在競爭
* 當線程在 I/O 阻塞時引起上下文切換的開銷 (overhead)
親和調度: 基本思想, 儘量使一個線程在它前一次運行過的 CPU 上運行,
4.2. 空間共享
當線程之間以某種方式彼此相關時, 可以使用此方法. 假設一組相關的線程是一次性創建的, 創建時, 檢查是否有足夠的空閒 CPU, 有 則 各自獲得專用的 CPU, 否則等待,
優點: 消除了多道程序設計, 從而消除上下文切換開銷
缺點: 當 CPU 被阻塞或根本無事可做時時間被浪費了
4.3. 羣調度 (Gang Scheduling)
4.3.1. 基本思想
讓一個進程的所有線程一起運行, 這樣互相通信更方便, 在一個時間片內可以發送和接收大量的消息.
4.3.2. 調度方法
- 把一組相關線程作爲一個單位, 即一個羣, 一起調度
- 一個羣中的所有成員在不同的分時 CPU 上同時運行
- 羣中的所有成員共同開始和結束其時間片