【发布时间】:2018-09-22 22:16:22
【问题描述】:
假设我想以编程方式将当前进程固定到单个 CPU,但我不在乎是哪个 CPU。
使用sched_setaffinity 和固定CPU 编号的一种简单方法,可能是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,然后将仅此 CPU 设置为 sched_setaffinity 的掩码传递给。
但是,如果当前的关联掩码在 get 和 set 调用之间发生了变化,则 @987654328@ 调用将失败。有什么办法可以解决这种竞争条件?
1 虽然 CPU 零并不总是在线。
【问题讨论】: