CPU 亲和性--sched_setaffinity()函数

sched_setaffinity – 将线程&进程运行在期望的CPU核心上

CPU亲和性

是指进程或线程在运行时倾向于在某个或某些CPU核心上执行,而不是随机或频繁地在不同的核心之间切换。
CPU亲和性利用CPU缓存的局部性,减少缓存失效和进程或线程迁移的开销,避免频繁地在不同的核心之间切换,提高性能

CPU亲和性分为软亲和性硬亲和性
软亲和性是Linux内核进程调度器的默认特性,它会尽量让进程在上次运行的CPU核心上继续运行,但不保证一定如此,因为还要考虑各个核心的负载均衡。
硬亲和性是Linux内核提供给用户的API,它可以让用户显式地指定进程或线程可以运行在哪些CPU核心上,或者绑定到某个特定的核心上。

使用方式

man sched_setaffinity #查找man手册

/*sched_setaffinity():设置进程或线程的CPU亲和性掩码,表示它可以运行在哪些核心上。sched_getaffinity():获取进程或线程的CPU亲和性掩码,表示它当前可以运行在哪些核心上。CPU_ZERO():操作CPU亲和性掩码的宏,用于清空某个核心是否在掩码中。CPU_SET():操作CPU亲和性掩码的宏,用于设置某个核心是否在掩码中。CPU_CLR():操作CPU亲和性掩码的宏,用于清除某个核心是否在掩码中。CPU_ISSET():操作CPU亲和性掩码的宏,用于检查某个核心是否在掩码中。
*/ 
#include <sched.h>
//sysconf()查询系统限制和配置信息
int num = sysconf(_SC_NPROCESSORS_CONF); //_SC_NPROCESSORS_CONF:可以同时运行的CPU数量
self_id = syscall(__NR_gettid);//获取进程号和线程号
cpu_set_t mask;  // 1.创建一 cpu 亲和性掩码
CPU_ZERO(&mask); // 2.清空
CPU_SET(self_id % num, &mask); // 3.设置 亲和性掩码
if (sched_setaffinity(0, sizeof(mask), &mask) == -1) { // 4.设置当前线程的cpu亲和性return -1;
}
/*
pid:表示要设置的进程或线程的ID,如果为0,则表示当前进程或线程;
cpusetsize:表示mask指针指向的数据的长度,通常为sizeof(cpu_set_t);
mask:是一个指向cpu_set_t类型的指针,cpu_set_t是一个不透明的结构体,用于表示CPU亲和性掩码,需要使用一些宏来操作它,如CPU_ZERO, CPU_SET, CPU_CLR等。
成功时返回0,失败时返回-1,并设置errno为相应的错误码。可能的错误码有:EFAULT: mask指针无效EINVAL: mask中没有有效的CPU核心EPERM: 调用者没有足够的权限
int sched_setaffinity(pid_t pid, size_t cpusetsize, const cpu_set_t *mask);
*/

原理是通过设置进程或线程的CPU亲和性掩码,来指定它可以运行在哪些CPU核心上。CPU亲和性掩码是一个位图,每一位对应一个CPU核心,如果某一位为1,表示该进程或线程可以运行在该核心上,否则不能。

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

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

相关文章

SparkSQL入门

1、SparkSQL是什么&#xff1f; 结论&#xff1a;SparkSQL 是一个即支持 SQL 又支持命令式数据处理的工具 2、SparkSQL 的适用场景&#xff1f; 结论&#xff1a;SparkSQL 适用于处理结构化数据的场景&#xff0c;而Spark 的 RDD 主要用于处理 非结构化数据 和 半结构化数据 …

掌握ASPICE标准:汽车软件测试工程师的专业发展路径

掌握ASPICE标准&#xff1a;汽车软件测试工程师的专业发展路径 文&#xff1a;领测老贺 随着新能源汽车在中国的蓬勃发展&#xff0c;智能驾驶技术的兴起&#xff0c;汽车测试工程师的角色变得愈发关键。这一变革带来了前所未有的挑战和机遇&#xff0c;要求测试工程师不仅要具…

Leetcode 3161. Block Placement Queries

Leetcode 3161. Block Placement Queries 1. 解题思路2. 代码实现 题目链接&#xff1a;3161. Block Placement Queries 1. 解题思路 这一题没有搞定&#xff0c;后来是看了答案才多少有了些思路的&#xff0c;感觉人生真的是玄学拉满&#xff0c;每次我休息一整天完全没有学…

解决git克隆项目出现fatal无法访问git clone https://github.com/lvgl/lvgl.git

Windows 11系统 报错 $ git clone https://github.com/lvgl/lvgl.git Cloning into lvgl... fatal: unable to access https://github.com/lvgl/lvgl.git/: Failed to connect to github.com port 443 after 21141 ms: Couldnt connect to server 解决方法 git运行这两段代码…

创新实训2024.05.26日志:落地基于硬盘的数据库服务

1. 需求任务列表 以下描述易学大模型软件的web应用的功能。 用户注册 用户邮箱&#xff0c;密码&#xff0c;验证码开启官方邮箱&#xff0c;用来发验证码&#xff08;QQ 网易都支持开启smtp协议&#xff0c;找教程&#xff0c;用邮箱不用手机号是为了省买发短信云服务的钱&a…

ASP+ACCESS客户管理信息系统

摘要 本文介绍了客户管理系统的实现方法。目的在于让大家共享学习和运用这一语言的体会和收获。本系统是Internet/Intranet环境下面向电子商务的客户管理&#xff0c;通过企业管理技术、电子商务和信息技术的高度集成&#xff0c;讨论了客户管理系统的系统构架、系统的工作…

Rust之初识

1、Rust Linux安装 登录进入linux以后&#xff0c;执行&#xff1a; curl --proto https --tlsv1.2 https://sh.rustup.rs -sSf | sh当提示&#xff1a; Rust is installed now. Great!意味着安装成功了。打开另一个shell页&#xff0c;查看&#xff1a;rustc --version&#x…

栈和队列的基本见解

1.栈 1.1栈的基本概念和结构&#xff1a; 栈是一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出的原则。 压栈&#xff1a;栈的插入操作叫做进栈/压栈…

git使用简述

1、工作区、暂存区、版本库 Git 是一个开源的分布式版本控制系统&#xff0c;它允许多个开发者同时在同一个项目上工作&#xff0c;而不会互相干扰。Git 通过三个主要的区域来管理文件的变更&#xff1a;工作区&#xff08;Working Directory&#xff09;、暂存区&#xff08;…

python 面对对象 类 魔法方法

魔法方法 一、__init__ 构造函数&#xff0c;可以理解为初始化 触发条件&#xff1a;在实例化的时候就会触发 class People():def __init__(self, name):print(init被执行)self.name namedef eat(self):print(f{self.name}要吃饭)a People(张三) a.eat() # in…

海外抖音TK自动挂机,手机全自动挂机,每天轻松搞2张

海外抖音TK自动挂机&#xff0c;手机全自动挂机&#xff0c;每天轻松搞2张 课程获取方式&#xff1a; https://zzmbk.com/

整理好了!2024年最常见 20 道 Redis面试题(七)

上一篇地址&#xff1a;整理好了&#xff01;2024年最常见 20 道 Redis面试题&#xff08;六&#xff09;-CSDN博客 十三、如何保证 Redis 的高可用性&#xff1f; Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的高性能键值对数据库&#xff0c;它通常被…

揭秘Markdown:轻松掌握基础语法,让你的写作更高效、优雅!

文章目录 前言1.标题1.1 使用 和 - 标记一级和二级标题1.2 使用 # 号标记 2.段落格式2.1 字体2.2 分割线2.3 删除线2.4 下划线2.5 脚注 3.列表3.1 无序列表3.2 有序列表3.3 列表嵌套 4.区块4.1 区块中使用列表4.2 列表中使用区块 5.代码代码区块 6.链接7.图片8.表格9.高级技巧…

mysql实战——XtraBackup二进制包安装

1、二进制包下载网站 Software Downloads - Percona 2、安装xtrabackup 解压安装包 tar xvf percona-xtrabackup-8.0.27-19-Linux-x86_64.glibc2.17.tar.gz -C /usr/local 进入目录 cd percona-xtrabackup-8.0.27-19-Linux-x86_64.glibc2.17/ 安装依赖 yum install perl-Dig…

正运动视觉与运动一体机小课堂----三分钟系列

【视觉运控一体机小课堂】三分钟搭建机器视觉开发环境-正运动技术 (zmotion.com.cn) 【视觉运控一体机小课堂】三分钟读取本地图像-正运动技术 (zmotion.com.cn) 【视觉运控一体机小课堂】三分钟实现相机采集和图像保存-正运动技术 (zmotion.com.cn) 【视觉运控一体机小课堂…

java里面反射和动态代理的基础知识

反射 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的工具&#xff0c;它允许程序在运行时检查和修改类、接口、字段和方法等元数据的行为。通过反射&#xff0c;你可以加载类、实例化对象、调用方法、获取和修改字段的值等&#xff0c;而无需在编译…

Fortran: stdlib标准库

Fortran 标准库 stdlib_logger,stdlib_error, stdlib_sorting,stdlib_optval模块挺好用 封装 stdlib_logger和stdlib_error: M_logger.F90 module M_loggeruse stdlib_loggeruse stdlib_error containssubroutine info(message,module,procedure)character(len*),intent(in):…

2024.5.25期末测试总结

成绩&#xff1a; 配置&#xff1a; 可能与实际有些出入 题目&#xff1a; 第一题&#xff1a; 代码思路&#xff1a; 一道模拟题&#xff0c;按照公式计算出sumpow(2,i)&#xff0c;判断sum>H&#xff0c;输出 代码&#xff1a; #include<bits/stdc.h> using name…

Java—内部类

Java—内部类 一、内部类二、应用特点三、分类3.1、普通内部类&#xff1a;直接将一个类的定义放在另外一个类的类体中3.2、静态内部类3.3、局部内部类 一、内部类 一个类的定义出现在另外一个类&#xff0c;那么这个出现的类就叫内部类(Inner)。 内部类所在的类叫做外部类(Ou…

Java匿名内部类的使用

演示匿名内部类的使用&#xff0c;很重要 package com.shedu.Inner;/*** 演示匿名内部类的使用*/ public class AnonymousInnerClass {//外部其他类public static void main(String[] args) {Outer04 outer04 new Outer04();outer04.method();} }class Outer04{//外部类priva…