Linux中線程與CPU核的繫結

2021-06-21 00:00:14 字數 1858 閱讀 1872

最近在對專案進行效能優化,由於在多核平台上,所以了解了些程序、執行緒繫結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中排程。

以下為測試**:

#define _gnu_source

#include #include #include #include #include #include void *myfun(void *arg)

cpu_zero(&get);

if (pthread_getaffinity_np(pthread_self(), sizeof(get), &get) < 0)

for (j = 0; j < num; j++)

}j = 0;

while (j++ < 100000000)

}pthread_exit(null);

}int main(int argc, char *argv)

pthread_join(tid, null);

return 0;

}

這段**將使myfun執行緒在所有cpu中依次執行一段時間,在我的四核cpu上,執行結果為:

system has 4 processor(s)

thread 1095604544 is running in processor 0

thread 1095604544 is running in processor 1

thread 1095604544 is running in processor 2

thread 1095604544 is running in processor 3

在一些嵌入式裝置中,執行的程序執行緒比較單一,如果指定程序執行緒執行於特定

的cpu核,

減少程序、執行緒的核間切換,有可能可以獲得更高的效能。

Linux中線程與CPU核的繫結

最近在對專案進行效能優化,由於在多核平台上,所以了解了些程序 執行緒繫結cpu核的問題,在這裡將所學記錄一下。不管是執行緒還是程序,都是通過設定親和性 affinity 來達到目的。對於程序的情況,一般是使用sched setaffinity這個函式來實現,網上講的也比較多,這裡主要講一下執行緒的情...

Linux中線程與CPU核的繫結

不管是執行緒還是程序,都是通過設定親和性 affinity 來達到目的。與程序的情況相似,執行緒親和性的設定和獲取主要通過下面兩個函式來實現 int pthread setaffinity np pthread t thread size t cpusetsize,const cpu set t c...

CPU的核與執行緒 4核8執行緒

邏輯cpu 單核cpu和多核cpu 總結 cat proc cpuinfo物理cpu就是計算機上實際配置的cpu個數。在linux上可以開啟cat proc cpuinfo來檢視,其中的physical id就是每個物理cpu的id,能找到幾個physical id就代表計算機實際有幾個cpu。在l...