Подтвердить что ты не робот

Планирование в реальном времени в 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)
4b9b3361

Ответ 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.