【Linux实时编程之CPU亲和度】如何将线程和某一个CPU核绑定

8 篇文章 0 订阅
5 篇文章 0 订阅

在上一片文章中,我们介绍了如何将特定的某几个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

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值