在讲解具体实现之前,我们先来看一个场景:
启动一个进程,并且在启动的时候就绑定该进程运行的CPU,如下图(我们是在KVM中启动一个虚拟机,该虚拟机启动时就进行了CPU绑定):
可以看到虚拟机进程vCPU确实被绑定在了0-11,24-35号CPU上,下面我们使用taskset修改该进程绑定的CPU上,比如修改为12-23,结果如下:
可以看到上面设置失败,于是我们编程再次尝试一下,程序如下:
#include<stdlib.h>
#include<stdio.h>
#include<sys/types.h>
#include<sys/sysinfo.h>
#include<unistd.h>
#define __USE_GNU
#include<sched.h>
#include<ctype.h>
#include<string.h>
int main(int argc, char const *argv[]){
if(argc<2){
printf("参数错误\n");
exit(-1);
}
char str[128]="error";
cpu_set_t mask; //CPU核的集合
pid_t pid=atoi(argv[1]);
int i,res=0;
int cpu_nums=sysconf(_SC_NPROCESSORS_CONF);//获取系统CPU总数
printf("pid=%d\tcpu_nums=%d\n",pid,cpu_nums);
CPU_ZERO(&mask); //置空
sched_getaffinity(pid, sizeof(mask),&mask);//获取进程当前的CPU亲和性
//打印进程CPU亲和性
printf("进程 %d 使用了下面的CPU:\n",pid);
for(i=0;i<cpu_nums;i++){
if(CPU_ISSET(i,&mask)){
printf("%d ",i);
}
}
printf("\n");
//接下来,尝试设置进程CPU亲和性为12-23,36-47
CPU_ZERO(&mask); //置空
for(i=12;i<=23;i++){
CPU_SET(i,&mask); //设置亲和力值
}
for(i=36;i<=47;i++){
CPU_SET(i,&mask); //设置亲和力值
}
res&