CPU亲和度

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亲和度,将进程绑定到了CPU core7上,

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

并且每个间隔都约1s:

 

原文地址:https://www.cnblogs.com/lingjiajun/p/11328836.html