線程與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); //初始化,設為空
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,而未設置的位則對應一個不可調度的 CPU。換而言之,線程都被綁定了,只能在那些對應位被設置了的處理器上運行。通常,掩碼中的所有位都被置位了,也就是可以在所有的cpu中調度。