В Linux SCHED_FIFO и SCHED_RR

Я пишу очень маленький демон, который должен оставаться отзывчивым, даже когда система находится под серьезным стрессом. Я смотрю на различия между SCHED_FIFO и SCHED_RR в отношении планирования, а также пытаюсь определить разумный приоритет.

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

Моя программа выделяет под 3k (и использует mlockall()), она записывает около 600 байт в xenbus, а затем спит, но я не могу сказать, сколько времени (в мс) потребуется, чтобы на самом деле записать данные... с каких пор написано зависит от файла конфигурации.

Заранее спасибо за любые предложения / объяснения.

4 ответа

Решение

Печально известный pchdtvr программа, которая захватывает сигналы цифрового телевидения, использует SCHED_FIFO чтобы убедиться, что телевизионные пакеты записываются на диск, несмотря ни на что. Он может захватывать 4 шоу одновременно, играя в Doom на старом компьютере.

Программа печально известна, потому что она была выпущена под лицензией GPL, и автор попытался отозвать GPL задним числом. Этот акт спровоцировал небольшой огненный шторм. В любом случае, вы можете найти последнюю версию для изучения на http://frequal.com/pmn/pchdtvr.html.

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

SCHED_RR может быть вытеснен квантом времени (задержка, предоставляемая процессу для выполнения).

Они оба являются приоритетами в реальном времени для планировщиков на основе Linux.

Я не эксперт по планированию схем, но посмотрите на

man sched_setscheduler

он подробно описывает разницу между различными алгоритмами планирования и предоставляет ссылки на другие функции планирования. SCHED_FIFO на самом деле звучит довольно опасно, но описывается как наиболее агрессивное планирование:

Процесс SCHED_FIFO выполняется до тех пор, пока он не будет заблокирован запросом ввода-вывода, ему не предшествует процесс с более высоким приоритетом или он не вызовет sched_yield(2).

Остерегайтесь не блокировать вашу систему. Я бы лично провел несколько эмпирических тестов, чтобы увидеть, какой приоритет подходит лучше всего и как они себя ведут.

Если все ваши другие задачи используют стандартный планировщик, это не имеет значения; SCHED_FIFO и SCHED_RR влияют только на планирование этих задач друг с другом.

Так что в обычной системе это не имеет значения. FIFO проще всего понять, так что используйте это, я думаю.

Если у вас есть несколько задач с разными приоритетами, будет запущена только более высокая, если все они готовы к запуску (и имеется только одно ядро ​​ЦП)

Другие вопросы по тегам