1. 程式人生 > >Windows Internals 筆記——關聯性

Windows Internals 筆記——關聯性

1.預設情況下,Windows Vista在給執行緒分配處理器時,使用軟關聯。意思是如果其他因素都一樣,系統將使執行緒在上一次執行的處理器上執行。讓執行緒始終在同一個處理器上執行有助於重用仍在處理器快取記憶體中的資料。

 

2.有一種稱為NUMA的計算機體系結構,結構的計算機由多個系統板組成,每個系統版都有自己的CPU和記憶體塊。任何執行緒都可以在這些CPU中任何一個上執行。如果CPU需要訪問其他系統板上的記憶體,效能會下降的厲害。為了支援這種體系結構,Windows Vista允許我們設定程序和執行緒的關聯性。也就是說,我們可以控制CPU讓哪些CPU執行特定的執行緒。這稱為硬關聯。

 

 

3.預設情況下,系統可以將任何CPU排程給任何執行緒使用。如果要限制某些執行緒只在可用CPU的一個子集上執行,則可以呼叫SetProcessAffinityMask(HANDLE hProcess, DWORD_PTR dwProcessAffinityMask),第二個引數代表執行緒可以在哪些CPU上執行。例如傳入0x00000005意味著這個程序中的執行緒可以在CPU0和CPU2上執行,但是不能在CPU1和CPU3~31上執行。

 

4.請注意,子程序將繼承程序關聯性。此外,我們還可以使用作業核心物件來限制一組程序只在一組CPU上執行。

 

5.可以通過呼叫SetThreadAffinityMask分別設定各執行緒的關聯性掩碼。

 

6.當一個x86系統啟動時,系統將執行程式碼,檢查主機上的哪個CPU存在著名的Pentium浮點bug。系統必須對每個CPU做這項檢查。檢查的方法是,將一個執行緒的關聯性設定為該CPU,執行可能會出錯的除法操作,然後比較結果是否與已知正確的結果相符。隨後再採用同樣的步驟檢查下一個CPU,依次類推。

 

7.在大多數環境裡,改變執行緒的關聯性,將妨礙排程程式的這種能力,下面給出一個例子:

 

 

8.要給執行緒設定一個理想的CPU(也允許系統將它移到另一個空閒的CPU),可以呼叫SetThreadIdealProcessor(HANDLE hThread, DWORD dwIdealProcessor),dwIdealProcessor不是位掩碼,它是一個0到31/63之間的整數,表示執行緒希望設定的CPU。可以傳入MAXIMUN_PROCESSORS值(在WinNT.h中定義,32位作業系統中定義為32,64位作業系統中定義為64),表示執行緒沒有理想的CPU。

 

9.當Windows Vista在x86計算機上啟動時,我們可以限制系統將使用的CPU數量(修改啟動配置資料 BCD)。