linux中线程与CPU核的绑定
背景
在多核平台上,可以通过将线程、进程绑定到CPU核上,进行性能优化。
这里对线程与CPU核的绑定进行一下学习记录。
线程与CPU和的绑定
不管是线程还是进程,都是通过设置亲和性(affinity)来达到目的。
对于进程的情况,一般是使用sched_setaffinity这个函数来实现。
与进程的情况相似,线程亲和性的设置和获取主要通过下面两个函数来实现:
1 | int pthread_setaffinity_np(pthread_t thread, size_t cpusetsize, |
函数分析:
从函数名以及参数名都很明了,唯一需要点解释下的可能就是cpu_set_t这个结构体了。这个结构体的理解类似于select中的fd_set,可以理解为cpu集,也是通过约定好的宏来进行清除、设置以及判断:
1 | //初始化,设为空 |
cpu集可以认为是一个掩码,每个设置的位都对应一个可以合法调度的 cpu,而未设置的位则对应一个不可调度的 CPU。换而言之,线程都被绑定了,只能在那些对应位被设置了的处理器上运行。通常,掩码中的所有位都被置位了,也就是可以在所有的cpu中调度。
示例代码
编译
1 | g++ main.cpp -fpermissive -lpthread |
这段代码将使myfun线程在所有cpu中依次执行一段时间,在我的四核cpu上,执行结果如下
总结
在一些嵌入式设备中,运行的进程线程比较单一,如果指定进程线程运行于特定的cpu核,减少进程、线程的核间切换,有可能可以获得更高的性能。
参考链接
https://www.cnblogs.com/vanishfan/archive/2012/11/16/2773325.html
源码
https://github.com/ThranduilELFKING/toolsUse/blob/main/affinity/main.cpp