gpt4 book ai didi

linux - 将进程固定到任何符合亲和性的 CPU

转载 作者:太空狗 更新时间:2023-10-29 12:09:23 27 4
gpt4 key购买 nike

假设我想以编程方式将当前进程固定到单个 CPU,但我不关心是哪个 CPU。

使用具有固定 CPU 编号的 sched_setaffinity 的一种简单方法,可能是 0,因为应该始终有一个“CPU 0”1

但是,如果进程的亲缘关系已设置为现有 CPU 的子集(不包括您选择的 CPU),例如通过使用 taskset 启动它,则此方法会失败。

所以我想选择“任何 CPU”来固定,但只能在当前关联掩码允许的 CPU 之外。这是一种方法:

cpu_set_t cpu_set;
if (sched_getaffinity(0, sizeof(cpu_set), &cpu_set)) {
err("failed while getting existing cpu affinity");
}
for (int cpu = 0; cpu < CPU_SETSIZE; cpu++) {
if (CPU_ISSET(cpu, &cpu_set)) {
CPU_ZERO(cpu_set);
CPU_SET(cpu, &cpu_set);
}
}
int result = sched_setaffinity(0, sizeof(cpu_set), &cpu_set);

基本上我们得到当前的关联掩码,然后遍历每个可能的 CPU 寻找第一个被允许的,然后传递一个只有这个 CPU 设置为 sched_setaffinity 的掩码。

但是,如果当前关联掩码在 getset 调用之间发生变化,则 set 调用将失败。有什么办法可以解决这个竞争条件吗?


1 虽然 CPU 零并不总是在线

最佳答案

你可以使用 getcpu()发现您的进程在其中运行的 cpu,并使用结果为该 cpu 设置关联:

unsigned mycpu=0;
if( -1 == getcpu(&mycpu,NULL,NULL) ) {
// handle error
}

大概任何 CPU 亲和性规则都会被调度程序遵守,因此 getcpu() 调用将返回允许进程运行的 CPU。

affinity set 仍有可能发生变化,但这似乎不太可能发生,并且允许的 CPU 可能会在未来某个时候受到影响,超出相关进程的控制范围。

我想您可以检测到 sched_setaffinity() 调用中的错误,然后重试该过程,直到 setaffinity 调用生效...

关于linux - 将进程固定到任何符合亲和性的 CPU,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52461322/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com