CPU|思想調試:為什么4核CPU上只有一個核在工作?

CPU|思想調試:為什么4核CPU上只有一個核在工作?

在一個內部的郵件列表里 , 有人問了這樣一個問題:為什么我這4核CPU的電腦上 , 看起來只有一個核在工作 , 其他三個核好像都處于空閑狀態?如果使用任務管理器設置每個進程的親緣性(Affinity)設置為4核 , 則電腦應該會運行的更快 , 這是理所當然的 。
這個時候 , 我會開始一項所謂的”思想調試” , 也許你也可以 。
第一個提示:我的直覺告訴我 , 資源管理器(Explorer)將它的親緣性設置成只使用一個核 。 第二個提示:進程的親緣性被其子進程所繼承 。
下面是我對此問題的預測:
1. 資源管理器將線程親緣性設置單核 。
2. 因為你預覽了一個MPG視頻文件 。
3. MPG的解碼器在其DLL_PROCESS_ATTACH中調用了SetProcessAffinityMask 。
4. 因為解碼器的作者無法修復多處理器下的Bug 。
5. 因此 , 他簡單地將進程親緣性設置為1 , 從而”修復”了這個Bug 。
雖然我的第一個預測是正確的 , 但其他幾個都預測錯了 。 雖然如此 , 開發團隊走在了正確的路上 , 并成功地引導了進一步的問題研究 。
真正的問題原因【CPU|思想調試:為什么4核CPU上只有一個核在工作?】有一個第三方外殼擴展 , 由于它的作者無法解決擴展在多處理器運行場景下的Bug , 于是他決定 , 使用SetProcessAffinityMask來將當前進程(也即資源管理器進程)鎖定到一個單一的處理器核心上 。 ”Woo-hoo , 我們一次性解決了所有多處理器Bug , 可以出去慶祝慶祝了 。 ”
因為進程的親緣性是可以繼承的 , 這導致了所有被資源管理器所啟動的進程都繼承了此屬性 , 也即它們只會在一個核上運行 , 即使當前機器配備了一個強大且昂貴的4核CPU 。
(后記 , 我們聯系了這家開發外殼擴展的公司 , 他們聲稱這個問題已經在其最新的版本中得到了修復 。 )
總結大多數情況下 , 你不需要設置親緣性 , 使用系統默認的設定就好 。
在極少數情況下 , 當確實需要設置時 , 記得:你的進程的所有子進程都會繼承這個設置 。
最后Raymond Chen的《The Old New Thing》是我非常喜歡的博客之一 , 里面有很多關于Windows的小知識 , 對于廣大Windows平臺開發者來說 , 確實十分有幫助 。
本文來自:《Psychic debugging: Why your expensive four-processor machine is ignoring three of its processors》

    相關經驗推薦