迄今為止,我們主要集中討論單處理器系統的 CPU 排程問題。如果有多個 CPU,則負載分配成為可能,但是排程問題就相應地更為複雜。許多可能的方法都已試過,但與單處理器排程一樣,沒有最好的解決方案。
多處理器排程的方法
對於多處理器系統,CPU 排程的一種方法是讓一個處理器(主伺服器)處理所有排程決定、I/O 處理以及其他系統活動,其他的處理器只執行使用者程式碼。這種非對稱多處理很簡單,因為只有一個處理器存取系統資料結構,減少了資料共用的需要。
第二種方法是使用
對稱多處理(SMP),即每個處理器自我排程。所有進程可能處於一個共同的就緒佇列中,或每個處理器都有它自己的私有就緒進程佇列。不管如何,排程這樣進行:每個處理器的排程程式都檢查共同就緒佇列,以便選擇執行一個進程。如果多個處理器試圖存取和更新一個共同的資料結構,那麼每個處理器必須仔細程式設計,必須確保兩個處理器不會選擇同一進程,而且進程不會從佇列中丟失。
幾乎所有現代作業系統,包括 Windows、Linux 和 Mac OSX,都支援 SMP。本節餘下部分討論有關 SMP 系統的多個問題。
處理器親和性
考慮一下,當一個進程執行在一個特定處理器上時快取會發生些什麼。進程最近存取的資料更新了處理器的快取。結果,進程的後續記憶體存取通常通過快取來滿足。
現在考慮一下,如果進程移到其他處理器上則會發生什麼。第一個處理器快取的內容應設為無效,第二個處理器快取應重新填充。由於快取的無效或重新填充的代價高,大多數 SMP 系統試圖避免將進程從一個處理器移到另一個處理器,而是試圖讓一個進程執行在同一個處理器上。這稱為
處理器親和性,即一個進程對它執行的處理器具有親和性。
處理器的親和性具有多種形式。當一個作業系統試圖保持進程執行在同一處理器上時(但不保證它會這麼做),這種情況稱為
軟親和性。這裡,作業系統試圖保持一個進程在某個處理器上,但是這個進程也可遷移到其他處理器。相反,有的系統提供系統呼叫以便支援
硬親和性,從而允許某個進程執行在某個處理器子集上。
許多系統提供軟的和硬的親和性。例如,Linux 實現軟親和性,但是它也提供系統呼叫 sched_setaffinity() 以支援硬親和性。
圖 1 NUMA 與 CPU 排程