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