Windows Internals 笔记——关联性
1.默認(rèn)情況下,Windows Vista在給線程分配處理器時,使用軟關(guān)聯(lián)。意思是如果其他因素都一樣,系統(tǒng)將使線程在上一次運行的處理器上運行。讓線程始終在同一個處理器上運行有助于重用仍在處理器高速緩存中的數(shù)據(jù)。
?
2.有一種稱為NUMA的計算機體系結(jié)構(gòu),結(jié)構(gòu)的計算機由多個系統(tǒng)板組成,每個系統(tǒng)版都有自己的CPU和內(nèi)存塊。任何線程都可以在這些CPU中任何一個上運行。如果CPU需要訪問其他系統(tǒng)板上的內(nèi)存,性能會下降的厲害。為了支持這種體系結(jié)構(gòu),Windows Vista允許我們設(shè)置進(jìn)程和線程的關(guān)聯(lián)性。也就是說,我們可以控制CPU讓哪些CPU運行特定的線程。這稱為硬關(guān)聯(lián)。
?
?
3.默認(rèn)情況下,系統(tǒng)可以將任何CPU調(diào)度給任何線程使用。如果要限制某些線程只在可用CPU的一個子集上運行,則可以調(diào)用SetProcessAffinityMask(HANDLE hProcess, DWORD_PTR dwProcessAffinityMask),第二個參數(shù)代表線程可以在哪些CPU上運行。例如傳入0x00000005意味著這個進(jìn)程中的線程可以在CPU0和CPU2上運行,但是不能在CPU1和CPU3~31上運行。
?
4.請注意,子進(jìn)程將繼承進(jìn)程關(guān)聯(lián)性。此外,我們還可以使用作業(yè)內(nèi)核對象來限制一組進(jìn)程只在一組CPU上運行。
?
5.可以通過調(diào)用SetThreadAffinityMask分別設(shè)置各線程的關(guān)聯(lián)性掩碼。
?
6.當(dāng)一個x86系統(tǒng)啟動時,系統(tǒng)將執(zhí)行代碼,檢查主機上的哪個CPU存在著名的Pentium浮點bug。系統(tǒng)必須對每個CPU做這項檢查。檢查的方法是,將一個線程的關(guān)聯(lián)性設(shè)置為該CPU,執(zhí)行可能會出錯的除法操作,然后比較結(jié)果是否與已知正確的結(jié)果相符。隨后再采用同樣的步驟檢查下一個CPU,依次類推。
?
7.在大多數(shù)環(huán)境里,改變線程的關(guān)聯(lián)性,將妨礙調(diào)度程序的這種能力,下面給出一個例子:
?
?
8.要給線程設(shè)置一個理想的CPU(也允許系統(tǒng)將它移到另一個空閑的CPU),可以調(diào)用SetThreadIdealProcessor(HANDLE hThread, DWORD dwIdealProcessor),dwIdealProcessor不是位掩碼,它是一個0到31/63之間的整數(shù),表示線程希望設(shè)置的CPU。可以傳入MAXIMUN_PROCESSORS值(在WinNT.h中定義,32位操作系統(tǒng)中定義為32,64位操作系統(tǒng)中定義為64),表示線程沒有理想的CPU。
?
9.當(dāng)Windows Vista在x86計算機上啟動時,我們可以限制系統(tǒng)將使用的CPU數(shù)量(修改啟動配置數(shù)據(jù) BCD)。
轉(zhuǎn)載于:https://www.cnblogs.com/zoneofmine/p/9886002.html
總結(jié)
以上是生活随笔為你收集整理的Windows Internals 笔记——关联性的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Dubbo入门介绍---搭建一个最简单的
- 下一篇: [源码和文档分享]基于JAVA EE框架