線程與CPU核綁定
不管是線程還是進程,都是通過設(shè)置親和性(affinity)來達(dá)到目的匙瘪。對于進程的情況铆铆,一般是使用sched_setaffinity()
來實現(xiàn)。
與進程的情況相似丹喻,線程親和性的設(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這個結(jié)構(gòu)體類似于select中的fd_set薄货,可以理解為cpu集,也是通過約定好的宏來進行清除驻啤、設(shè)置以及判斷:
void CPU_ZERO (cpu_set_t *set); //初始化菲驴,設(shè)為空
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集中設(shè)置了
cpu集可以認(rèn)為是一個掩碼,每個設(shè)置的位都對應(yīng)一個可以合法調(diào)度的 cpu骑冗,而未設(shè)置的位則對應(yīng)一個不可調(diào)度的 CPU赊瞬。換而言之先煎,線程都被綁定了,只能在那些對應(yīng)位被設(shè)置了的處理器上運行巧涧。通常薯蝎,掩碼中的所有位都被置位了,也就是可以在所有的cpu中調(diào)度谤绳。