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

您所在的位置:网站首页 柳州五菱小货车前挡风玻璃多少钱 【Linux实时编程之CPU亲和度】如何将线程和某一个CPU核绑定

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

2024-01-08 17:40| 来源: 网络整理| 查看: 265

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



【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3