使用 sched_setaffinity 将线程绑到CPU核上运行
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核上运行相关推荐
- 为什么要把进程/线程绑定到特定cpu核上运行?(cpu core id coreIdx)opdevsdk_sys_bindThreadCoreId()
看海康hikflow_demo代码,在线程处理函数里调用了绑定函数,把这个线程绑定到某个cpu核上,不知为何要这么做? 原因 答1 现在大家使用的基本上都是多核cpu,一般是4核的.平时应用程序在运行 ...
- linux下把进程绑定到特定cpu核上运行
现在大家使用的基本上都是多核cpu,一般是4核的.平时应用程序在运行时都是由操作系统管理的.操作系统对应用进程进行调度,使其在不同的核上轮番运行. 对于普通的应用,操作系统的默认调度机制是没有问题的. ...
- Qt 设置CPU亲缘性,把进程和线程绑定到CPU核心上(Linux)
Qt 设置CPU亲缘性,把进程和线程绑定到CPU核心上(Linux) 文章目录 Qt 设置CPU亲缘性,把进程和线程绑定到CPU核心上(Linux) 摘要 1 什么是CPU亲缘性 2 目的 3 API ...
- c和cpp实现CPU核上绑定固定线程
文章目录 参考链接: 相关概念及工具 CPU亲和性 查看cpu有几个核 命令查看 代码查看 代码讲解 cpu集(cpu_set_t) cpu_set_t的使用 非动态分配cpu_set_t 动态分配c ...
- linux下查看mysql线程_linux-如何查看线程在哪个CPU内核中运行?
linux-如何查看线程在哪个CPU内核中运行? 在Linux中,假设线程的pid是[pid],则从目录/ proc / [pid]中我们可以获得许多有用的信息. 例如,这些proc文件/ proc ...
- 在 Picorv32 / 蜂鸟 E203 软核上运行 RT-Thread
这篇文章主要介绍一下如何在2个FPGA软核上运行 RT-Thread.首先会介绍一下我用的 FPGA,接下来分别介绍在 蜂鸟 E203 和 picorv32 上运行 RT-Thread. 如果大家对如 ...
- Renode应用:在RISC-V核上运行FreeRTOS
本篇记录通过Renode在RISC-V核上运行FreeRTOS demo的情况.本来不准备写这一篇,但是发现近期工作学习密度实在太大,上周工作的中间结果这周竟然完全想不起来了,不得不又花了一些时间从头 ...
- 两个线程能在cpu中同时运行吗_多核和多线程那些事
作为一个程序员,线程,进程,协程这些是我们必须要掌握的最基础的知识,这就好比数学家必须要学习的基本几何原理一样,没有它们,我们在编程的世界里寸步难行. 并发和并行 并发和并行是我们经常听到的两个词,并 ...
- linux指定cpu运行程序,进程/线程绑定到特定CPU核的linux实现(有代码有实例)
前言 现在计算机上的CPU大多都是多核的,有4核甚至是8核的.但是一个计算机启动之后其进程数是远远多于CPU核数的,因为操作系统会给自动调度这些进程在CPU核上轮流运行.但是对于应用程序或者进程,其性 ...
最新文章
- openssl私有ca创建
- 电子商务网站是这样诞生的
- 公钥,私钥,SSL(讲的很生动)
- jupyter 安装目录Table of Contents
- 28个不得不看的经典编程算法!!
- 数论五之容斥——硬币购物,Gerald and Giant Chess,幸运数字,Sky Full of Stars,已经没有什么好害怕的了
- P4083-[USACO17DEC]A Pie for a Pie G【线段树,最短路】
- 作者:佟继周(1976-),女,中国科学院国家空间科学中心研究室副研究员、副主任...
- 2009网络视频监控业务分析及市场发展研究报告
- 二叉树的各种操作(转)
- 第一章python绝对温标身体质量指数bmi
- 2019 年开源数据库报告发布:MySQL 仍卫冕!
- oracle中clob和blob,Oracle中的BLOB和CLOB
- C/C++[codeup 2043]小白鼠排队
- c++函数返回多个值_Excel函数技巧之返回多个匹配结果
- Python爬虫实例(六)多进程下载金庸网小说
- chrome(谷歌浏览器)固定到任务栏,点击之后出现两个图标-原因及解决办法
- GateWayWorker 部署
- 捷豹:车到用时方知养,可知彼时恨太迟
- Gluster相关命令
热门文章
- 【推荐】极限编程的十二大原则——小版本
- 目标检测计算mAP,AP,Recall,Precision的计算方式和代码(YOLO和FastRCNN等)
- python中ht_python – 解析HTSQL时处理语法歧义
- sublime python配置_sublime python环境配置
- 野火开发版屏幕_鸿蒙OS手机版正式发布!副总裁现场表态:我们已经准备好了...
- html 关闭js控件,javascript – 用JS关闭html5视频控件
- Android怎么隐藏前端,Android-Webview支持缩放并掩藏讨厌的缩放控制条
- android studio dump java heap_Android Studio 3.0 Memory Profiler使用
- python统计linux流量,通过Python进行MySQL表信息统计
- ado控件连接oracle,在Delphi 7中用ADOConnection控件连接Oracle 9i的问题