CPU进程绑定技术(指定当前运行的CPU核)

  1. 1、参考
  2. 2、将进程绑定到特定CPU核心上
    1. 2.1、进程绑定到特定CPU
    2. 2.2 对于arm设备指定cpu核心的方法:
  3. THE END!

1、参考

https://linux.die.net/man/3/cpu_zero
http://www.man7.org/linux/man-pages/man3/CPU_SET.3.html#top_of_page
https://www.linuxidc.com/Linux/2015-04/116867.htm
http://blog.163.com/liaoxiangui@126/blog/static/7956964020127204171138/
https://blog.csdn.net/honey_yyang/article/details/7848608/

2、将进程绑定到特定CPU核心上

目的: 为了能够让程序拥有更好的性能,有时候需要将进程或线程绑定到特定的CPU,这样可以减少调度的开销和保护关键进程或线程。

2.1、进程绑定到特定CPU

Linux提供一个接口,可以将进程绑定到特定的CPU:

#define _GNU_SOURCE
#include <sched.h>

int sched_setaffinity(pid_t pid, size_t cpusetsize, const cpu_set_t *mask);

int sched_getaffinity(pid_t pid, size_t cpusetsize, cpu_set_t *mask);

参数

pid:进程的id号,如果pid为0,则表示本进程
cpusetsize:mask的大小
mask:运行进程的CPU,可以通过以下函数操作mask


#define CPU_SET(cpu, cpusetp) //设置cpu

#define CPU_CLR(cpu, cpusetp) //删除cpu

#define CPU_ISSET(cpu, cpusetp) //判断cpu

#define CPU_ZERO(cpusetp) //初始化为0

示例代码:


#include <stdio.h>
#include <unistd.h>
#include <math.h>
#include <sched.h>

void WasteTime()
{
    int abc = 10000000;
    while(abc--)
    {
        int tmp = 10000*10000;
    }
    sleep(1);

}

int main(int argc, char **argv)
{
    cpu_set_t mask;
    while(1)
    {

        CPU_ZERO(&mask);
        CPU_SET(0, &mask);
        if (sched_setaffinity(0, sizeof(mask), &mask) < 0) {
            perror("sched_setaffinity");
        }
        WasteTime();

        CPU_ZERO(&mask);
        CPU_SET(1, &mask);
        if (sched_setaffinity(0, sizeof(mask), &mask) < 0) {
            perror("sched_setaffinity");
        }
        WasteTime();

        CPU_ZERO(&mask);
        CPU_SET(2, &mask);
        if (sched_setaffinity(0, sizeof(mask), &mask) < 0) {
            perror("sched_setaffinity");
        }
        WasteTime();

        CPU_ZERO(&mask);
        CPU_SET(3, &mask);
        if (sched_setaffinity(0, sizeof(mask), &mask) < 0) {
            perror("sched_setaffinity");
        }
        WasteTime();
    }
}

2.2 对于arm设备指定cpu核心的方法:

#if CONFIG_CORE
#define _GNU_SOURCE   //启动CPU_ZERO和CPU_SET等系统函数
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <sys/syscall.h>
#inlcude <sched.h>
#include <pthread.h>
#include <fcntl.h>
#inlcude <unistd.h>
#include <errno.h>

static void __setAffinity_CPU_0(pid_t tid)
{
  cpu_set_t cs;
  CPU_ZERO(&cs);
  CPU_SET(&cs,0);//设置CPU核心为0
  sched_setaffinity(tid,sizeof(cs),&cs);
}
#endif

int main(int argc, char **argv)
{
#if CONFIG_CORE
    int coreindex = 3;
    pid_t tid = null;

    tid = syscall(SYS_gettid);
    setAffinity_CPU(tid, coreindex);
#endif
}

//指定cpu核
pid_t tid = syscall(SYS_gettid);//获取当前进程pid
__setAffinity_CPU_0(tid);//指定在CPU为0的核上运行,不指定时,运行的cpu随机分配,在不同的核上运行性能会有所差异。

结果查看:
查看具体进程情况可以在执行时在另一个窗口使用top -h来查看线程的情况,查看各个核上的情况请使用top命令然后按数字“1”来查看。这样就可以知道当前进程是在哪个CPU核心上运行的了。


THE END!


本博文只能阅读,谢绝转载,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 2963033731@qq.com

文章标题:CPU进程绑定技术(指定当前运行的CPU核)

字数:666

本文作者:Soaring Lee

发布时间:2018-08-25, 15:13:47

最后更新:2021-06-14, 12:13:44

原始链接:https://soaringleefighting.github.io/2018/08/25/【PE系列】CPU进程绑定技术(指定当前运行的CPU核)/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

×

喜欢就点赞,疼爱就打赏

相册