linux 提供CPU调度函数,可以将CPU某一个核和指定的线程绑定到一块运行。
这样能够充分利用CPU,且减少了不同CPU核之间的切换,尤其是在IO密集型压力之下能够提供较为友好的性能。

通过sched_setaffinity 设置 CPU 亲和力的掩码,从而将该线程或者进程和指定的CPU绑定

一个CPU的亲合力掩码用一个cpu_set_t结构体来表示一个CPU集合,下面的几个宏分别对这个掩码集进行操作:
CPU_ZERO() 清空一个集合
CPU_SET()CPU_CLR()分别对将一个给定的CPU号加到一个集合或者从一个集合中去掉.
CPU_ISSET()检查一个CPU号是否在这个集合中

  • 头文件 sched.h
  • sched_setaffinity(pid_t pid, unsigned int cpusetsize, cpu_set_t *mask)
    该函数设置进程为pid的这个进程,让它运行在mask所设定的CPU上.

    • 如果pid的值为0,则表示指定的是当前进程,使当前进程运行在mask所设定的那些CPU上.
    • 第二个参数cpusetsize是mask所指定的数的长度.通常设定为sizeof(cpu_set_t).如果当前pid所指定的进程此时没有运行在mask所指定的任意一个CPU上,则该指定的进程会从其它CPU上迁移到mask的指定的一个CPU上运行.
    • mask 即用户 通过CPU_SET 接口,线程ID 绑定刀片集合中的一个CPU上,使用mask来表示cpu集合中的CPU
  • sched_getaffinity(pid_t pid, unsigned int cpusetsize, cpu_set_t *mask)
    该函数获得pid所指示的进程的CPU位掩码,并将该掩码返回到mask所指向的结构中.即获得指定pid当前可以运行在哪些CPU上.同样,如果pid的值为0.也表示的是当前进程

使用方式如下:

#include <stdio.h>
#include <unistd.h>
#include <time.h>
#include <signal.h>
#include <string.h>#define __USE_GNU
#include <sched.h>
#include <pthread.h>int num;void *thread_func1(void *arg) {cpu_set_t mask;  //CPU核的集合cpu_set_t get;   //获取在集合中的CPUint *a = (int*)arg; printf("the a is:%d\n",*a);  //显示是第几个线程CPU_ZERO(&mask);    //置空CPU_SET(*a,&mask);   // 将当前线程和CPU绑定if(sched_setaffinity(0, sizeof(mask), &mask)) {printf("warning ! set affinity failed! \n");      } else {while (1){CPU_ZERO(&get);if (sched_getaffinity(0, sizeof(get), &get) == -1)//获取线程CPU亲和力{printf("warning: cound not get thread affinity, continuing...\n");}int i;for (i = 0; i < num; i++){if (CPU_ISSET(i, &get))//判断线程与哪个CPU有亲和力{printf("this thread %d is running processor : %d\n", i,i);}}}}return NULL;
}void *thread_func2(void *arg) {cpu_set_t mask;  //CPU核的集合cpu_set_t get;   //获取在集合中的CPUint *a = (int*)arg; printf("the a is:%d\n",*a);  //显示是第几个线程CPU_ZERO(&mask);    //置空CPU_SET(*a,&mask);   // 将当前线程和CPU绑定if(sched_setaffinity(0, sizeof(mask), &mask) == -1) {printf("warning ! set affinity failed! \n");      } else {while (1){CPU_ZERO(&get);if (sched_getaffinity(0, sizeof(get), &get) == -1)//获取线程CPU亲和力{printf("warning: cound not get thread affinity, continuing...\n");}int i;for (i = 0; i < num; i++){if (CPU_ISSET(i, &get))//判断线程与哪个CPU有亲和力{printf("this thread %d is running processor : %d\n", i,i);}}}}return NULL;
}int main() {pthread_t t1;pthread_t t2;int t_1 = 0;int t_2 = 1;// 获取CPU核数num = sysconf(_SC_NPROCESSORS_CONF);// 需要传入t_1,t_2,来作为线程的参数,用来核CPU核绑定pthread_create(&t1, NULL, (void *)thread_func1,&t_1);pthread_create(&t2, NULL, (void *)thread_func2,&t_2);pthread_join(t1, NULL);pthread_join(t2, NULL);printf("main thread end\n");return 0;
}

如果使用到pthread,则需要将pthread.h 放到sched.h之后,并在sched.h之前声明#define __USE_GNU
否则会出现undefined reference CPU_ZERO等错误

编译:
gcc sched_cpu.c -o sched_cpu -pthread
以上代码将两个线程分别绑定到0,1号CPU上

运行后的CPU 效果图如下:

使用 sched_setaffinity 将线程绑到CPU核上运行相关推荐

  1. 为什么要把进程/线程绑定到特定cpu核上运行?(cpu core id coreIdx)opdevsdk_sys_bindThreadCoreId()

    看海康hikflow_demo代码,在线程处理函数里调用了绑定函数,把这个线程绑定到某个cpu核上,不知为何要这么做? 原因 答1 现在大家使用的基本上都是多核cpu,一般是4核的.平时应用程序在运行 ...

  2. linux下把进程绑定到特定cpu核上运行

    现在大家使用的基本上都是多核cpu,一般是4核的.平时应用程序在运行时都是由操作系统管理的.操作系统对应用进程进行调度,使其在不同的核上轮番运行. 对于普通的应用,操作系统的默认调度机制是没有问题的. ...

  3. Qt 设置CPU亲缘性,把进程和线程绑定到CPU核心上(Linux)

    Qt 设置CPU亲缘性,把进程和线程绑定到CPU核心上(Linux) 文章目录 Qt 设置CPU亲缘性,把进程和线程绑定到CPU核心上(Linux) 摘要 1 什么是CPU亲缘性 2 目的 3 API ...

  4. c和cpp实现CPU核上绑定固定线程

    文章目录 参考链接: 相关概念及工具 CPU亲和性 查看cpu有几个核 命令查看 代码查看 代码讲解 cpu集(cpu_set_t) cpu_set_t的使用 非动态分配cpu_set_t 动态分配c ...

  5. linux下查看mysql线程_linux-如何查看线程在哪个CPU内核中运行?

    linux-如何查看线程在哪个CPU内核中运行? 在Linux中,假设线程的pid是[pid],则从目录/ proc / [pid]中我们可以获得许多有用的信息. 例如,这些proc文件/ proc ...

  6. 在 Picorv32 / 蜂鸟 E203 软核上运行 RT-Thread

    这篇文章主要介绍一下如何在2个FPGA软核上运行 RT-Thread.首先会介绍一下我用的 FPGA,接下来分别介绍在 蜂鸟 E203 和 picorv32 上运行 RT-Thread. 如果大家对如 ...

  7. Renode应用:在RISC-V核上运行FreeRTOS

    本篇记录通过Renode在RISC-V核上运行FreeRTOS demo的情况.本来不准备写这一篇,但是发现近期工作学习密度实在太大,上周工作的中间结果这周竟然完全想不起来了,不得不又花了一些时间从头 ...

  8. 两个线程能在cpu中同时运行吗_多核和多线程那些事

    作为一个程序员,线程,进程,协程这些是我们必须要掌握的最基础的知识,这就好比数学家必须要学习的基本几何原理一样,没有它们,我们在编程的世界里寸步难行. 并发和并行 并发和并行是我们经常听到的两个词,并 ...

  9. linux指定cpu运行程序,进程/线程绑定到特定CPU核的linux实现(有代码有实例)

    前言 现在计算机上的CPU大多都是多核的,有4核甚至是8核的.但是一个计算机启动之后其进程数是远远多于CPU核数的,因为操作系统会给自动调度这些进程在CPU核上轮流运行.但是对于应用程序或者进程,其性 ...

最新文章

  1. openssl私有ca创建
  2. 电子商务网站是这样诞生的
  3. 公钥,私钥,SSL(讲的很生动)
  4. jupyter 安装目录Table of Contents
  5. 28个不得不看的经典编程算法!!
  6. 数论五之容斥——硬币购物,Gerald and Giant Chess,幸运数字,Sky Full of Stars,已经没有什么好害怕的了
  7. P4083-[USACO17DEC]A Pie for a Pie G【线段树,最短路】
  8. 作者:佟继周(1976-),女,中国科学院国家空间科学中心研究室副研究员、副主任...
  9. 2009网络视频监控业务分析及市场发展研究报告
  10. 二叉树的各种操作(转)
  11. 第一章python绝对温标身体质量指数bmi
  12. 2019 年开源数据库报告发布:MySQL 仍卫冕!
  13. oracle中clob和blob,Oracle中的BLOB和CLOB
  14. C/C++[codeup 2043]小白鼠排队
  15. c++函数返回多个值_Excel函数技巧之返回多个匹配结果
  16. Python爬虫实例(六)多进程下载金庸网小说
  17. chrome(谷歌浏览器)固定到任务栏,点击之后出现两个图标-原因及解决办法
  18. GateWayWorker 部署
  19. 捷豹:车到用时方知养,可知彼时恨太迟
  20. Gluster相关命令

热门文章

  1. 【推荐】极限编程的十二大原则——小版本
  2. 目标检测计算mAP,AP,Recall,Precision的计算方式和代码(YOLO和FastRCNN等)
  3. python中ht_python – 解析HTSQL时处理语法歧义
  4. sublime python配置_sublime python环境配置
  5. 野火开发版屏幕_鸿蒙OS手机版正式发布!副总裁现场表态:我们已经准备好了...
  6. html 关闭js控件,javascript – 用JS关闭html5视频控件
  7. Android怎么隐藏前端,Android-Webview支持缩放并掩藏讨厌的缩放控制条
  8. android studio dump java heap_Android Studio 3.0 Memory Profiler使用
  9. python统计linux流量,通过Python进行MySQL表信息统计
  10. ado控件连接oracle,在Delphi 7中用ADOConnection控件连接Oracle 9i的问题