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) cpucpusetp 中删除
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相关推荐

  1. linux下线程绑定内核,多线程 – 无法将内核线程绑定到CPU

    我编写了这段代码来将2个内核线程绑定到不同的CPU: #include #include #include #include struct task_struct *task1; struct tas ...

  2. linux内核线程绑定到单个核,linux 将进程或者线程绑定到指定的cpu上

    基本概念 cpu亲和性(affinity) CPU的亲和性, 就是进程要在指定的 CPU 上尽量长时间地运行而不被迁移到其他处理器,也称为CPU关联性:再简单的点的描述就将指定的进程或线程绑定到相应的 ...

  3. Linux编程---线程

    首先说一下线程的概念.事实上就是运行在进程的上下文环境中的一个运行流.普通进程仅仅有一条运行流,可是线程提供了多种运行的路径并行的局面. 同一时候,线程还分为核心级线程和用户级线程.主要差别在属于核内 ...

  4. Linux 系统网卡绑定CPU(转载)

    对于绑核来说,一般用的好像比较少,我也是一知半解,具体还是百度加个人理解,只是工作中有用到,就进行了记录,建议去了解"中断"这个定义. 硬件中断发生频繁,是件很消耗 CPU 资源的 ...

  5. Linux 线程优先级设置(内含C语言版线程创建、绑定CPU和优先级设置代码)

    参考链接: https://blog.csdn.net/wushuomin/article/details/80051295 //详细讲解pthread_create 函数 https://blog. ...

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

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

  7. Android 高通骁龙CPU线程与CPU核的绑定

    进程.线程绑定cpu核的问题,在这里将所学记录一下.高通骁龙采用1+3+4的超独特设计,Prime超大核.3个Kryo Gold核心和4个Kryo Silver核心. 其中0-3是Silver核芯,4 ...

  8. linux 线程与CPU绑定

    看到很多程序都是根据CPU个数来创建线程个数,当时很不理解他们之间的关系,请教了项目组的同事后才有了大致了解.  1. 相关系统函数 下面的函数可以通过man命令查询到. SYNOPSIS#defin ...

  9. 线程锁定CPU linux,linux 线程与CPU绑定

    看到很多程序都是根据CPU个数来创建线程个数,当时很不理解他们之间的关系,请教了项目组的同事后才有了大致了解. 1. 相关系统函数 下面的函数可以通过man命令查询到. SYNOPSIS #defin ...

  10. linux 指定cpu运行线程,linux 线程与CPU绑定

    看到很多程序都是根据CPU个数来创建线程个数,当时很不理解他们之间的关系,请教了项目组的同事后才有了大致了解. 1. 相关系统函数 下面的函数可以通过man命令查询到.SYNOPSIS #define ...

最新文章

  1. SEO优化中如何引导流量
  2. findbugs, checkstyle, pmd的myeclipse7.5+插件安装(转:http://blog.csdn.net/priestmoon/article/details/63941)
  3. linux上还原自主nuget包需要注意的问题
  4. Python开发【第六篇】:模块
  5. OpenCV4每日一练day2:运行OpenCV示例程序(边缘检测、kmeans聚类)
  6. 面试官:说说Java反射机制
  7. c++基础(上) 听课流水账
  8. TC4056A丝印1A 线性锂离子电池充电IC
  9. python立方根求解_python 二分查找(立方根)
  10. 异步通信之IOCP详解
  11. 向日葵(SunLoginClient_10.5.0.29)RCE验证
  12. java的23种设计模式法则(权威版)
  13. 树莓派清华镜像源“stretch”更换为“buster”,解决tensorflow、h5py安装包下载报错问题
  14. python画小猪佩奇——给最爱的人一份甜甜的温暖
  15. CSDN成立20周年书法作品集
  16. 期一完全的备份和星期四_星期四:备份您的东西
  17. 图像的峰值信噪比(peak signal to noise ratio, PSNR)
  18. 台大郭彦甫教授Matlab讲解笔记(一)
  19. 天梯赛 L2-001 紧急救援 (25 分)
  20. 家庭亲情网,要取消几个号码怎么取消

热门文章

  1. 惠普电脑调节电脑亮度
  2. WIN10华硕解决无法调节电脑亮度
  3. HTML+JS 实现 input 框回车事件
  4. 10 分钟了解 Flutter 跨平台方案
  5. [JZOJ4940]前鬼后鬼的守护/[JZOJ4623]搬运干草捆
  6. 单页面优化有哪些可以参考的策略
  7. 一篇文章看懂Facebook和新浪微博的智能FEED
  8. 【pandas】结合泰坦尼克生还分析讲讲pandas常用基础操作
  9. UIKit框架的介绍
  10. 计算机专业就业方向 【转】