如何为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)。
我可以通过 运行 为一个进程分配一个 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)。