Linux cpu亲和力

最近在对项目进行性能优化,由于在多核平台上,所以了解了些进程、线程绑定cpu核的问题,在这里将所学记录一下。

不管是线程还是进程,都是通过设置亲和性(affinity)来达到目的。对于[进程]的情况,一般是使用sched_setaffinity这个函数来实现,网上讲的也比较多,这里主要讲一下[线程]的情况。

与[进程]的情况相似,[线程]亲和性的设置和获取主要通过下面两个函数来实现:

int pthread_setaffinity_np(pthread_t thread, size_t cpusetsize,const cpu_set_t *cpuset);
int pthread_getaffinity_np(pthread_t thread, size_t cpusetsize, cpu_set_t *cpuset);

从函数名以及参数名都很明了,唯一需要点解释下的可能就是cpu_set_t这个结构体了。这个结构体的理解类似于select中的fd_set, 可以理解为cpu集,也是通过约定好的宏来进行清除、设置以及判断:

void CPU_ZERO (cpu_set_t *set);         //初始化,设为空
void CPU_SET (int cpu, cpu_set_t *set); //将某个cpu加入cpu集中
void CPU_CLR (int cpu, cpu_set_t *set); //将某个cpu从cpu集中移出
int CPU_ISSET (int cpu, const cpu_set_t *set); //判断某个cpu是否已在cpu集中设置了

cpu集可以认为是一个掩码,每个设置的位都对应一个可以合法调度的 cpu,而未设置的位则对应一个不可调度的 CPU。换而言之,线程都被绑定了,只能在那些对应位被设置了的处理器上运行。通常,掩码中的所有位都被置位了,也就是可以在所有的cpu中调度。

以下为测试代码:

#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#include <sched.h>void *myfun(void *arg)
{cpu_set_t mask;cpu_set_t get;char buf[256];int i;int j;int num = sysconf(_SC_NPROCESSORS_CONF);printf("system has %d processor(s)\n", num);for (i = 0; i < num; i++) {CPU_ZERO(&mask);CPU_SET(i, &mask);if (pthread_setaffinity_np(pthread_self(), sizeof(mask), &mask) < 0) {fprintf(stderr, "set thread affinity failed\n");}CPU_ZERO(&get);if (pthread_getaffinity_np(pthread_self(), sizeof(get), &get) < 0) {fprintf(stderr, "get thread affinity failed\n");}for (j = 0; j < num; j++) {if (CPU_ISSET(j, &get)) {printf("thread %d is running in processor %d\n", (int)pthread_self(), j);}}j = 0;while (j++ < 100000000) {memset(buf, 0, sizeof(buf));}}pthread_exit(NULL);
}int main(int argc, char *argv[])
{pthread_t tid;if (pthread_create(&tid, NULL, (void *)myfun, NULL) != 0) {fprintf(stderr, "thread create failed\n");return -1;}pthread_join(tid, NULL);return 0;
}

这段代码将使myfun线程在所有cpu中,依次执行一段时间,在我的四核cpu上,执行结果为  :

  system has 4 processor(s)        thread 1095604544 is running in processor 0        thread 1095604544 is running in processor 1        thread 1095604544 is running in processor 2        thread 1095604544 is running in processor 3

在一些嵌入式设备中,运行的进程线程比较单一,如果指定进程线程运行于特定的cpu核,减少进程、线程的核间切换,有可能可以获得更高的性能。

  回复「 篮球的大肚子」进入技术群聊

回复「1024」获取1000G学习资料

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

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

相关文章

卷积神经网络(目标分类)

文章目录目标分类基本框架数据准备数据扩充数据规范模型设计任务分类局部更改训练细节目标分类基本框架 数据准备 现有数据集的子集&#xff0c;网络采集&#xff0c;现有数据人工标注 数据扩充 原始数据切割&#xff0c;噪声颜色等像素变化&#xff0c;旋转平移 数据规范…

unity获取电磁笔压感_【WPF】获取电磁笔的压感

WPF 不仅支持触控&#xff0c;也支持笔的输入&#xff0c;比如现在比较高大上的电磁笔。便宜的板子一般不配备电磁笔&#xff0c;而是配电容笔&#xff0c;虽然也号称XXX级压感&#xff0c;但是效果自然不可与电磁笔相比。UIElement 类规范了UI元素的基本轮廓&#xff0c;在该类…

安卓9.0添加服务修改SELinux

#文章目录#前言#SELinux来源#SELinux基本框架#SELinux 在不同版本的表现#使用audit2allow工具生成SELinux 权限#完整代码#前言先推荐下之前的SELinux文章&#xff0c;但是那个是7.1的&#xff0c;在9.0上已经在差别很大的了。Android7.1 在init.rc 添加shell服务题外话~在企业里…

卷积神经网络-目标探测

文章目录目标探测介绍任务思路DPMRCNN1&#xff09;候选区域选择2&#xff09;CNN特征提取3&#xff09;分类与边界回归R-CNN总结优点缺陷FAST-RCNNFASTER-RCNNYOLO目标探测介绍 任务 分类获取坐标 目标探测 图片分割 思路 回归问题&#xff1a;利用神经网络进行目标识别&am…

相机视场角和焦距_镜头小讲堂(一)镜头的焦距

在刚购买完相机的时候&#xff0c;我们久会考虑需要什么样的镜头来配合机身来使用。而市场上的镜头种类是在太多了&#xff0c;所以我们就要学习了解下镜头都有哪些种类&#xff0c;选择哪种镜头比较有优势。这也是学习摄影必备的基础知识。01 镜头的焦距焦距是镜头的重要指标&…

小程序开发过程注意事项

尽量避免使用 this.setData({});会让小程序页面会重新渲染&#xff0c;耗性能资源。 比如 &#xff0c;clickShow: function(e) {this.setData({comment: ""});var comment e.currentTarget.dataset.comment && this.data.comment "" ? e.curre…

C语言指定初始化器解析及其应用

由于笔者能力有限&#xff0c;文中如果出现错误的地方&#xff0c;欢迎大家给我指出来&#xff0c;我将不胜感激&#xff0c;谢谢&#xff5e;#指定初始化器的概念C90 标准要求初始化程序中的元素以固定的顺序出现&#xff0c;与要初始化的数组或结构体中的元素顺序相同。但是在…

python self 序列_python中序列化对象

# 序列化对象p1import pickle # 内置库class People:def __init__(self, name, age):self.name nameself.age agedef sayhi(self):print("Hi, my name is {}, and Im {}".format(self.name, self.age))p1 People(name"Jack&qu…

递归神经网络

文章目录LSTM![在这里插入图片描述](https://img-blog.csdnimg.cn/20200609171449198.pngLSTM 4INPUTS 1outputs

程序媛计划——mysql连接表

#inner join等值连接&#xff0f;内连接 mysql> select * from info; ----------------------------- | name | phone | address | ----------------------------- | zhao | 13199999999 | Beijing | | qian | 1328888888 | Harbin | | sun | 13366666666 | Sha…

CNN+RNN

文章目录相同点不同点组合意义组合方式图片标注基本思路模型设计&#xff0d;数据准备视频行为识别视频行为识别图片问答相同点 传统神经网络的扩展 前向计算产生结果&#xff0c;反向计算模型更新 每层神经网络横向可以多个神经元共存&#xff0c;纵向可以多层神经网络链接 …

jsr 正则验证_Java数据校验(Bean Validation / JSR303)

#简介JSR303是JAVA EE6中的子规范。用于对Java Bean的字段值进行校验&#xff0c;确保输入进来的数据在语义上是正确的&#xff0c;使验证逻辑从业务代码中脱离出来。JSR303是运行时数据验证框架&#xff0c;验证之后验证的错误信息会马上返回。有两个版本JSR303(BeanValidatio…

css 透明度使用

设置元素整体透明度&#xff1a; div{opacity: 0.5; } 设置背景色透明度 div{background: rgba(0,0,0,0.5); } 转载于:https://www.cnblogs.com/chenglj/p/7498107.html

深入理解Linux内核链表

之前写过的链表文章&#xff0c;再结合这篇&#xff0c;我觉得是一道硬菜。Linux内核链表C语言&#xff0c;链表大家五一节日快乐&#xff0c;我知道劳动节大家都辛苦了&#xff0c;吃点硬菜好顶住饿肚子~#一、 链表数据结构简介链表是一种常用的组织有序数据的数据结构&#x…

GAN

文章目录生成对抗网络(GAN)基础生成对抗网络 优点&#xff1a;缺点&#xff1a;生成对抗网络深度GANDCGAN结构细节特征研究DCGAN总结条件GAN模型结构INFOGANInfoGAN: 自动学习z中部分变量意义Wasserstein GANGAN存在问题原因WGAN特点改进方法&#xff1a;生成对抗网络(GAN)基础…

sql 查询统计最近7天,30天,1年的数据

统计最近7天每天的数据 第一个查询统计了最近7天内&#xff0c;每天创建的’WAIT_SEND’状态的订单数量。这是通过将当前日期向前推移6天&#xff08;DATE_SUB(CURDATE(), INTERVAL 6 DAY)&#xff09;实现的。然后&#xff0c;它会按照创建日期对结果进行分组&#xff08;GROU…

1200可以读取modbus tcp_S7-1200 作 MODBUS TCP服务器

S7-1200 Modbus TCP 通信指令块STEP 7 V13 SP1 软件版本中的Modbus TCP库指令目前最新的版本已升至V4.0&#xff0c;该版本的使用需要具备以下两个条件&#xff1a;1. 软件版本&#xff1a; STEP 7 V13 SP1及其以上2. 固件版本&#xff1a; S7-1200 CPU 的固件版本V4.1图1. Mod…

判断对象oStringObject是否为String

1.操作符 &#xff08;1&#xff09;typeof操作符 格式&#xff1a;resulttypeof variable 返回值&#xff1a; undefined 值未定义 boolean 布尔值 string 字符串 number 数值 object 对象、null function 函数 &#xff08;2&#xff09;instanceof操作符 格式&#xff1a;re…

Linux一定需要文件系统吗?

开篇题外话&#xff1a;对于Linux初学者来说&#xff0c;这是一个很纠结的问题&#xff0c;但这也是一个很关键的问题&#xff01; 一语破天机&#xff1a;“尽管内核是 Linux 的核心&#xff0c;但文件却是用户与操作系统交互所采用的主要工具。这对 Linux 来说尤其如…

迁移学习

文章目录为什么需要迁移学习模型Fine-‐tune![在这里插入图片描述](https://img-blog.csdnimg.cn/20200612000845217.png)保守训练层迁移Multitask Learning渐进式神经网络/Progressive Neural Networks域对抗零样本学习Self-‐taught learning为什么需要迁移学习 使用深度学习…