linux系统调用sched_setaffinity内核实现分析

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

在讲解具体实现之前,我们先来看一个场景:

启动一个进程,并且在启动的时候就绑定该进程运行的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&
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值