回覆列表
  • 1 # lanfengz3

    實現方法程序與指定cpu繫結

    :SetProcessAffinityMask(GetCurrentProcess(),dwMask);

    執行緒與指定cpu繫結:

    SetThreadAffinityMask(GetCurrentThread(),dwMask);dwMask為CPU序號的或運算值:1(0001)

    代表只執行在CPU1,2(0010)代表只執行在CPU2,3(0011)代表可以執行在CPU1和CPU2

    ,以此類推。

    設定之前最好判斷一下系統有幾個CPU:

    SYSTEM_INFOSystemInfo;

    GetSystemInfo(&SystemInfo);CPU個數:SystemInfo.dwNumberOfProcessors

    當前啟用的CPU序號:

    SystemInfo.dwActiveProcessorMask

    ,Mask representing the set of processors configured into the system. Bit 0 is processor 0;

    bit 31 is processor 31.

    CPU親緣性介紹

    按照預設設定,當系統將執行緒分配給處理器時,Windows使用軟親緣性來進行操作。這意味著如果所有其他因素相同的話,它將設法在它上次執行的那個處理器上執行執行緒。讓執行緒留在單個處理器上,有助於重複使用仍然在處理器的記憶體快取記憶體中的資料。

    有一種新的計算機結構,稱為NUMA(非統一記憶體訪問),在該結構中,計算機包含若干塊外掛板,每個插 件板上有4個CPU和它自己的記憶體區。

    當CPU訪問的記憶體是它自己的外掛板上的記憶體時,NUMA系統執行的效能最好。如果CPU需要訪問位於另一個外掛板上的內 存時,就會產生巨大的效能降低。在這樣的環境中,就需要限制來自一個程序中的執行緒在共享同一個外掛版的CPU上執行。

    為了適應這種計算機結構的需要,Windows允許你設定程序和執行緒的親緣性。換句話說,你可以控制哪個CPU能夠執行某些執行緒。這稱為硬親緣性。請注意,子程序可以繼承程序的親緣性。

    注意:(1)無論計算機中實際擁有多少個CPU,Windows98及以前系統只使用一個CPU,上述API不被支援。

    (2)在大多數環境中,改變執行緒的親緣性就會影響排程程式有效地在 各個CPU之間移植執行緒的能力,而這種能力可以最有效地使用CPU時間。

    應用場景舉例:

    將UI執行緒限制在一個CPU,將其他實時性要求較高的執行緒限制在另一個CPU。這樣,當UI需要佔用大量CPU時間時,就不會拖累其他實時性要求較高的執行緒的執行

    。同樣可以將UI執行緒與一些優先順序不高但耗時的非同步運算執行緒設定在不同CPU上,避免UI給人卡頓的感覺。

  • 中秋節和大豐收的關聯?
  • 球迷,各大平臺著名足球評論員經常有人說梅西球王,為什麼沒有說C羅是球王?