在讲解具体实现之前,我们先来看一个场景:
启动一个进程,并且在启动的时候就绑定该进程运行的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=sched_setaffinity(pid, sizeof(mask), &mask);//执行设置
if(res!=0){
printf("设置进程亲和性失败\n");
perr

本文探讨了在Linux内核3.14.69版本中,进程如何通过sched_setaffinity进行CPU亲和性设置。分析了当尝试绑定到特定CPU集合时,为何会遇到'operation not permitted'错误,并指出设置的CPU必须与系统活跃CPU有交集且是cpuset中cpus_allowed的子集。同时,预告将深入分析security_task_setscheduler函数在不同CPU绑定情况下的行为差异。
最低0.47元/天 解锁文章
1170

被折叠的 条评论
为什么被折叠?



