Линуксовое
Aug. 21st, 2014 06:24 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
У линукса есть несколько механизмов ограничить процесс в доступных процессорных ядрах. Как минимум, cgroup и taskset. Если процессу важно знать, сколько у него ядер (чтобы сконфигурировать thread pool или ещё зачем-нибудь), то наивный способ -- прочитать /proc/cpuinfo. Он неправильный. Менее наивный -- позвать sysconf(_SC_NPROCESSORS_ONLN). Он тоже неправильный. Правильный -- вот:
long num_processor_configured = sysconf (_SC_NPROCESSORS_CONF); /* list the number of processors configured */
long num_processor_available;
cpu_set_t mask;
if (sched_getaffinity(0, sizeof(cpu_set_t), &mask) == 0) {
num_processor_available = CPU_COUNT(&mask);
} else {
num_processor_available = sysconf(_SC_NPROCESSORS_ONLN);
}
no subject
Date: 2014-08-21 03:37 pm (UTC)no subject
Date: 2014-08-21 04:54 pm (UTC)Запускать нитей больше, чем доступное количество ядер не имеет смысла. Поэтому getaffinity и запуск нитей на все доступные ядра.
Как в этом случае переписать, чтобы учитывать изменение количества ядер? Постоянно дергать getaffinity?
no subject
Date: 2014-08-21 05:26 pm (UTC)no subject
Date: 2014-08-21 05:58 pm (UTC)no subject
Date: 2014-08-22 02:20 am (UTC)no subject
Date: 2014-08-21 05:56 pm (UTC)