Linux 设置cpu亲和力(将进程/线程绑定不同core/cpu)

Linux 设置cpu亲和力(将进程/线程绑定不同core/cpu)

进程绑定到CPU
#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
线程绑定到CPU
    
#include <pthread.h>
int pthread_setaffinity_np(pthread_t thread, size_t cpusetsize, const cpu_set_t *cpuset);
int pthread_getaffinity_np(pthread_t thread, size_t cpusetsize, cpu_set_t *cpuset);
当进程绑定到特定的CPU之后,线程还是可以绑定到其他的CPU的,没有冲突。

示例代码:

设置cpu亲和力
		sysconf(_SC_NPROCESSORS_CONF);  //获取核数
		get_nprocs(); //获取核数
        int cpuId = get_nprocs() - 1; //最大的cpu Id 
        cpu_set_t mask;
        CPU_ZERO(&mask);
        CPU_SET(cpuId,&mask);
        if (pthread_setaffinity_np(pthread_self(), sizeof(mask), &mask) == -1)
        {
            printf("warning: could not set affinity ERROR:%s\n", strerror(errno));
        }
        
检查cpu亲和力:
		cpu_set_t get;
        if (sched_getaffinity(0, sizeof(get), &get) == -1)//获取线程CPU亲和力
        {
        	printf("warning: cound not get thread affinity, continuing...\n");
        }
        for (i = 0; i < num; i++)
        {
        	if (CPU_ISSET(i, &get))//判断线程与哪个CPU有亲和力
            {
                printf("this thread %d is running processor : %d\n", i,i);
            }
        }

猜你喜欢

转载自blog.csdn.net/vegeta852/article/details/109447698