Допустим, я хочу программно закрепить текущий процесс на одном процессоре, но мне все равно, какой это процессор.
Один простой способ использовать sched_setaffinity
с фиксированным номером процессора, возможно0
, поскольку всегда должен быть «CPU 0» 1 .
Однако этот подход не работает, если сходство процесса было установлено на подмножество существующих CPU, а невключая тот, который вы выбрали, например, запустив его с taskset
.
Так что я хочу выбрать «любой ЦП» для привязки, но только из тех ЦП, которые позволяет текущая маска сродства.Вот один из подходов:
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);
По сути, мы получаем текущую маску сродства, затем перебираем все возможные ЦП в поисках первого допустимого, а затем передаем маску, для которой только этот ЦП установлен на sched_setaffinity
.
Однако, если текущая маска соответствия изменилась между get
и set
вызовами, вызов set
завершится неудачно.Есть ли способ обойти это состояние гонки?
1 Хотя нулевой процессор не всегда будет онлайн .