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

基本概念

cpu亲和性(affinity)

CPU的亲和性, 就是进程要在指定的 CPU 上尽量长时间地运行而不被迁移到其他处理器,也称为CPU关联性;再简单的点的描述就将指定的进程或线程绑定到相应的cpu上;在多核运行的机器上,每个CPU本身自己会有缓存,缓存着进程使用的信息,而进程可能会被OS调度到其他CPU上,如此,CPU cache命中率就低了,当绑定CPU后,程序就会一直在指定的cpu跑,不会由操作系统调度到其他CPU上,性能有一定的提高。

软亲和性(affinity)

就是进程要在指定的 CPU 上尽量长时间地运行而不被迁移到其他处理器,Linux 内核进程调度器天生就具有被称为 软 CPU 亲和性(affinity) 的特性,这意味着进程通常不会在处理器之间频繁迁移。这种状态正是我们希望的,因为进程迁移的频率小就意味着产生的负载小。

硬亲和性(affinity)

简单来说就是利用linux内核提供给用户的API,强行将进程或者线程绑定到某一个指定的cpu核运行。

相关函数

void CPU_ZERO (cpu_set_t *set)  /*这个宏对 CPU 集 set 进行初始化,将其设置为空集。*/

void CPU_SET (int cpu, cpu_set_t *set)  /*这个宏将 指定的 cpu 加入 CPU 集 set 中*/

void CPU_CLR (int cpu, cpu_set_t *set)  /*这个宏将 指定的 cpu 从 CPU 集 set 中删除。*/

int CPU_ISSET (int cpu, const cpu_set_t *set)  /*如果 cpu 是 CPU 集 set 的一员,这个宏就返回一个非零值(true),否则就返回零(false)。*/

进程与cpu的绑定

#include

int sched_setaffinity(pid_t pid, size_t cpusetsize, const cpu_set_t *mask);

int sched_getaffinity(pid_t pid, size_t cpusetsize, const cpu_set_t *mask);

代码示例:

#define _GNU_SOURCE

#include

#include

#include

#include

#include

#include

/* sysconf( _SC_NPROCESSORS_CONF ) 查看cpu的个数;打印用%ld长整。

* sysconf( _SC_NPROCESSORS_ONLN ) 查看在使用的cpu个数;打印用%ld长整 */

int main(int argc, char **argv)

{

int cpus = 0;

int i = 0;

cpu_set_t mask;

cpu_set_t get;

cpus = sysconf(_SC_NPROCESSORS_CONF);

printf("cpus: %d\n", cpus);

CPU_ZERO(&mask); /* 初始化set集,将set置为空*/

CPU_SET(0, &mask); /* 依次将0、1、2、3号cpu加入到集合,前提是你的机器是多核处理器*/

CPU_SET(1, &mask);

CPU_SET(2, &mask);

CPU_SET(3, &mask);

/*设置cpu 亲和性(affinity)*/

if (sched_setaffinity(0, sizeof(mask), &mask) == -1) {

printf("Set CPU affinity failue, ERROR:%s\n", strerror(errno));

return -1;

}

usleep(1000); /* 让当前的设置有足够时间生效*/

/*查看当前进程的cpu 亲和性*/

CPU_ZERO(&get);

if (sched_getaffinity(0, sizeof(get), &get) == -1) {

printf("get CPU affinity failue, ERROR:%s\n", strerror(errno));

return -1;

}

/*查看运行在当前进程的cpu*/

for(i = 0; i < cpus; i++) {

if (CPU_ISSET(i, &get)) { /*查看cpu i 是否在get 集合当中*/

printf("this process %d of running processor: %d\n", getpid(), i);

}

}

sleep(10); //让程序停在这儿,方便top命令查看

return 0;

}

结果:

a432d14b3ead8085ffd606956426ddbd.png

线程与cpu的绑定

#include

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, const cpu_set_t *cpuset);

代码示例:

#define _GNU_SOURCE

#include

#include

#include

#include

#include

#include

void *testfunc(void *arg)

{

int i, cpus = 0;

cpu_set_t mask;

cpu_set_t get;

cpus = sysconf(_SC_NPROCESSORS_CONF);

printf("this system has %d processor(s)\n", cpus);

CPU_ZERO(&mask);

for (i = 0; i < 4; i++) { /*将0、1、2、3添加到集合中*/

CPU_SET(i, &mask);

}

/* 设置cpu 亲和性(affinity)*/

if (pthread_setaffinity_np(pthread_self(), sizeof(mask), &mask) < 0) {

fprintf(stderr, "set thread affinity failed\n");

}

/* 查看cpu 亲和性(affinity)*/

CPU_ZERO(&get);

if (pthread_getaffinity_np(pthread_self(), sizeof(get), &get) < 0) {

fprintf(stderr, "get thread affinity failed\n");

}

/* 查看当前线程所运行的所有cpu*/

for (i = 0; i < cpus; i++) {

if (CPU_ISSET(i, &get)) {

printf("this thread %d is running in processor %d\n", (int)pthread_self(), i);

}

}

sleep(3); //查看

pthread_exit(NULL);

}

int main(int argc, char *argv[])

{

pthread_t tid;

if (pthread_create(&tid, NULL, (void *)testfunc, NULL) != 0) {

fprintf(stderr, "thread create failed\n");

return -1;

}

pthread_join(tid, NULL);

return 0;

}

结果:

fe26e7d2586b38f6f2175a7e92b0683b.png

指定在哪个CPU上运行:

void *threadfunc(void *arg)

{

cpu_set_t mask;

cpu_set_t mask;

int cpuid = 1;

CPU_ZERO(&mask);

CPU_SET(cpuid, &mask);

/* 设置cpu 亲和性(affinity)*/

if (pthread_setaffinity_np(pthread_self(), sizeof(mask), &mask) < 0) {

fprintf(stderr, "set thread affinity failed\n");

}

}

标签:set,int,pthread,mask,cpu,线程,linux,CPU

来源: https://www.cnblogs.com/chay/p/10587452.html

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

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

相关文章

LeetCode 1453. 圆形靶内的最大飞镖数量(几何题)

1. 题目 墙壁上挂着一个圆形的飞镖靶。现在请你蒙着眼睛向靶上投掷飞镖。 投掷到墙上的飞镖用二维平面上的点坐标数组表示。飞镖靶的半径为 r 。 请返回能够落在 任意 半径为 r 的圆形靶内或靶上的最大飞镖数。 示例 1&#xff1a; 输入&#xff1a;points [[-2,0],[2,0…

Pandas入门1(DataFrame+Series读写/Index+Select+Assign)

文章目录1. Creating, Reading and Writing1.1 DataFrame 数据框架1.2 Series 序列1.3 Reading 读取数据2. Indexing, Selecting, Assigning2.1 类python方式的访问2.2 Pandas特有的访问方式2.2.1 iloc 基于index访问2.2.2 loc 基于label标签访问2.3 set_index() 设置索引列2.4…

关于Visual C#.NET数据库开发经典案例解析(附光盘两张)(珍藏版)—的读后感...

关于Visual C#.NET数据库开发经典案例解析&#xff08;附光盘两张&#xff09;&#xff08;珍藏版&#xff09;— 评论读后感&#xff1a;里面的内容很经典&#xff0c;很实用读后感&#xff1a;给初学者是好&#xff0c;但是是比较旧的了&#xff01;VS2003 C/S的读后感&#…

LeetCode 372. 超级次方(快速幂)

1. 题目 你的任务是计算 ab 对 1337 取模&#xff0c;a 是一个正整数&#xff0c;b 是一个非常大的正整数且会以数组形式给出。 示例 1: 输入: a 2, b [3] 输出: 8示例 2: 输入: a 2, b [1,0] 输出: 1024来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&…

c#让电脑锁定、注销、关机

代码 usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Windows.Forms;usingMicrosoft.Win32;usingSystem.Runtime.InteropServices;usingSystem.IO;usingSystem…

Pandas入门2(DataFunctions+Maps+groupby+sort_values)

文章目录3. Summary Functions and Maps3.1 Summary Functions 数据总结函数3.1.1 describe()3.1.2 mean()&#xff0c;median()&#xff0c;idxmax()&#xff0c;unique()&#xff0c;value_counts()3.2 Maps 映射3.2.1 map()3.2.2 apply()3.2.3 内置转换方法4. Grouping and …

linux视频在windows播放器,适用于Windows和Linux的免费多媒体播放器SMPlayer 18.6.0发布 - 爱绿豆...

SMPlayer是一个很好的 MPlayer 电影播放程序前端&#xff0c;可以支持大部分的视频和音频文件。它支持音频轨道切换&#xff0c;允许调节亮度、对比度、色调、饱和度、伽玛值&#xff0c;按照倍速、4倍速等多种速度回放&#xff0c;还可以进行音频和字幕延迟调整以同步音频和字…

OA 办公系统 模块设计

--连接主数据库 use Master go --如果数据库simpleoa 存在&#xff0c;则先删除simpleoa。 if exists (select * from sysdatabases where namesimpleoa) drop database simpleoa go--创建simpleoa数据库 create database simpleoa go-- use simpleoa go--创建用户表 create…

通过java理解linux,Java继承的理解

继承&#xff1a;1)概念把多个类中相同的成员给提取出来定义到一个独立的类中。然后让这多个类和该独立的类产生一个关系&#xff0c;这多个类就具备了这些内容。这个关系叫继承。1.1)定义类时&#xff0c;通过“继承”一个现有的类&#xff0c;子类可以具有父类中的所有属性和…

Blend设计VSM

Silverlight中的ControlTemplate(1)-概念 Silverlight中的ControlTemplate(2)-概念 Silverlight中的ControlTemplate&#xff08;3&#xff09;-Blend设计ControlTemplate 上一篇我是通过Blend简单的演示如何修改ControlTemplate&#xff0c;这一篇关注VSM这个部分。 概念的东…

Pandas入门3(dtype+fillna+replace+rename+concat+join)

文章目录5. dtype 数据类型6. Missing data 缺失值6.1 查找缺失值 pd.isnull()&#xff0c;pd.notnull()6.2 填补缺失值 fillna()&#xff0c;replace()7. Renaming and Combining 重命名、合并7.1 Renaming 重命名7.2 Combining 合并数据learn from https://www.kaggle.com/l…

使用Delphi自带的TDockTabSet组件实现停靠功能(Jeremy North)

源地址&#xff1a;http://edn.embarcadero.com/article/33446 摘要: Instructions on how to use the TDockTabSet component to make advanced docking user interfaces. Introduction This article discusses the use of the TDockTabSet component that was originally int…

安装linux出现基础系统出错,Linux系统出错提示信息详解

ERROR PCI: cannot allocate(无法指派)这样的错误有许多&#xff0c;他们主要在启动系统时出现。他们有一个共同的起因&#xff1a;错误的电源管理行为。罪魁祸首是一个叫做ACPI的东西&#xff0c;即高级配置与电源接口。尽管他是一种电源管理标准&#xff0c;但在十几年的时间…

c语言基本数据类型常量,C语言基础学习基本数据类型-变量和常量

变量和常量什么是变量和常量&#xff1f;有些数据在程序运行前就预先设定&#xff0c;并在运行过程中不发生变化&#xff0c;称之为常量&#xff1b;有些数据在程序运行中可能发生变化或被赋值&#xff0c;称之为变量。使用变量前必须先声明一个变量。变量定义的语法是&#xf…

2011年影响3G手机发展四大因素

今晨闻讯&#xff0c;中电信明年3季度将推出iPhone。据称CDMA版本的iPhone推出&#xff0c;对中国电信意义重大&#xff0c;售价会高于WCDMA版。联通、移动、电信争夺“苹果血案”将继续上演。 截止2010年12月31日&#xff0c;中国3G用户不超过5000万。而工信部落实3G发展规划是…

Feature Engineering 特征工程 1. Baseline Model

文章目录1. 读取数据2. 处理label3. 添加特征4. 数据集切片5. 训练6. 预测learn from https://www.kaggle.com/learn/feature-engineering下一篇&#xff1a;Feature Engineering 特征工程 2. Categorical Encodings 1. 读取数据 预测任务&#xff1a;用户是否会下载APP&…

[转载] 湖北:星空团队——海燕计划

2010-7-1 来源&#xff1a;网易科技报道 本文网址&#xff1a;http://tech.163.com/10/0701/16/6AH5MA4S00094II8.html 1.项目及团队名称&#xff1a;星空团队——海燕计划 2.所在的赛区、所在的城市、所属高校&#xff1a;湖北赛区、武汉、华中科技大学 3.所处的公益领域&…

c语言静态存储和动态存储,为了便于计算机存储管理,C语言把保存所有变量的数据区,分成动态存储区和静态存储区,静态局部变量被存放在动态存储区。...

在向旅游者致欢迎词时&#xff0c;便于保存变量部变地陪的态度要热情&#xff0c;感情要真挚&#xff0c;内容要依情而异&#xff0c;语言要( )计算机存据区静山西省总的地势是()。储管成动储区储区存放储区提出到2020年要将我国旅游业建设成国民经济的战略性支柱产业和人民群众…

Feature Engineering 特征工程 3. Feature Generation

文章目录1. 组合特征2. 过去7天的数据3. 上一个相同类型的项目的时间4. 转换数值特征learn from https://www.kaggle.com/learn/feature-engineering上一篇&#xff1a;Feature Engineering 特征工程 2. Categorical Encodings 下一篇&#xff1a;Feature Engineering 特征工程…

C# 转繁体转简体转拼音,超级文本大转换

最近项目中遇到一个需求&#xff1a;把员工的中文姓名根据系统配置转换成中文简体或中文繁体。 原以为需要一个很大的一个简体和繁体相对应的字符对应表之类的东西。 后来发现&#xff0c;VB中就包含了这样的函数Strings.StrConv(this.TextBox1.Text.Trim(), VbStrConv.Traditi…