Linux上将进程、线程与CPU核绑定

news2024/11/16 18:10:58

      CPU亲和性(CPU Affinity)是某一进程(或线程)绑定到特定的CPU核(或CPU集合),从而使得该进程(或线程)只能运行在绑定的CPU核(或CPU集合)上。进程(或线程)本质上并不与CPU核绑定。每次进程(或线程)被调度执行时,它都可以由其关联列表中的任何CPU核执行。如果未显式设置关联列表,则进程(或线程)可以在任何CPU核上运行。

      一.查看CPU信息
      1.通过命令,执行:

cat /proc/cpuinfo

      (1).processor:指明每个物理CPU中逻辑处理器信息,序号从0开始;
      (2).cpu cores: 指明每个物理CPU中总核数;
      2.查看物理CPU个数,执行:

cat /proc/cpuinfo | grep "physical id" | sort | uniq | wc -l

      3.查看每个物理CPU中core的个数(即核数),执行:

cat /proc/cpuinfo | grep "cpu cores" | uniq

      4.查看逻辑CPU的个数,执行:

cat /proc/cpuinfo | grep "processor" | wc -l

      5.通过代码:sysconf函数或get_nprocs函数

void get_cpu_cores()
{
    // _SC_NPROCESSORS_CONF:系统配置的CPU核心数量
    // _SC_NPROCESSORS_ONLN:当前系统实际可用的CPU核心数量,可能会因为系统的运行状态而变化
    // 两个函数返回的值可能并不完全相同
    std::cout << "cpu cores(_SC_NPROCESSORS_CONF): " << sysconf(_SC_NPROCESSORS_CONF) << "\n";
    std::cout << "cpu cores(_SC_NPROCESSORS_ONLN): " << sysconf(_SC_NPROCESSORS_ONLN) << "\n";

    // get_nprocs_conf:系统配置的CPU核心数量; get_nprocs:当前系统中可用的CPU核心数量,此值可能小于get_nprocs_conf返回的值
    std::cout << "cpu cores(get_nprocs_conf): " << get_nprocs_conf() << "\n";
    std::cout << "cpu cores(get_nprocs): " << get_nprocs() << "\n"; 
}

      二.将进程绑定到指定的CPU核上
      1.通过taskset:(-p:pid; -c:cpu list)
      (1).查看执行程序(进程)运行在哪个CPU核上:taskset -p 进程ID(PID, 操作系统分配给每个进程的唯一标识符)
      如查看gnome-shell运行在哪个CPU核上:通过top命令查看gnome-shell的PID为1246,输入:taskset -pc 1246 ,执行结果如下图所示:

      (2).启动时指定:CPU标号从0开始,绑定多个CPU核,之间用逗号分隔
    taskset -c CPU_标号 可执行程序
      (3).启动后绑定:CPU标号从0开始,绑定多个CPU核,之间用逗号分隔
    taskset -pc CPU_标号 PID
      2.通过代码:sched_setaffinity和sched_setaffinity函数
      (1).sched_setaffinity(pid_t pid, size_t cpusetsize, const cpu_set_t *mask): 将ID为pid的线程的CPU亲和性掩码(CPU affinity mask)设置为mask指定的值。如果pid为0,则使用调用线程。参数cpusetsize是 mask指向的数据的长度(以字节为单位)。通常该参数被指定为sizeof(cpu_set_t)。
      (2).sched_getaffinity(pid_t pid, size_t cpusetsize, cpu_set_t *mask): 将ID为pid的线程的亲和性掩码写入mask指向的cpu_set_t结构中。cpusetsize参数指定掩码的大小(以字节为单位)。如果pid为零,则返回调用线程的掩码。

void set_processor_to_cpu_core()
{

{ // sched_getaffinity
    cpu_set_t mask;
    CPU_ZERO(&mask);

    if (sched_getaffinity(0, sizeof(mask), &mask) != 0)
        std::cerr << "Error: fail to sched_getaffinity\n";

    for (auto i = 0; i < sysconf(_SC_NPROCESSORS_ONLN); ++i) {
        if (CPU_ISSET(i, &mask))
            std::cout << "CPU " << i << " is set\n";
    }
}

{ // sched_setaffinity
    cpu_set_t mask;
    CPU_ZERO(&mask);
    // 可以多次调用CPU_SET,以指定将多个CPU核添加到mask中
    CPU_SET(0, &mask); // set affinity for core 0, set the bit that represents core 0

    if (sched_setaffinity(0, sizeof(mask), &mask) != 0)
        std::cerr << "Error: fail to sched_setaffinity\n";
}

}

      三.将线程绑定到指定的CPU核上
      1.通过代码:pthread_setaffinity_np函数和pthread_getaffinity_np
      (1).pthread_setaffinity_np(pthread_t thread, size_t cpusetsize, const cpu_set_t *cpuset): 将线程thread的CPU亲和性掩码(CPU affinity mask)设置为cpuset指向的CPU集。如果调用成功,并且该线程当前未在cpuset中的某个CPU上运行,则它将迁移到这些CPU中的一个。
      (2).pthread_getaffinity_np(pthread_t thread, size_t cpusetsize, cpu_set_t *cpuset): 获取cpuset指向的缓冲区中线程thread的CPU亲和性掩码。

void get_thread_id(int n)
{
    std::cout << "thread id: " << std::this_thread::get_id() << ", on cpu: " << sched_getcpu() << "\n";
    std::this_thread::sleep_for(std::chrono::seconds(n));
}

void set_thread_to_cpu_core()
{
    // 最大的硬件并发线程数
    std::cout << "Support concurrent threads: " << std::thread::hardware_concurrency() << "\n";
    
    std::thread th1(get_thread_id, 5), th2(get_thread_id, 5);
{ // pthread_getaffinity_np
    cpu_set_t cpuset;
    CPU_ZERO(&cpuset);
    
    if (pthread_getaffinity_np(th1.native_handle(), sizeof(cpuset), &cpuset) != 0)
        std::cerr << "Error: fail to pthread_getaffinity_np\n";

    // for (auto i = 0; i < sysconf(_SC_NPROCESSORS_ONLN); ++i) {
    //     if (CPU_ISSET(i, &cpuset))
    //         std::cout << "CPU " << i << " is set\n";
    // }
}

{ // pthread_setaffinity_np
    cpu_set_t cpuset;
    CPU_ZERO(&cpuset);
    // 可以多次调用CPU_SET,以指定将多个CPU核添加到cpuset中
    CPU_SET(0, &cpuset); // set affinity for core 0, set the bit that represents core 0

    if (pthread_setaffinity_np(th2.native_handle(), sizeof(cpuset), &cpuset) != 0)
        std::cerr << "Error: fail to pthread_setaffinity_np\n";

}

    th1.join();
    th2.join();
}

      以上测试代码执行结果如下图所示:虚拟机

      GitHub:https://github.com/fengbingchun/Linux_Code_Test

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1063566.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

洛谷题解 | P9690 [GDCPC2023] Programming Contest

目录 题面翻译题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示题目简化题目思路AC代码 题面翻译 【题目描述】 广东省是全国较早一批将程序设计竞赛引入省内大学生竞赛体系的省份之一。 2003 2003 2003 年&#xff0c;中山大学承办了第一届广东省大学生程序设计…

2023了,学习深度学习框架哪个比较好?

都2023年&#xff0c;才来回答这个问题&#xff0c;自然毫无悬念地选择PyTorch&#xff0c;TensorFlow在大模型这一波浪潮中没有起死回生&#xff0c;有点惋惜&#xff0c;现在GLM、GPT、LLaMA等各种大模型都是基于PyTorch框架构建。这个事情已经水落石出。 不过呢&#xff0c…

关于智能空气动力学

智能空气动力学是指运用智能科学方法和研究范式研究空气运动&#xff0c;尤其是物体与空气相对运动时空气对物体所施作用力规律、气体的流动规律和伴随发生的物理学变化&#xff0c;解决空气动力学问题的新的交叉学科。在空气动力学三大传统研究手段的基础上&#xff0c;智能空…

自学SLAM(2)---保姆教程教你如何使用自己的视频运行ORB-SLAM2

前言 如果你是新手入门&#xff0c;仅仅只会Linux的基本操作&#xff0c;并看了高翔老师视觉SLAM视屏的第一讲&#xff0c;那么你需要准备一整天的时间&#xff0c;可能还不一定能运行出来&#xff01;运行ORB-SLAM2将会安装很多很多东西。那么&#xff0c;我们准备开始&#x…

新版WIFI分销系统微信小程序源码+WiFi大师版流量主+搭建独立源码WiFi营销小程序源码

新版WIFI分销系统微信小程序源码&#xff0c;带有流量主&#xff0c;可以搭建独立源码的WiFi营销小程序源码。它是一款集流量主、分销和WiFi热点为一体的微信小程序源码。它基于创新的技术架构和设计理念&#xff0c;实用和运行稳定。 这款源码有多种分销模式&#xff0c;用户…

基于闪电搜索优化的BP神经网络(分类应用) - 附代码

基于闪电搜索优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于闪电搜索优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.闪电搜索优化BP神经网络3.1 BP神经网络参数设置3.2 闪电搜索算法应用 4.测试结果…

bat脚本获取系统服务的可执行文件路径

查看系统服务器名称 鼠标右键点击&#xff0c;选择任务管理器 我们以ActiveMQ为例子进行演示 手动查看可执行文件路径 打开服务 选择服务&#xff0c;右键选择属性 下图中就是可执行路径 命令行查看可执行文件路径 选择管理员运行 cmd运行下面命令 sc qc ActiveMQ 下图就是…

Python 无废话-基础知识函数详解

函数定义 函数是一段可重复使用的代码块&#xff0c;用于实现特定的功能。 类似的前面已学过print(),len(),input(),str(),list(),tuple()等内置函数 自定义函数 内置函数是python类库的已定义好的函数&#xff0c;如果某些功能不能满足时&#xff0c;需要我们自定义函数&am…

迄今为止丨ChatGPT最强指令,一个可以让机器人生成机器人的Prompt,价值百万!

原文&#xff1a; 【ChatGPT调教】ChatGPT最强指令、让机器人为你生成机器人&#xff01;-CSDN博客 说明&#xff1a;最好看原文 昨天&#xff0c;发现了一条可能是迄今为止&#xff0c;我见过最牛的&#xff0c;商业价值最高的ChatGPT指令。 通过这条指令&#xff0c;可以…

推荐系统实践 笔记

诸神缄默不语-个人CSDN博文目录 这是我2020年写的笔记&#xff0c;我从印象笔记搬过来公开。 如果那年还在读本科的同学也许有印象&#xff0c;那年美赛出了道根据电商评论给商户提建议的题。其实这件事跟推荐系统关系不大&#xff0c;但我们当时病急乱投医&#xff0c;我打开…

Golang interface 接口的应用场景 使用细节

应用场景介绍 对初学者讲&#xff0c;理解接口的概念不算太难&#xff0c;难的是不知道什么时候使用接口&#xff0c;下面我例举几个应用场景&#xff1a; 1.说现在美国要制造轰炸机&#xff0c;武装直升机&#xff0c;专家只需把飞机需要的功能/规格定下来即可&#xff0c;然…

​“FTX 传奇曾经大佬 SBF 的审判:密友出庭指控,陪审团选择延长,听证会揭示 “

备受期待的 FTX 创始人 SBF 刑事审判开始&#xff0c;引发了检方和辩方之间关于他在加密货币交易所垮台中所扮演角色的冲突。美国助理检察官塞恩雷恩(ThaneRehn)将 SBF 描述为一位前雄心勃勃的人物&#xff0c;过着建立在欺骗基础上的奢华生活方式。 SBF 的律师马克科…

逻辑回归评分卡

文章目录 一、基础知识点(1)逻辑回归表达式(2)sigmoid函数的导数损失函数(Cross-entropy, 交叉熵损失函数)交叉熵求导准确率计算评估指标 二、导入库和数据集导入库读取数据 三、分析与训练四、模型评价ROC曲线KS值再做特征筛选生成报告 五、行为评分卡模型表现总结 一、基础知…

【数据结构】初探时间与空间复杂度:算法评估与优化的基础

&#x1f6a9;纸上得来终觉浅&#xff0c; 绝知此事要躬行。 &#x1f31f;主页&#xff1a;June-Frost &#x1f680;专栏&#xff1a;数据结构 &#x1f525;该文章主要了解算法的时间复杂度与空间复杂度等相关知识。 目录&#xff1a; &#x1f30f; 时间复杂度&#x1f52d…

基于自私羊群优化的BP神经网络(分类应用) - 附代码

基于自私羊群优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于自私羊群优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.自私羊群优化BP神经网络3.1 BP神经网络参数设置3.2 自私羊群算法应用 4.测试结果…

苹果手机怎么备份所有数据?2023年iPhone 15数据备份常用的3种方法!

当苹果手机需要进行刷机、恢复出厂设置、降级iOS系统等操作时&#xff0c;我们需要将自己的iPhone数据提前进行备份。 特别是在苹果发布新iOS系统时&#xff0c;总有一些小伙伴因为升降级系统&#xff0c;而导致了重要数据的丢失。 iPhone中储存着重要的照片、通讯录、文件等数…

STM32--人体红外感应开关

本文主要介绍基于STM32F103C8T6和人体红外感应开关实现的控制算法 简介 人体红外模块选用HC-SR501人体红外传感器&#xff0c;人体红外感应的主要器件为人体热释电红外传感器。人体都有恒定的体温&#xff0c;一般在36~37度&#xff0c;所以会发出特定波长的红外线&#xff0…

windows系统服务管理命令sc

sc可以用于管理系统服务、计划任务、系统日志等方面&#xff0c;是不可或缺的神器。 基本用法 在命令提示符下输入sc命令&#xff0c;然后按回车键。 上图展示的是sc命令的使用方法&#xff0c;支持哪些参数实现哪些功能 要查看系统所有服务列表&#xff0c;包括它们是否正在…

基于入侵杂草优化的BP神经网络(分类应用) - 附代码

基于入侵杂草优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于入侵杂草优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.入侵杂草优化BP神经网络3.1 BP神经网络参数设置3.2 入侵杂草算法应用 4.测试结果…

Mac版快速切换工具:One Switch中文 for mac

One Switch是一款功能强大、体验极简的Mac菜单栏工具&#xff0c;适合需要频繁切换系统设置和启动应用程序的用户使用。通过它&#xff0c;用户可以更方便地完成日常操作&#xff0c;提高工作效率。 快速访问工具&#xff1a;One Switch提供了一个便捷的菜单栏图标&#xff0c;…