zoukankan      html  css  js  c++  java
  • 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:

     

  • 相关阅读:
    c++ 网络编程(四) LINUX/windows下 socket 基于I/O复用的服务器端代码 解决多进程服务端创建进程资源浪费问题
    c++ 网络编程(三) LINUX/windows 进程间的通信原理与实现代码 基于多进程的服务端实现
    c++ 网络编程(二) linux 下多进程socket通信 多个客户端与单个服务端交互代码实现回声服务器
    c++ 网络编程(一)TCP/UDP windows/linux 下入门级socket通信 客户端与服务端交互代码
    c++ MFC图像处理CImage类常用操作代码
    vue 模板语法
    占位1
    MongoDB
    Node.js fs-文件系统
    nodeJs 常用模块(一)
  • 原文地址:https://www.cnblogs.com/lingjiajun/p/11328836.html
Copyright © 2011-2022 走看看