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);
}
}