📜  sched_setaffinity (1)

📅  最后修改于: 2023-12-03 15:19:59.555000             🧑  作者: Mango

介绍sched_setaffinity

sched_setaffinity是Linux操作系统中的一个系统调用,它可以用来将线程或进程绑定到特定的CPU上。这个系统调用可以让开发人员更好的控制程序运行时所使用的CPU资源,从而提高程序的性能。

语法
int sched_setaffinity(pid_t pid, size_t cpusetsize, const cpu_set_t *mask);
参数
  • pid:要设置CPU亲和性的线程或进程的ID。
  • cpusetsizemask参数指向的位掩码的大小,以字节为单位。
  • mask:指向包含要设置的CPU亲和性的位掩码的指针。
返回值

函数成功执行则返回0,否则返回-1并设置errno变量。

用法示例
#include <sched.h>
#include <stdio.h>

int main(int argc, char *argv[]) {
    cpu_set_t mask;
    CPU_ZERO(&mask);
    CPU_SET(0, &mask); // 将第0个CPU添加到掩码中
    if (sched_setaffinity(0, sizeof(mask), &mask) == -1) {
        perror("sched_setaffinity failed");
        return -1;
    }
    printf("CPU affinity set to CPU 0\n");
    return 0;
}

上面的代码将当前进程绑定到第0个CPU核心上。首先使用CPU_ZEROCPU_SET宏来初始化和编辑一个包含CPU核心掩码的数据结构,然后使用sched_setaffinity系统调用来将当前进程与掩码中的CPU核心绑定。如果绑定操作失败,则会输出错误信息。

注意事项
  • 必须以root身份运行程序,才能对其他进程/线程进行CPU亲和性设置。
  • 如果使用了pthread_*线程接口创建线程,在设置线程的CPU亲和性时,需要在线程创建之前调用sched_setaffinity系统调用。
  • CPU掩码的长度必须至少与系统中的CPU核心数量一样,否则会返回EINVAL错误码。
  • 不建议使用sched_setparamsched_setscheduler来与sched_setaffinity一起使用。因为它们可能会破坏CPU亲和性的设置。