Планировщик Linux (CFS) распределяет временные интервалы между потоками, сначала определяя период времени, в течение которого каждый поток будет запускаться один раз.Этот период времени вычисляется функцией sched_slice () и зависит от количества потоков в ЦП и двух переменных, которые можно установить из пространства пользователя (sysctl_sched_latency
и sysctl_sched_min_granularity
):
Если количество потоков превышает sysctl_sched_latency / sysctl_sched_min_granularity
;тогда период будет nr_threads * sysctl_sched_min_granularity
;иначе период будет sysctl_sched_latency
.
Например, на моем ноутбуке у меня есть следующие значения:
% cat /proc/sys/kernel/sched_latency_ns
18000000
% cat /proc/sys/kernel/sched_min_granularity_ns
2250000
Следовательно, sysctl_sched_latency / sysctl_sched_min_granularity = 8
.Теперь, если у меня менее 8 потоков на процессоре, то каждому будет выделено 18 000 000 наносекунд (т.е. 18 миллисекунд);иначе каждому будет выделено 2.250.000 нс (2.25 мс).
Теперь, имея в виду эти значения, если мы посмотрим на частоту тиков (определенную во время компиляции ядра) с помощью этой команды:
% zcat /proc/config.gz | grep CONFIG_HZ
# CONFIG_HZ_PERIODIC is not set
# CONFIG_HZ_100 is not set
# CONFIG_HZ_250 is not set
CONFIG_HZ_300=y
# CONFIG_HZ_1000 is not set
CONFIG_HZ=300
Итак, на моем ноутбуке у меня 300 тиков в секунду, что означает тик каждые 3 мс.Это означает, что в моем случае с более чем 8 потоками на процессоре я потеряю немного точности в своих временных срезах (поток, который должен работать 2,25 мс, будет работать 3 мс), но я мог бы это исправить, перекомпилировав мойядро с более частыми тиками.
Тем не менее, следует отметить, что это на самом деле не проблема, поскольку, как видно из его названия, CFS (полностью честный планировщик) стремится быть честным, что и будет здесь.