планирование в реальном времени в Linux - PullRequest
21 голосов
/ 21 февраля 2012

Этим утром я прочитал о планировании 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. Все имеют одинаковый приоритет. А и В являются RR-классифицированными процессами, а C является FIFO-классифицированными. A и B работоспособны (поэтому оба работают поочередно через некоторое время). И в настоящее время А работает. Теперь 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)

Ответы [ 4 ]

16 голосов
/ 21 февраля 2012

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

10 голосов
/ 21 февраля 2012

man sched_setscheduler подробно объясняет эти политики планирования.

В этом конкретном случае, поскольку два процесса реального времени имеют одинаковый приоритет, ни один из них не будет вытеснять другой.Процесс SCHED_FIFO выполняется до тех пор, пока не блокируется, процесс SCHED_RR выполняется до тех пор, пока не заблокируется сам или не истечет его квант времени.

1 голос
/ 06 августа 2013

Согласно справочной странице, я думаю, что 1 является ответом.A, B - это политика RR, C - это политика FIFO.Поскольку RR также является FIFO-расширением, все они относятся к классу FIFO.

Поскольку все они имеют одинаковый приоритет, а на странице руководства написано: «Вызов sched_setscheduler () или sched_setparam (2) поместит процесс SCHED_FIFO (или SCHED_RR), идентифицируемый pid, в начало списка, еслион был запущен. Как следствие, он может выгружать текущий запущенный процесс, если он имеет тот же приоритет. (POSIX.1-2001 указывает, что процесс должен идти до конца списка.) "

Onceвызов sched_setscheduler для установки политики C как FIFO, C будет вытеснять A.

0 голосов
/ 21 февраля 2012

Мое понимание двух разных классов заключается в том, что процесс SCHED_FIFO никогда не прерывается ядром. Даже если другой процесс класса "SCHED_FIFO" ожидает своей очереди ...

В то время как политика SCHED_RR разделяет ресурсы ЦП, ресурсы немного больше. Планировщик будет позволять процессу SCHED_RR работать в течение квантов времени, а затем опережать его, только чтобы включить другой процесс SCHED_RR. Это точно Круглый Робин.

SCHED_FIFO является «более сильным» в том смысле, что если процесс SCHED_FIFO никогда не выдаст ядру () или не вызовет системный вызов на одноядерном устройстве , то все остальные процессы реального времени могут никогда не запуститься .

...