在上一片文章中,我们介绍了如何将特定的某几个CPU核心空闲下来,这篇文章随之介绍、在多CPU系统中,通过sched_setaffinity()可以设置进程的CPU亲和力,使进程绑定在某一个或几个CPU上运行,避免在CPU之间来回切换,从而提高该进程的实时性能。
http://t.csdn.cn/OzmmG
进程绑定cpu
CPU集合
cpu_set_t mask;
cpu_set_t用来描述CPU的集合,被sched_setaffinity等类似的函数使用。cpu_set_t实际就是一个__cpu_mask(无符号long类型)数组,并且数组所占的总位宽为1024。
CPU_ZERO(&mask);
清空集合,即set1里不包含任何CPU,本质为所有bit清零
CPU_SET(0, &mask);
将cpu0添加到集合set1中,本质为对应bit置1
CPU_CLR(0, &mask);
将cpu0从集合set1中移除,本质为对应bit清零
int ret = CPU_ISSET(1, &mask);
判断cpu1是否在集合set2中,在返回非零,不在返回0
CPU_COUNT(&mask);
返回集合set2中的CPU的个数
CPU_AND(&result, &set1, &set2);
set1和set2的所有bit按位与,结果存入result
CPU_OR();
按位或
CPU_XOR();
按位异或
CPU_EQUAL(&set1, &set2);
集合set1和集合set2相等的话,ret为非零,不相等,ret为0
CPU亲和性
绑定任务到指定CPU
CPU亲和性只是一种倾向性,当绑定的CPU不存在或者存在但是被禁用了,任务会在其他的CPU上执行【1】
- sched_setaffinity:修改指定pid_t的任务的亲和性
- pthread_setaffinity_np:gnu接口,修改指定pthrad_t的任务的亲和性。
- pthread_attr_setaffinity_np:gnu接口。创建线程前,通过线程属性结构体控制新线程的亲和性。
sche_setaffinity
如果考虑可移植性的话,推荐使用sched_setaffinity()函数将任务绑定到特定CPU执行。
sche_setaffinity(0, sizeof(cpu_set_t), &mask) ;
但是,sched_setaffinity函数的不方便之处在于,无法给线程指定亲和性,要用sched_setaffinity给线程指定亲和性,比较麻烦,需要使用到不可移植的函数gettid()。
int tid = syscall(SYS_gettid)
sche_setaffinity(tid, sizeof(cpu_set_t), &mask) ;
pthread_setaffinity_np
如果要设置已存在的线程的亲和性,就可以考虑使用pthread_setaffinity_np,尽管pthread_setaffinity_np是不可移植的,是gnu独有的。因为就算是考虑到移植性,想要使用sched_setaffinity,也避免不了要使用gettid函数(该函数也是gnu独有)。与使用sched_setaffinity设置线程亲和性相比,使用pthread_setaffinity_np的另一个好处就是,可以在线程外设置任一线程的亲和性(只要知道pthread_t即可),而sched_setaffinity的gettid,需要在线程函数内调用。【1】
pthread_create(&th2, NULL, func, "th2");
pthread_setaffinity_np(th1, sizeof(cpu_set_t), &set);
【1】https://blog.csdn.net/u013511885/article/details/126427521