当前位置: 首页 > 编程日记 > 正文

使用 sched_setaffinity 将线程绑到CPU核上运行

linux 提供CPU调度函数,可以将CPU某一个核和指定的线程绑定到一块运行。
这样能够充分利用CPU,且减少了不同CPU核之间的切换,尤其是在IO密集型压力之下能够提供较为友好的性能。

通过sched_setaffinity 设置 CPU 亲和力的掩码,从而将该线程或者进程和指定的CPU绑定

一个CPU的亲合力掩码用一个cpu_set_t结构体来表示一个CPU集合,下面的几个宏分别对这个掩码集进行操作:
CPU_ZERO() 清空一个集合
CPU_SET()CPU_CLR()分别对将一个给定的CPU号加到一个集合或者从一个集合中去掉.
CPU_ISSET()检查一个CPU号是否在这个集合中

  • 头文件 sched.h
  • sched_setaffinity(pid_t pid, unsigned int cpusetsize, cpu_set_t *mask)
    该函数设置进程为pid的这个进程,让它运行在mask所设定的CPU上.
    • 如果pid的值为0,则表示指定的是当前进程,使当前进程运行在mask所设定的那些CPU上.
    • 第二个参数cpusetsize是mask所指定的数的长度.通常设定为sizeof(cpu_set_t).如果当前pid所指定的进程此时没有运行在mask所指定的任意一个CPU上,则该指定的进程会从其它CPU上迁移到mask的指定的一个CPU上运行.
    • mask 即用户 通过CPU_SET 接口,线程ID 绑定刀片集合中的一个CPU上,使用mask来表示cpu集合中的CPU
  • sched_getaffinity(pid_t pid, unsigned int cpusetsize, cpu_set_t *mask)
    该函数获得pid所指示的进程的CPU位掩码,并将该掩码返回到mask所指向的结构中.即获得指定pid当前可以运行在哪些CPU上.同样,如果pid的值为0.也表示的是当前进程

使用方式如下:

#include <stdio.h>
#include <unistd.h>
#include <time.h>
#include <signal.h>
#include <string.h>#define __USE_GNU
#include <sched.h>
#include <pthread.h>int num;void *thread_func1(void *arg) {cpu_set_t mask;  //CPU核的集合cpu_set_t get;   //获取在集合中的CPUint *a = (int*)arg; printf("the a is:%d\n",*a);  //显示是第几个线程CPU_ZERO(&mask);    //置空CPU_SET(*a,&mask);   // 将当前线程和CPU绑定if(sched_setaffinity(0, sizeof(mask), &mask)) {printf("warning ! set affinity failed! \n");      } else {while (1){CPU_ZERO(&get);if (sched_getaffinity(0, sizeof(get), &get) == -1)//获取线程CPU亲和力{printf("warning: cound not get thread affinity, continuing...\n");}int i;for (i = 0; i < num; i++){if (CPU_ISSET(i, &get))//判断线程与哪个CPU有亲和力{printf("this thread %d is running processor : %d\n", i,i);}}}}return NULL; 
}void *thread_func2(void *arg) {cpu_set_t mask;  //CPU核的集合cpu_set_t get;   //获取在集合中的CPUint *a = (int*)arg; printf("the a is:%d\n",*a);  //显示是第几个线程CPU_ZERO(&mask);    //置空CPU_SET(*a,&mask);   // 将当前线程和CPU绑定if(sched_setaffinity(0, sizeof(mask), &mask) == -1) {printf("warning ! set affinity failed! \n");      } else {while (1){CPU_ZERO(&get);if (sched_getaffinity(0, sizeof(get), &get) == -1)//获取线程CPU亲和力{printf("warning: cound not get thread affinity, continuing...\n");}int i;for (i = 0; i < num; i++){if (CPU_ISSET(i, &get))//判断线程与哪个CPU有亲和力{printf("this thread %d is running processor : %d\n", i,i);}}}}return NULL; 
}int main() {pthread_t t1;pthread_t t2;int t_1 = 0;int t_2 = 1;// 获取CPU核数num = sysconf(_SC_NPROCESSORS_CONF);// 需要传入t_1,t_2,来作为线程的参数,用来核CPU核绑定pthread_create(&t1, NULL, (void *)thread_func1,&t_1);pthread_create(&t2, NULL, (void *)thread_func2,&t_2);pthread_join(t1, NULL);pthread_join(t2, NULL);printf("main thread end\n");return 0;
}

如果使用到pthread,则需要将pthread.h 放到sched.h之后,并在sched.h之前声明#define __USE_GNU
否则会出现undefined reference CPU_ZERO等错误

编译:
gcc sched_cpu.c -o sched_cpu -pthread
以上代码将两个线程分别绑定到0,1号CPU上

运行后的CPU 效果图如下:
在这里插入图片描述

相关文章:

Objective C内存管理之理解autorelease------面试题

Objective C内存管理之理解autorelease Autorelease实际上只是把对release的调用延迟了&#xff0c;对于每一个Autorelease&#xff0c;系统只是把该Object放入了当前的Autorelease pool中&#xff0c;当该pool被释放时&#xff0c;该pool中的所有Object会被调用Release。 &…

c语言子程序return,c语言return返回到哪

c语言return返回到哪c语言return&#xff0c;返回给了上一级&#xff0c;比如一个递归程序&#xff0c;从第三层返回到第二层&#xff1b;又比如一个普通的子程序&#xff0c;那就返回到主程序中去。主程序中return返回给了操作系统。比如下面一个c程序int sum(int a, int b) {…

有关 schema

2019独角兽企业重金招聘Python工程师标准>>> 主要分析2点 &#xff1a;schema含义 以及 多schema下的XA处理 A schema is a collection of database objects (used by a user.). Schema objects are the logical structures that directly refer to the database’…

关于查询ios的app更新的历史版本记录

https://www.qimai.cn 推荐七麦数据 可以查询app的各种版本更新内容 由于历史久远忘记了自己app第一次上架的时间 通过这个可以查询 转载于:https://www.cnblogs.com/ccw-congcong/p/10593917.html

关于 Rocksdb 性能分析 需要知道的一些“小技巧“ -- perf_context的“内功” ,systemtap、perf、 ftrace的颜值

文章目录内部工具包含头文件接口使用核心指标Perf ContextIOStats Context外部工具Systemtap 工具Perf工具Ftrace 工具2020.8.20 23:23 &#xff0c;又到了夜深人静学习时&#xff0c;不断得思考总结总会让繁忙一天的大脑得到舒缓。作为单机存储引擎&#xff0c;Rocksdb总会被嵌…

一维数组求平均值c语言编程软件,c语言编程:用数组名作函数参数,编写一个对一维数组求平均值的函数,并在主函数中调用它...

#includeincludeint main(){void sort1(char*p1);void print(char*p2);static char*name[]{"zhangwww.book1234.com防采集请勿采集本网。#include #include #include float b(float arr[],int n); //<<<不知道你说的第2&#xff0c;4&#xff0c;5语句对应的是什…

2014年10月18日

我姐一个一点追求都没有弄的我气死了.女人管不住自己的臭嘴就让人烦死/ 还能不能嫁出去 蠢 女人说一个男的没追求没出息就是找枪口撞 蠢死转载于:https://www.cnblogs.com/wangduqiang/p/4180892.html

接口响应慢?那是你没用 CompletableFuture 来优化!

大多数程序员在平时工作中,都是增删改查。这里我跟大家讲解如何利用CompletableFuture优化项目代码,使项目性能更佳!

SQL Server 2012入门T-SQL基础篇:(8)Delete语句

基本的语法格式如下:Deleteform表名[where条件语句]此语句将删除表的部分或者全部记录;(1)带WHERE条件子句,将删除符合条件的记录:可以看到已经删除了"EmployeeKey1"的记录;(2)不带条件的delete的语句,将表中删除所有记录;转载于:https://blog.51cto.com/281816327/1…

30张图带你彻底理解红黑树

当在10亿数据进行不到30次比较就能查找到目标时,不禁感叹编程之魅力!人类之伟大呀!—— 学红黑树有感。终于,在学习了几天的红黑树相关的知识后,我想把我所学所想和所感分享给大家。红黑树是一种比较难的数据结构,要完全搞懂非常耗时耗力,红黑树怎么自平衡?什么时候需要左旋或右旋?插入和删除破坏了树的平衡后怎么处理?等等一连串的问题在学习前困扰着我。如果你在学习过程中也会存在我的疑问,那么本文对你会有帮助,本文帮助你全面、彻底地理解红黑树!

Linux内核分析--理解进程调度时机、跟踪分析进程调度和进程切换的过程

学号后三位:426 原创作品转载请注明出处 https://github.com/mengning/linuxkernel/ 1.进程的创建 除了0号进程&#xff08;系统创建的&#xff09;之外&#xff0c;linux系统中都是由其他进程创建的。创建新进程的进程&#xff0c;即调用fork函数的进程为父进程&#xff0c;…

数据结构 -- 散列表

散列表作为一种能够提供高效插入&#xff0c;查找&#xff0c;删除 以及遍历的数据结构&#xff0c;被应用在很多不同的存储组件之中。 就像rocksdb中的hashskiplist&#xff0c;redis的有序集合&#xff0c;java的 LinkedHashMap 等 都是一些非常有特色的核心数据结构&#xf…

c语言编程题餐饮服务打分,求详细分析C语言题餐饮服务质量调查打分题和答案..._质量员考试_帮考网...

bangsaizhuo新兵答主11-09TA获得超过6761个赞二、填空题1. &#xff3f;&#xff3f;&#xff3f;变量&#xff3f;&#xff3f;是指在程序运行过程中&#xff0c;值可以发生变化的量。2.C语言是一种&#xff3f;&#xff3f;&#xff3f;&#xff3f;区分&#xff3f;(区分/不…

为什么阿里巴巴修正了HashMap关于1024个元素扩容的次数?(典藏版)

此番修正主要是每个人对「扩容」定义存在了分歧,在JDK1.8中如果没有给HashMap设置初始容量,那么在第一次put()操作的时候会进行resize()。而有的人认为这算一次扩容,有的人认为这不是一次扩容,这只是HashMap容量的初始化。所以存储1024的元素时:前者的人认为扩容次数为8次。后者的人认为扩容次数为7次。孤尽老师说对此分歧,希望用没有「二义性」的语言来表示,所以「扩容次数」修正为「resize次数」。

【转】每天一个linux命令(31): /etc/group文件详解

原文网址&#xff1a;http://www.cnblogs.com/peida/archive/2012/12/05/2802419.html Linux /etc/group文件与/etc/passwd和/etc/shadow文件都是有关于系统管理员对用户和用户组管理时相关的文件。linux /etc/group文件是有关于系统管理员对用户和用户组管理的文件,linux用户组…

C#设计模式(7)——适配器模式(Adapter Pattern)

一、引言在实际的开发过程中&#xff0c;由于应用环境的变化&#xff08;例如使用语言的变化&#xff09;&#xff0c;我们需要的实现在新的环境中没有现存对象可以满足&#xff0c;但是其他环境却存在这样现存的对象。那么如果将“将现存的对象”在新的环境中进行调用呢&#…

强烈建议你不要再使用Date类了!!!

这里就不细说修改流程了,主要说一下我们在改造的时候遇到的一些问题。(Date从现在开始)是一个糟糕的类型,这解释了为什么它的大部分内容在 Java 1.1 中被弃用(但不幸的是仍在使用)。只能说这种基础的类改起来牵一发动全身,需要从DO实体类看起,然后就是各种Converter,最后是DTO。这个改造难度不高,但是复杂度非常高,一个地方没改好,轻则接口报错,重则启动失败,非常耗费精力,真不想改。我们要改的原因很简单,我们的代码缺陷扫描规则认为这是一个必须修改的缺陷,否则不给发布,不改不行,服了。

windows 安装MySQL服务 zip解压程序

1&#xff1a;配置 my.ini 文件 如下&#xff1a; [mysql] default-character-setutf8[mysqld] port3306basedirD:\\Program Files\\databases\\mysql-5.7.24datadirD:\\Program Files\\databases\\mysql-5.7.24\\datamax_connections200max_connections200character-set-serve…

数据结构 -- 图与图存储

我们在使用像QQ &#xff0c;微信&#xff0c;微博&#xff0c;快手&#xff0c;抖音等社交软件的过程中经常需要添加好友&#xff0c;关注好友和被好友关注。这个过程中 这样的社交网络中的好友关系就需要被存储下来&#xff0c;存储在各个公司的后台服务器之上&#xff0c;都…

Struts2 验证规则配置文件

1. Action级别校验命名格式&#xff1a; ActionClassName-validation.xml 2. Action中某个方法的校验命名格式&#xff1a; ActionClassName-ActionAliasName-validation.xml 注意&#xff1a;这里的ActionAliasName(action别名)指的是struts.xml中Action name"XX"的…

c语言中手机系统,一种手机课堂C语言编程系统的制作方法

技术特征&#xff1a;1.一种手机课堂C语言编程系统&#xff0c;其特征在于&#xff1a;该系统由手机端C语言编译运行单元、嵌入式主机端传输单元、台式机端显示单元和投影仪端显示单元组成&#xff1b;所述手机端C语言编译运行单元、嵌入式主机端传输单元、台式机端显示单元和投…

cpp中sizeof与指针

一直不清楚c的sizeof&#xff0c;现在通过实验得到了一些了解。 1 #include<iostream>2 3 using namespace std;4 5 class A{6 private:7 char * a1;8 // ! static int totalPeople0; //error: ISO C forbids in-class initialization of non-const static me…

利用Python制作简单的小程序:IP查看器

前言 说实话&#xff0c;查看电脑的IP&#xff0c;也挺无聊的&#xff0c;但是够简单&#xff0c;所以就从这里开始吧。IP地址在操作系统里就可以直接查看。但是除了IP地址&#xff0c;我们也想通过IP获取地理地址和网络运营商情况。IP地址和地理地址并没有固定的关系&#xff…

一文带你看透 GDB 的 实现原理 -- ptrace真香

文章目录Ptrace 的使用GDB 的基本实现原理Example1 通过ptrace 修改 被追踪进程的内存数据Example2 通过ptrace 对被追踪进程进行单步调试Ptrace的实现PTRACE_TRACEMEPTRACE_ATTACHPTRACE_CONTPTRACE_SINGLESTEPPTRACE_PEEKDATAPTRACE_POKEDATAPTRACE_GETREGSGDB本身能够attach…

线程使用 c语言,如何用C语言实现多线程

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼Windows操作系统&#xff0c;C语言实现多线程&#xff1a;#include #include DWORD APIENTRY ThreadOne ( LPVOID threadArg ){printf ( "线程开始啦&#xff0c;参数是&#xff1a;%s\n" , (char *)threadArg );return …

eclipse设置保护色非原创

eclipse操作界面默认颜色为白色。对于我们长期使用电脑编程的人来说&#xff0c;白色很刺激我们的眼睛&#xff0c;所以我经常会改变workspace的背景色&#xff0c;使眼睛舒服一些。设置方法如下&#xff1a;1、打开window->Preference,弹出Preference面板2、展开General标签…

markdown 使用

1&#xff1a;新手建议 2&#xff1a;windows下使用 http://markdownpad.com/ 3&#xff1a;linux http://benweet.github.io/stackedit/# 二&#xff1a;使用工具 mac http://moustand.com/windows http://markdownpad.com/http://wowubuntu.com/markdown/注&#xff1a;建议 …

python第九章:面向对象--小白博客

面向对象介绍 一、面向对象和面向过程 面向过程&#xff1a;核心过程二字&#xff0c;过程即解决问题的步骤&#xff0c;就是先干什么后干什么 基于该思想写程序就好比在这是一条流水线&#xff0c;是一种机械式的思维方式 优点&#xff1a;复杂的过程流程化 缺点&…

分布式一致性(共识)算法(Paxos,raft,ZAB)的一些总结

文章目录前言CAP理论C consistency 一致性A availability 可用性P partition tolerance 分区容错性一致性模型弱一致性强一致性强一致性算法需要明确的问题强一致算法&#xff1a; 主从同步强一致性算法&#xff1a;多数派强一致算法&#xff1a;PaxosBasic PaxosMulti Paxos第…

dedecms 财付通接口

用织梦做了个旅游网站&#xff0c;网址&#xff1a;http://www.redtourism.cn/ 客户要求财付通支付&#xff0c;上网找了下 不是要买就是要钱&#xff0c;只有自己写了。 代码&#xff1a; <?phpif(!defined(DEDEINC)) exit(Request Error!);/** *财付通接口类 */class ten…