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

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