線程綁定CPU

線程綁定CPU,顧名思義,就是建立線程和某個或某些CPU的關聯,使得線程只能運行在指定的CPU上。個人認爲,這有三個好處:

1.減小L1 L2cache的miss

2.減少線程調度的開銷

3.合理分配計算資源給I/O密集型線程和CPU密集型線程。

具體到實現上,不管是線程還是進程,都是通過設置親和性(affinity)來達到目的。對於進程的情況,一般是使用sched_setaffinity這個函數來實現,網上講的也比較多,這裏主要講一下線程的情況。

    與進程的情況相似,線程親和性的設置和獲取主要通過下面兩個函數來實現:
int pthread_setaffinity_np(pthread_t thread, size_t cpusetsize,
const cpu_set_t *cpuset);
int pthread_getaffinity_np(pthread_t thread, size_t cpusetsize, 
cpu_set_t *cpuset);
    從函數名以及參數名都很明瞭,唯一需要點解釋下的可能就是cpu_set_t這個結構體了。這個結構體的理解類似於select中的fd_set,可以理解爲cpu集,也是通過約定好的宏來進行清除、設置以及判斷:
//初始化,設爲空
      void CPU_ZERO (cpu_set_t *set); 
      //將某個cpu加入cpu集中 
       void CPU_SET (int cpu, cpu_set_t *set); 
       //將某個cpu從cpu集中移出 
       void CPU_CLR (int cpu, cpu_set_t *set); 
       //判斷某個cpu是否已在cpu集中設置了 
       int CPU_ISSET (int cpu, const cpu_set_t *set); 
       cpu集可以認爲是一個掩碼,每個設置的位都對應一個可以合法調度的 cpu,而未設置的位則對應一個不可調度的 CPU。換而言之,線程都被綁定了,只能在那些對應位被設置了的處理器上運行。通常,掩碼中的所有位都被置位了,也就是可以在所有的cpu中調度。       

 

發佈了78 篇原創文章 · 獲贊 9 · 訪問量 23萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章