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\n",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\n"); 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\n"); 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\n", i,i); 38 } 39 40 i = 30; 41 while(i--) 42 { 43 sleep(1); 44 printf("[ljj_test]---cnt = %d\n", 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:
还在成长。。。