it-swarm.com.ru

планирование в реальном времени в 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. Все имеют одинаковый приоритет. А и В относятся к классу процессов RR, а С относится к классу 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)
20
theB

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

14
svenfx

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

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

10
Maxim Egorushkin

Согласно справочной странице, я думаю, что 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. 

1
annabel1832

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

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

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

0
yves Baumes