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…

熟悉linux运行环境,实验一 熟悉Ubuntu环境

实验一熟悉Ubuntu环境【实验目的】1&#xff0e;了解Ubuntu系统基本操作方法&#xff0c;学会独立使用该系统。2&#xff0e;熟悉Ubuntu下如何编辑、编译和运行一个C语言程序。3&#xff0e;学会利用gcc、gdb编译、调试C程序。【预习内容】1&#xff0e;预习Ubuntu下各种应用程…

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的读后感&#…

linux git还原文件,Gitlab备份到windows、在Linux恢复

一 备份gitlab为完整压缩包# 在目录/var/opt/gitlab/backups/ 创建备份文件gitlab-rake gitlab:backup:create/var/opt/gitlab/backups/1559614181_2019_06_04_10.7.7_gitlab_backup.tar查看备份文件夹容量df -h /var/opt/gitlab/backups二 恢复gitlab复制gitlab_backup.tar到对…

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…

linux错误自动报告工具,linux – 关闭abrt的电子邮件通知(自动错误报告工具)

我正在配置CentOS 6.2并且已经看到了一些“[abrt]完整崩溃报告”电子邮件.我知道abrt对于创建崩溃转储非常有用,所以我不想禁用该服务,我只是想停止获取崩溃报告电子邮件.我可能不得不在/etc/abrt/abrt.conf中添加一些配置文件.我似乎无法在搜索中找到任何内容.任何的想法&…

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 …

Adobe和苹果相互推诿 不支持Flash谁之过?

针对苹果CEO史蒂夫乔布斯 (Steve Jobs)的指责&#xff0c;Adobe CTO凯文林奇(Kevin Lynch)日前给予回应&#xff0c;称苹果iPad不支持Flash完全是苹果的错。上周三&#xff0c;苹果发布了业内期待已久的平板电脑iPad&#xff0c;但由于不支持 Flash而遭到了用户抱怨。对此&…

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

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

LeetCode 393. UTF-8 编码验证(位运算)

1. 题目 UTF-8 中的一个字符可能的长度为 1 到 4 字节&#xff0c;遵循以下的规则&#xff1a; 对于 1 字节的字符&#xff0c;字节的第一位设为0&#xff0c;后面7位为这个符号的unicode码。对于 n 字节的字符 (n > 1)&#xff0c;第一个字节的前 n 位都设为1&#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;子类可以具有父类中的所有属性和…

LeetCode 373. 查找和最小的K对数字(自定义优先队列BFS)

1. 题目 给定两个以升序排列的整形数组 nums1 和 nums2, 以及一个整数 k。 定义一对值 (u,v)&#xff0c;其中第一个元素来自 nums1&#xff0c;第二个元素来自 nums2。 找到和最小的 k 对数字 (u1,v1), (u2,v2) … (uk,vk)。 示例 1: 输入: nums1 [1,7,11], nums2 [2,4,…

Android中使用Thread线程出现的问题

很多初入Android或Java开发的新手对Thread、Looper、Handler和Message仍然比较迷惑&#xff0c;衍生的有HandlerThread、java.util.concurrent、Task、AsyncTask由于目前市面上的书籍等资料都没有谈到这些问题&#xff0c;今天Android123就这一问题做更系统性的总结.  Androi…

linux防火墙的复规则,Centos下iptables防火墙规则编辑方法 - YangJunwei

今天整理一下Centos下iptables防火墙规则的保存、清除等编辑方法。如已经安装&#xff0c;请跳过。$ yum install iptables二、查看 iptables 防火墙已有规则以下四种方法任选其一即可。$ service iptables status$ /etc/init.d/iptables status (此方法为上一方法的路径执行版…

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…

Linux连接状态为syn_recv,linux 服务器 syn*** 大量SYN_RECV状态处理

1、查看连接状态netstat -nat | awk /^tcp/{S[$NF]}END{for (a in S) print a,S[a]}SYN_RECV表示正在等待处理的请求数&#xff1b;ESTABLISHED表示正常数据传输状态&#xff1b;TIME_WAIT表示处理完毕&#xff0c;等待超时结束的请求数。状态&#xff1a;描述CLOSED&#xff1…