CPU亲和度

摘要:
CPU亲和性是强制进程或线程在CPU内核上运行。如下所示:首先,运行ljj_Test,如果未设置相关性,则默认情况下从CPU0运行。然后,它设置CPU相关性,并将进程绑定到CPUcore7。因为使用了while循环,printf运行了多次,但因为使用了睡眠函数,所以它会主动放弃时间片,所以只运行了一小段时间:每个间隔约为1s:

CPU亲和度(CPU Affinity),就是将一个进程或者线程强制绑定在CPU的某一个core上运行。

参考:https://www.cnblogs.com/zhangxuan/p/6427533.html

https://www.cnblogs.com/LubinLew/p/cpu_affinity.html

demo是将ljj_test进程强制绑定在CPU core7上运行。

代码如下:

 1 #define __USE_GNU //这个必须要加,不然编译不过,因为在sched.h中,用该宏控制打开和关闭cpu_set_t的定义
 2 #include <stdio.h>
 3 #include <unistd.h>
 4 #include <sched.h>
 5 #include <stdlib.h>
 6 
 7 int main(){
 8         int i, pid, ret, num;
 9         cpu_set_t mask;
10         
11         pid = getpid();
12         num = sysconf(_SC_NPROCESSORS_CONF);  //获取核数
13         printf("[ljj_test] pid = %d, cpu cores = %d
",pid, num);
14 
15         CPU_ZERO(&mask);//clear
16         CPU_SET(7, &mask);//cpu7
17 
18         ret = sched_setaffinity(pid, sizeof(cpu_set_t), &mask);
19         if(ret < 0)
20         {
21                 printf("[ljj_test]---error1
");
22                 return -1;
23         }
24 
25         CPU_ZERO(&mask);//clear
26         
27         ret = sched_getaffinity(pid, sizeof(cpu_set_t), &mask);
28         if(ret < 0)
29         {
30                 printf("[ljj_test]---error2
");
31                 return -2;
32         }
33 
34         for (i = 0; i < num; i++)  
35         {  
36                 if (CPU_ISSET(i, &mask))//判断线程与哪个CPU有亲和力  
37                         printf("this thread %d is running processor : %d
", i,i);  
38         }
39 
40         i = 30;
41         while(i--)
42         {
43                 sleep(1);
44                 printf("[ljj_test]---cnt = %d
", i);
45         }
46         return 0;
47 }

运行log如下:

 1 htc_imedugl:/ # ./system/xbin/ljj_test                                         
 2 [ljj_test] pid = 1823, cpu cores = 8
 3 this thread 7 is running processor : 7
 4 [ljj_test]---cnt = 29
 5 [ljj_test]---cnt = 28
 6 [ljj_test]---cnt = 27
 7 [ljj_test]---cnt = 26
 8 [ljj_test]---cnt = 25
 9 [ljj_test]---cnt = 24
10 [ljj_test]---cnt = 23
11 [ljj_test]---cnt = 22
12 [ljj_test]---cnt = 21
13 [ljj_test]---cnt = 20
14 [ljj_test]---cnt = 19
15 [ljj_test]---cnt = 18
16 [ljj_test]---cnt = 17
17 [ljj_test]---cnt = 16
18 [ljj_test]---cnt = 15
19 [ljj_test]---cnt = 14
20 [ljj_test]---cnt = 13
21 [ljj_test]---cnt = 12
22 [ljj_test]---cnt = 11
23 [ljj_test]---cnt = 10
24 [ljj_test]---cnt = 9
25 [ljj_test]---cnt = 8
26 [ljj_test]---cnt = 7
27 [ljj_test]---cnt = 6
28 [ljj_test]---cnt = 5
29 [ljj_test]---cnt = 4
30 [ljj_test]---cnt = 3
31 [ljj_test]---cnt = 2
32 [ljj_test]---cnt = 1
33 [ljj_test]---cnt = 0

同时,我也抓取了systrace,用于check进程的运行情况。如下:

首先,一开始运行ljj_test,没有设置亲和度,那么它默认从CPU0上运行了(这个不一定每次是CPU core0,是会从进程调度的管理中动态选择core而运行new task):

 CPU亲和度第1张

而后,设置了CPU亲和度,将进程绑定到了CPU core7上,

CPU亲和度第2张

因为使用了一个while循环,多次运行printf,但是由于使用的是sleep函数,会主动放弃时间片,所以只有一小段时间是处于running:

CPU亲和度第3张

并且每个间隔都约1s:

 CPU亲和度第4张

免责声明:文章转载自《CPU亲和度》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇移动端——JS(一)Qt QProgressBar和QSlider qss 样式下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

QT工程文件的条件编译选择与额外的编译参数配置

QTCreator打开.pro工程文件后,依据不同的构建套件创建项目组。在项目组中,点开构建步骤的“详情”,增加一个自己的宏定义,比如: DEFINES+=IMX_287 然后,我们在.pro文件中添加: contains(DEFINES,IMX_287){ # contains 'Embedded Linux' message( "C...

Centos下堡垒机Jumpserver V3.0环境部署完整记录(2)-配置篇

前面已经介绍了Jumpserver V3.0的安装,基于这篇安装文档,下面说下Jumpserver安装后的的功能使用: 一、jumpserver的启动 Jumpserver的启动和重启 [root@test-vm001 install]# /opt/jumpserver/service.sh start/restart 二、按照Jumpserver部署过...

数据库插入超时问题的一个原因和解决方案

近来碰到一个问题,就是客服部使用软件总是出现不能保存的情况.一直找不到原因.后来才发现是数据操作超时. 但是到底是什么导致的超时呢?这里使用了一个事务进行操作,难道是事务锁定的问题? 一直没想到是什么原因,后来才发现原来数据库的文件增长的autoGrowth属性变成了1280percent(1280%),变成了这么大,所以在这个时候即使执行一个简单inse...

迷你MVVM框架 avalonjs 入门教程

新官网请不要无视这里,这里都是链接,可以点的 OniUI组件库 学习教程 视频教程: 地址1 地址2 关于AvalonJs 开始的例子 扫描 视图模型 数据模型 绑定 作用域绑定(ms-controller, ms-important) 忽略扫描绑定(ms-skip) 模板绑定(ms-include) 数据填充(ms-text, ms-htm...

linux_流处理_sed

1. Sed简介    sed 是 一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处 理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输 出。Sed主要用来自动编辑一个...

CAS5.3服务器搭建与客户端整合SpringBoot以及踩坑笔记

CAS5.3服务器搭建与客户端整合SpringBoot以及踩坑笔记 cas服务器的搭建 导出证书(1和2步骤是找了课程,随便写了一下存记录,不过对于自己测试不投入使用应该不影响) C:UsersDdlm2>keytool -genkey -alias testcas -keystore D:/testcas -storepass 123456...