【Linux 编程】线程绑定 CPU
1. 绑定目的
在 Linux 系统中,线程调度是由内核自主完成的。当系统运行在多核 CPU 上时,线程有可能在不同的 CPU 核上来回切换运行。这不利于 CPU 的缓存,缺页率较高。
以 Intel i5 CPU 为例。在多核 CPU 结构中,每个 CPU 有各自的 L1、L2 缓存,而 L3 缓存是共用的。如果一个线程在 CPU 间来回切换,各个 CPU 的缓存的命中率将会降低。而如果线程不管如何调度,都始终可以在一个 CPU 上执行,那么其数据的 L1、L2 缓存的命中率将得到显著提高。
2. 使用命令进行绑定
使用命令 taskset 可以把线程绑定为指定 CPU 上。
taskset 命令使用方法如下:
taskset -p <cpu_set> <pid>
线程的 pid 可以使用 pstree -p | grep <pthread_name>
来获取。但该方法的前提是线程必须已设置名称,否则无法使用 pstree 来查看线程。
cpu_set 为线程对应的 CPU 集,为整型类型,其数值为 1 的 bit 位对应着哪一号 CPU(从 0 起算)。例如 cpu_set 为 1(0001)时对应 1 号 CPU,为 4(0100)时对应 2 号 CPU。
当 cpu_set 有多个 bit 位为 1 时,表示系统会把线程随机调度到在这些 CPU 之一上运行。例如当线程对应的 cpu_set 为 3 即二进制 0011 时,表示该线程将被系统随机地在 0 号 CPU 或 1 号 CPU 上调度运行。
当 taskset 不使用 <cpu_set>
只使用 -p <pid>
时,表示查询该线程对应的 CPU 集情况。
以下示例将使用命令 taskset 把线程号为 1958 的线程绑定为 1 号 CPU 上:
~ # taskset -p 1958
pid 1958's current affinity mask: 3
~ # taskset -p 2 1958
pid 1958's current affinity mask: 3
pid 1958's new affinity mask: 2
3. 在程序中进行绑定
在 Linux 中,可以使用 sched_setaffinity()
改变线程对应的 CPU 集,把线程绑定到指定 CPU 上。
函数 sched_setaffinity 所属头文件 <sched.h>
,函数原型如下:
int sched_setaffinity(pid_t pid, size_t cpusetsize, const cpu_set_t* mask);
可见,该实际上就是把线程 pid
设置为指定 CPU 集。当传参 pid
为 0 时表示把当前线程的 CPU 集设置为 mask
。
cpu_set_t
类型本质上为一个整型数组,Linux 提供以下 5 个宏函数操作 CPU 集(以下数据类型仅供阅读):
宏函数 | 功能 |
---|---|
CPU_SET(int cpu, cpu_set_t* cpusetp)
|
把 cpu 添加到 cpusetp 中
|
CPU_CLR(int cpu, cpu_set_t* cpusetp)
|
把 cpu 从 cpusetp 中删除
|
int CPU_ISSET(int cpu, cpu_set_t* cpusetp)
|
判断 cpu 是否在 cpusetp 中,存在则返回 1,否则返回 0
|
CPU_ZERO(cpu_set_t* cpusetp)
|
清空 cpusetp ,即把 cpusetp 的每一 bit 位清零
|
CPU_COUNT(cpu_set_t* cpusetp)
|
查询 cpusetp 的 bit 位为 1 的个数,即线程调度的 CPU 个数
|
其中,cpu
指的是哪一号 CPU,该编号从 0 起算。
在使用以上宏时,需先打开宏 __USE_CHU
与 _GNU_SOURCE
告诉编译器启动以上宏函数,且这些宏声明必须在所有头文件声明之前:
#ifndef __USE_CHU
#define __USE_CHU
#endif#define _GNU_SOURCE#include <sched.h>
以下示例把当前线程绑定为 3 号 CPU 上:
cpu_set_t mask;
CPU_ZERO(&mask);
CPU_SET(3, &mask);
sched_setaffinity(0, sizeof(cpu_set_t), &mask);
【Linux 编程】线程绑定 CPU相关推荐
- linux下线程绑定内核,多线程 – 无法将内核线程绑定到CPU
我编写了这段代码来将2个内核线程绑定到不同的CPU: #include #include #include #include struct task_struct *task1; struct tas ...
- linux内核线程绑定到单个核,linux 将进程或者线程绑定到指定的cpu上
基本概念 cpu亲和性(affinity) CPU的亲和性, 就是进程要在指定的 CPU 上尽量长时间地运行而不被迁移到其他处理器,也称为CPU关联性:再简单的点的描述就将指定的进程或线程绑定到相应的 ...
- Linux编程---线程
首先说一下线程的概念.事实上就是运行在进程的上下文环境中的一个运行流.普通进程仅仅有一条运行流,可是线程提供了多种运行的路径并行的局面. 同一时候,线程还分为核心级线程和用户级线程.主要差别在属于核内 ...
- Linux 系统网卡绑定CPU(转载)
对于绑核来说,一般用的好像比较少,我也是一知半解,具体还是百度加个人理解,只是工作中有用到,就进行了记录,建议去了解"中断"这个定义. 硬件中断发生频繁,是件很消耗 CPU 资源的 ...
- Linux 线程优先级设置(内含C语言版线程创建、绑定CPU和优先级设置代码)
参考链接: https://blog.csdn.net/wushuomin/article/details/80051295 //详细讲解pthread_create 函数 https://blog. ...
- linux指定cpu运行程序,进程/线程绑定到特定CPU核的linux实现(有代码有实例)
前言 现在计算机上的CPU大多都是多核的,有4核甚至是8核的.但是一个计算机启动之后其进程数是远远多于CPU核数的,因为操作系统会给自动调度这些进程在CPU核上轮流运行.但是对于应用程序或者进程,其性 ...
- Android 高通骁龙CPU线程与CPU核的绑定
进程.线程绑定cpu核的问题,在这里将所学记录一下.高通骁龙采用1+3+4的超独特设计,Prime超大核.3个Kryo Gold核心和4个Kryo Silver核心. 其中0-3是Silver核芯,4 ...
- linux 线程与CPU绑定
看到很多程序都是根据CPU个数来创建线程个数,当时很不理解他们之间的关系,请教了项目组的同事后才有了大致了解. 1. 相关系统函数 下面的函数可以通过man命令查询到. SYNOPSIS#defin ...
- 线程锁定CPU linux,linux 线程与CPU绑定
看到很多程序都是根据CPU个数来创建线程个数,当时很不理解他们之间的关系,请教了项目组的同事后才有了大致了解. 1. 相关系统函数 下面的函数可以通过man命令查询到. SYNOPSIS #defin ...
- linux 指定cpu运行线程,linux 线程与CPU绑定
看到很多程序都是根据CPU个数来创建线程个数,当时很不理解他们之间的关系,请教了项目组的同事后才有了大致了解. 1. 相关系统函数 下面的函数可以通过man命令查询到.SYNOPSIS #define ...
最新文章
- SEO优化中如何引导流量
- findbugs, checkstyle, pmd的myeclipse7.5+插件安装(转:http://blog.csdn.net/priestmoon/article/details/63941)
- linux上还原自主nuget包需要注意的问题
- Python开发【第六篇】:模块
- OpenCV4每日一练day2:运行OpenCV示例程序(边缘检测、kmeans聚类)
- 面试官:说说Java反射机制
- c++基础(上) 听课流水账
- TC4056A丝印1A 线性锂离子电池充电IC
- python立方根求解_python 二分查找(立方根)
- 异步通信之IOCP详解
- 向日葵(SunLoginClient_10.5.0.29)RCE验证
- java的23种设计模式法则(权威版)
- 树莓派清华镜像源“stretch”更换为“buster”,解决tensorflow、h5py安装包下载报错问题
- python画小猪佩奇——给最爱的人一份甜甜的温暖
- CSDN成立20周年书法作品集
- 期一完全的备份和星期四_星期四:备份您的东西
- 图像的峰值信噪比(peak signal to noise ratio, PSNR)
- 台大郭彦甫教授Matlab讲解笔记(一)
- 天梯赛 L2-001 紧急救援 (25 分)
- 家庭亲情网,要取消几个号码怎么取消