線程與CPU核綁定
不管是線程還是進(jìn)程,都是通過設(shè)置親和性(affinity)來達(dá)到目的。對于進(jìn)程的情況,一般是使用sched_setaffinity()來實(shí)現(xiàn)。
與進(jìn)程的情況相似,線程親和性的設(shè)置和獲取主要通過下面兩個(gè)函數(shù)來實(shí)現(xiàn):
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這個(gè)結(jié)構(gòu)體類似于select中的fd_set,可以理解為cpu集,也是通過約定好的宏來進(jìn)行清除、設(shè)置以及判斷:
void CPU_ZERO (cpu_set_t *set); //初始化,設(shè)為空
void CPU_SET (int cpu, cpu_set_t *set); //將某個(gè)cpu加入cpu集中
void CPU_CLR (int cpu, cpu_set_t *set); //將某個(gè)cpu從cpu集中移出
int CPU_ISSET (int cpu, const cpu_set_t *set); //判斷某個(gè)cpu是否已在cpu集中設(shè)置了
cpu集可以認(rèn)為是一個(gè)掩碼,每個(gè)設(shè)置的位都對應(yīng)一個(gè)可以合法調(diào)度的 cpu,而未設(shè)置的位則對應(yīng)一個(gè)不可調(diào)度的 CPU。換而言之,線程都被綁定了,只能在那些對應(yīng)位被設(shè)置了的處理器上運(yùn)行。通常,掩碼中的所有位都被置位了,也就是可以在所有的cpu中調(diào)度。