最近在对项目进行性能优化,由于在多核平台上,所以了解了些进程、线程绑定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 <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#include <sched.h>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学习资料

Linux cpu亲和力相关推荐

  1. Linux线程性能分析和CPU亲和力

    一,线程迁移和负载均衡 Linux系统在多核CPU和SMP系统上有完善的负载均衡支持.在SMP系统中,每个CPU的核都有一个迁移线程守护程序migration(一般是系统最高优先级139,实时99), ...

  2. linux c设置cpu亲和力,关于多线程:如何设置特定pthread的CPU亲和力?

    我想指定特定pthread的cpu亲和力. 到目前为止,我发现的所有引用都涉及设置进程(pid_t)而不是线程(pthread_t)的cpu亲和力. 我尝试了一些传递pthread_t的实验,并且按预 ...

  3. Unix/Linux编程:CPU亲和力

    CPU亲和力 当一个进程在一个多处理器系统上被重新调度时无需在上一次执行的CPU上运行.之所以会在另一个CPU上运行的原因是原来的CPU处于忙碌状态. 进程切换CPU时对性能会有一定的影响:如果在原来 ...

  4. Nginx运行CPU亲和力

    Nginx运行CPU亲和力 1.Nginx运行工作进程数量 Nginx运行工作进程个数一般设置CPU的核心或者核心数x2.如果不了解cpu的核数,可以top命令之后按1看出来,也可以查看/proc/c ...

  5. linux cpu load 值,理解Linux系统中的load average(图文版)转

    一.什么是load average? linux系统中的Load对当前CPU工作量的度量 (WikiPedia: the system load is a measure of the amount ...

  6. linux判断cpu是否过载,Linux CPU 如何判断忙

    原标题:Linux CPU 如何判断忙 摘录自:http://www.ruanyifeng.com/blog/2016/12/user_space_vs_kernel_space.html 学习 Li ...

  7. linux cpu大小,如何查看linux cpu大小

    有时候想要查看下linux cpu的大小!用什么方法好呢?下面由学习啦小编给你做出详细的查看linux cpu大小方法介绍!希望对你有帮助! 查看linux cpu大小方法一 一.linux CPU大 ...

  8. 校招面试问到Linux CPU不用怕,来看看这份宝典

    校招面试问到Linux CPU不用怕,来看看这份宝典 原创小目网易游戏运维平台 小目 网易游戏资深运维工程师,负责<阴阳师>.<明日之后>等多款游戏运维工作. 又是一年校招季, ...

  9. 慢慢欣赏linux CPU占用率和负载

    CPU使用率如何计算,可以参考busybox的实现 其原理是每隔5s读一次/proc/stat,两次的值相减作为CPU占用率. /proc/stat的含义详见附件. int top_main(int ...

最新文章

  1. 干货:排名前 16 的 Java 工具类!
  2. Docker运行PostgreSQL
  3. android SQLite 批量插入数据慢的解决方案 (针对于不同的android api 版本)
  4. Intellij IDEA运行报Command line is too long解法
  5. href 和 src 的区别
  6. hdu 4501 小明系列故事——买年货 多重背包
  7. numeric column can contains null
  8. 科目移动类型替代规则总结
  9. KVM安装、镜像创建(一)
  10. jQuery使用(八):运动方法
  11. java如何获取文件路径_java如何获取文件路径
  12. python统计词频_Python中文分词及词频统计
  13. 用AlphaGo背后的人工智能做金融投资
  14. Android全局变量使用
  15. 夏书祥-淘宝考试最新答案
  16. 我从来都不是什么好人——脚本小子智斗绿茶小妹
  17. SQLServer锁表
  18. 二进制流序列化(反序列化)和XML序列化(反序列化)
  19. Linux 挂载4T硬盘到根目录
  20. adb通过无线wifi连接安卓手机

热门文章

  1. 在Visual Studio上开发Node.js程序(2)——远程调试及发布到Azure
  2. c6011取消对null指针的引用_C++| 函数的指针参数如何传递内存?
  3. 《操作系统》OS学习(一):OS相关
  4. html section 布局,section标签的用法
  5. matlab var std,Matlab var std cov 函数解析
  6. python线程状态_Python线程
  7. python compare excel_python简单操作excle的方法
  8. Day08-函数(3)
  9. mysql 停止服务内存_服务器莫名的内存高占用 导致 MySQL 停止运行问题
  10. 如何用python打印田字格_如何用 3D 打印一双顶级跑鞋回形针