如何为exec进程分配处理器

how to allocate processor to exec process

我可以通过 运行 为一个进程分配一个 cpu 核心:

taskset -c 21 ./wait xx

这里./wait是一个可执行文件,其代码如下所示,我试图将core=21分配给这个进程。

但是当我尝试从另一个进程(使用 execl)执行相同操作时,它不起作用。例如,下面的代码执行了进程(没有报错),但是没有完成对该进程的核心分配:

// run as: ./a.out name 21
#include <stdio.h>
#include <unistd.h>
#include <stdarg.h>

int main(int argc, char* argv[]) {
    printf("scheduling\n");
    int status = execl("/usr/bin/taskset", "-c", argv[2], "./wait", argv[1], NULL);
    if(status<0) perror("Err:");
}

这是等待程序的代码,它只是等待用户提供一些输入,这样我就有时间从另一个终端检查 cpu 状态:

// run as: ./wait name
#include <stdio.h>
#include <stdarg.h>

int main(int argc, char* argv[]) {
    printf("%s:asking for user input\n", argv[1]);
    int x;
    scanf("%d", &x);
    printf("got-%d\n", x);
}

所以,我的问题是:当运行一个进程时,如何使用execl分配cpu-core? (顺便说一句,如果该进程已经 运行 并且我有它的 pid,那么该 pid 上的任务集执行将更改该进程的核心分配。它仅在以此处显示的方式完成时才起作用。)

分叉进程然后设置 CPU affinity 可能更容易 在执行命令之前。

类似下面的内容。

Linux:

#define _GNU_SOURCE
#include <sched.h>
#include <stdio.h>
#include <sys/sysinfo.h>

int main()
{
    cpu_set_t  mask;
    CPU_ZERO(&mask);
   
    CPU_SET(0, &mask);
    CPU_SET(1, &mask);
    CPU_SET(2, &mask);
    CPU_SET(3, &mask);
    sched_setaffinity(0, sizeof(mask), &mask);
}

Windows:

#include <Windows.h>

int main()
{
           ::SetProcessAffinityMask(GetCurrentProcess(), 0xf/*first 4 cpus*/);
}

在中找到的代码示例 How to Set CPU Affinity of a Process.

您需要在子进程中提供 argv[0] 的进程名称:

int status = execl("/usr/bin/taskset",
                   "taskset", "-c", argv[2], "./wait", argv[1], NULL);

由于缺少名称,程序被调用为 -c 21 ./wait xx 而不是我们预期的 taskset -c 21 ./wait xx,这意味着它不会将 -c 视为参数,而是将 21 解释为掩码(处理器 0 和 5)而不是列表(仅处理器 21)。