В Linux SCHED_FIFO и SCHED_RR
Я пишу очень маленький демон, который должен оставаться отзывчивым, даже если система находится под серьезным стрессом. Я рассматриваю различия между SCHED_FIFO и SCHED_RR в отношении планирования, а также пытается определить разумный приоритет.
Какой планировщик подходит для небольшого, но критического мониторинга, какой приоритет будет достаточно безопасным? Я все еще немного расплывчатый, пытаясь понять различия между ними.
Моя программа выделяет под 3k (и использует mlockall()), она записывает около 600 байт в xenbus, затем спит, но для меня невозможно определить, сколько времени (в мс) потребуется для фактической записи данных. так как написанное зависит от файла конфигурации.
Заранее благодарим за любые предложения/объяснения.
Ответы
Ответ 1
Печально известная программа pchdtvr
, которая захватывает сигналы цифрового телевидения, использует SCHED_FIFO
, чтобы убедиться, что телевизионные пакеты записаны на диск независимо от того, что. Он может захватывать 4 шоу одновременно, играя Doom на старом компьютере.
Программа печально известна, поскольку она была выпущена под GPL, а автор пытался отменить GPL ретроактивно. Этот акт вызвал небольшую огненную бурю. В любом случае, вы можете найти недавнюю версию для изучения в http://frequal.com/pmn/pchdtvr.html.
Ответ 2
SCHED_FIFO не может быть выгружен (контекст переключен на другой процесс), если в очереди выполнения не появляется другой процесс с более высоким приоритетом.
SCHED_RR может быть вытеснен квантом времени (задержка, предоставляемая процессу для выполнения).
Они являются "приоритетами в режиме реального времени" планировщиков на основе Linux.
Ответ 3
Я не специалист по схемам планирования, но посмотрю
man sched_setscheduler
он детализирует разницу между различными алгоритмами планирования и предоставляет ссылки на другие функции планирования. SCHED_FIFO на самом деле звучит довольно опасно, но описывается как наиболее агрессивное расписание:
Процесс SCHED_FIFO выполняется до тех пор, пока он не будет заблокирован запросом ввода-вывода, он будет выгружен процессом более высокого приоритета или вызовет sched_yield (2).
Не забудьте заблокировать свою систему. Я бы лично сделал некоторые эмпирические тесты, чтобы увидеть, какой приоритет подходит наилучшим образом и как они ведут себя точно.
Ответ 4
Если все ваши другие задачи используют стандартный планировщик, это не имеет никакого значения; SCHED_FIFO и SCHED_RR влияют только на планирование этих задач друг с другом.
Итак, на нормальной системе это не имеет никакого значения. FIFO проще всего понять, поэтому используйте это, я думаю.
Если у вас есть несколько задач с разными приоритетами, будет запущен только более высокий, если все они готовы к запуску (и есть только одно ядро ЦП)