1

我可以通过像这样运行它来为进程分配一个 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 上执行任务集将更改该进程的核心分配。只有按照此处所示的方式完成时,它才起作用。)

4

2 回答 2

3

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

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

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

于 2021-09-21T11:04:26.903 回答
0

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

类似于以下内容。

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);
}

视窗:

#include <Windows.h>

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

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

于 2021-09-20T15:04:57.317 回答