Как планировщик ядра поддерживает точность квантов времени с прерываниями по таймеру? - PullRequest
0 голосов
/ 26 августа 2018

Из моего чтения есть прерывание по таймеру, вызываемое аппаратным обеспечением, которое выполняется довольно часто и передает управление обратно от запущенного процесса к ядру / планировщику, который затем может определить, превысил ли запущенный процесс его кванты времени, и если да, то запустить другую задачу.

Это кажется неточным.

Например: Если прерывание по таймеру было каждые 1 единица

А алгоритм планировщика определил кванты времени процесса, связанные с процессором, равными 1,5 единицам, он фактически получит 2 единицы времени ЦП.

Или планировщик только дает кванты времени процессам в единицах таймеров прерываний?

1 Ответ

0 голосов
/ 28 августа 2018

Планировщик 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 (полностью честный планировщик) стремится быть честным, что и будет здесь.

...