博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux cpu亲和力
阅读量:1980 次
发布时间:2019-04-27

本文共 2314 字,大约阅读时间需要 7 分钟。

最近在对项目进行性能优化,由于在多核平台上,所以了解了些进程、线程绑定cpu核的问题,在这里将所学记录一下。

不管是线程还是进程,都是通过设置亲和性(affinity)来达到目的。对于[进程]的情况,一般是使用sched_setaffinity这个函数来实现,网上讲的也比较多,这里主要讲一下[线程]的情况。

与[进程]的情况相似,[线程]亲和性的设置和获取主要通过下面两个函数来实现:

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这个结构体了。这个结构体的理解类似于select中的fd_set, 可以理解为cpu集,也是通过约定好的宏来进行清除、设置以及判断:

void CPU_ZERO (cpu_set_t *set);         //初始化,设为空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集中设置了

cpu集可以认为是一个掩码,每个设置的位都对应一个可以合法调度的 cpu,而未设置的位则对应一个不可调度的 CPU。换而言之,线程都被绑定了,只能在那些对应位被设置了的处理器上运行。通常,掩码中的所有位都被置位了,也就是可以在所有的cpu中调度。

以下为测试代码:

#define _GNU_SOURCE#include 
#include
#include
#include
#include
#include
void *myfun(void *arg){ cpu_set_t mask; cpu_set_t get; char buf[256]; int i; int j; int num = sysconf(_SC_NPROCESSORS_CONF); printf("system has %d processor(s)\n", num); for (i = 0; i < num; i++) { CPU_ZERO(&mask); CPU_SET(i, &mask); if (pthread_setaffinity_np(pthread_self(), sizeof(mask), &mask) < 0) { fprintf(stderr, "set thread affinity failed\n"); } CPU_ZERO(&get); if (pthread_getaffinity_np(pthread_self(), sizeof(get), &get) < 0) { fprintf(stderr, "get thread affinity failed\n"); } for (j = 0; j < num; j++) { if (CPU_ISSET(j, &get)) { printf("thread %d is running in processor %d\n", (int)pthread_self(), j); } } j = 0; while (j++ < 100000000) { memset(buf, 0, sizeof(buf)); } } pthread_exit(NULL);}int main(int argc, char *argv[]){ pthread_t tid; if (pthread_create(&tid, NULL, (void *)myfun, NULL) != 0) { fprintf(stderr, "thread create failed\n"); return -1; } pthread_join(tid, NULL); return 0;}

这段代码将使myfun线程在所有cpu中,依次执行一段时间,在我的四核cpu上,执行结果为  :

system has 4 processor(s)           thread 1095604544 is running in processor 0           thread 1095604544 is running in processor 1           thread 1095604544 is running in processor 2           thread 1095604544 is running in processor 3

在一些嵌入式设备中,运行的进程线程比较单一,如果指定进程线程运行于特定的cpu核,减少进程、线程的核间切换,有可能可以获得更高的性能。

  回复「 篮球的大肚子」进入技术群聊

回复「1024」获取1000G学习资料

转载地址:http://qcepf.baihongyu.com/

你可能感兴趣的文章
HDU-2838 Cow Sorting(树状数组)
查看>>
POJ-2299 Ultra-QuickSort(树状数组)(离散化)
查看>>
POJ-3107 Godfather & POJ-2378 Tree Cutting(树的重心)
查看>>
基于SSM的兼职论坛系统的设计与实现
查看>>
基于java的图书管理系统的设计与实现
查看>>
基于java的SSM框架理财管理系统的设计与实现
查看>>
基于java的ssm框架就业信息管理系统的设计
查看>>
基于java的ssm框架的旅游网站设计与实现
查看>>
基于java的SSM框架的流浪猫救助网站的设计与实现
查看>>
基于java的SSM框架的教务关系系统的设计与实现
查看>>
别再问我什么是A/B测试了!
查看>>
如何用同期群分析模型提升留存?(Tableau实战)
查看>>
爱了,吹爆这个高颜值的流程图工具!
查看>>
一个数据项目
查看>>
基于JAVA_JSP电子书下载系统
查看>>
基于java出租车计价器设计与实现
查看>>
基于java的B2C的网上拍卖系统
查看>>
十二时辰篇:这该死的 996
查看>>
2021最新 上海互联网公司排名
查看>>
字节vs快手!取消大小周之战
查看>>