Планирование в реальном времени в Linux
Сегодня утром я прочитал о планировании реального времени Linux. Согласно книге "Системное программирование Linux Робертом Лав", есть два основных графика. Один из них - SCHED_FIFO, fifo, а второй - SCHED_RR, круговой. И я понял, как работает алгоритм fifo и rr. Но поскольку у нас есть системный вызов,
sched_setscheduler (pid_t pid, int policy, const struct sched_parem *sp)
мы можем явно задать политику планирования для нашего процесса. Поэтому в некоторых случаях два процесса, выполняемые root, могут иметь другую политику планирования. Как один процесс имеет SCHED_FIFO, а другой имеет SCHED_RR и с таким же приоритетом. В этом случае, какой процесс будет выбран первым? классифицированный FIFO-процесс или классифицированный RR-процесс? Почему?
Рассмотрим этот случай. Существует три процесса A, B, C. Все имеют такой же приоритет. A и B являются RR-классифицированными процессами, а C является FIFO-классом. A и B управляются (так что оба варианта работают в некотором промежутке времени). И в настоящее время работает A. Теперь C становится управляемым. В этом случае, будь то
1. A will preempt for C, or
2. A will run until its timeslice goes zero and let C run. Or
3. A will run until its timeslice goes zero and let B run.
a) here after B runs till its timeslice becomes zero and let C run or
b) after B runs till its timeslice becomes zero and let A run again (then C will starve untill A and B finishes)
Ответы
Ответ 1
В режиме реального времени FIFO и RR не имеют точно такого же значения, которое они имеют при планировании, отличном от реального времени. Процессы всегда выбираются в FIFO-манере, однако квант времени для SCHED_FIFO не ограничен в отличие от кванта времени для SCHED_RR.
Процессы SCHED_FIFO не вытесняют процессы SCHED_RR с одинаковым приоритетом.
sched_setscheduler (2) - справочная страница Linux
...
"Политика планирования процесса определяет, где она будет вставлена в список процессов с равным статическим приоритетом и как она будет перемещаться внутри этого списка. Все планирование является превентивным: если процесс с более высоким статическим приоритетом становится готовым к запуску, текущий выполняемый процесс будет выгружен и возвращен в список ожидания для его статического уровня приоритета. Политика планирования определяет порядок в списке запущенных процессов с равным статическим приоритетом."
...
"Процесс SCHED_FIFO выполняется до тех пор, пока он не будет заблокирован запросом ввода-вывода, он будет выгружен процессом более высокого приоритета или вызовет sched_yield (2)."
...
"Когда процесс SCHED_FIFO становится исполняемым, он будет вставлен в конце списка для его приоритета."
...
"SCHED_RR: планирование круглых робин
SCHED_RR - это простое расширение SCHED_FIFO. Все, что описано выше для SCHED_FIFO, также относится к SCHED_RR, за исключением того, что каждому процессу разрешено работать только для максимального кванта времени. Если процесс SCHED_RR был запущен в течение периода времени, равного или превышающего квант времени, он будет помещен в конце списка для его приоритета. Процесс SCHED_RR, который был вытеснен процессом с более высоким приоритетом и впоследствии возобновляет выполнение в качестве запущенного процесса, завершит оставшуюся часть его кванта времени кругового вращения.
Ответ 2
man sched_setscheduler
подробно объясняет эти политики планирования.
В этом конкретном случае, поскольку два процесса реального времени имеют одинаковый приоритет, ни один из них не будет вытеснять другой. Процесс SCHED_FIFO
выполняется до тех пор, пока он не блокирует себя, процесс SCHED_RR
запускается до тех пор, пока он не блокирует себя или не истечет его квант времени.
Ответ 3
Мое понимание двух разных классов заключается в том, что процесс SCHED_FIFO никогда не упреждается ядру. Даже если другой процесс класса "SCHED_FIFO" ждет своей очереди...
В то время как политика SCHED_RR разделяет ресурсы ppus немного больше. Планировщик будет запускать процесс SCHED_RR для квантов времени, а затем предварительно убрать его, только чтобы включить другой процесс SCHED_RR. Это точно Round Robin.
SCHED_FIFO "сильнее" в том смысле, что если процесс SCHED_FIFO никогда не возвращает() в ядро или вызывает системный вызов на одноядерном устройстве, тогда все ваши другие процессы в режиме реального времени могут никогда работать.
Ответ 4
Согласно man-странице, я думаю, что 1 - это ответ. A, B - политика RR, C - политика FIFO. Поскольку RR также является улучшающим FIFO, все они являются классом FIFO.
Поскольку все они имеют одинаковый приоритет, а справочная страница говорит: "Вызов sched_setscheduler() или sched_setparam (2) поместит процесс SCHED_FIFO (или SCHED_RR), идентифицированный pid в начале списка, если он был запущен Как следствие, он может вытеснить текущий выполняемый процесс, если он имеет тот же приоритет (POSIX.1-2001 указывает, что процесс должен идти до конца списка.)"
После вызова sched_setscheduler для установки политики C как FIFO, C будет вытеснять A.