Я пишу очень маленький демон, который должен оставаться отзывчивым даже при сильной нагрузке на систему. Я смотрю на различия между SCHED_FIFO и SCHED_RR в отношении планирования, а также пытаюсь определить разумный приоритет.
Какой планировщик подходит для небольшого, но важного демона мониторинга, какой приоритет будет достаточно безопасным? Я все еще немного нечетко пытаюсь понять разницу между ними.
Моя программа выделяет менее 3 КБ (и использует mlockall ()), она записывает около 600 байт в xenbus, а затем засыпает, но мне невозможно сказать, сколько времени (в мс) потребуется для фактической записи данных .. с каких пишется зависит от конфигурационного файла.
Заранее благодарим за любые предложения / объяснения.





Я не специалист по схемам расписания, но взгляните на
man sched_setscheduler
он подробно описывает разницу между различными алгоритмами планирования и предоставляет ссылки на другие функции планирования. SCHED_FIFO на самом деле звучит довольно опасно, но описывается как наиболее агрессивное планирование:
A SCHED_FIFO process runs until either it is blocked by an I/O request, it is preempted by a higher priority process, or it calls sched_yield(2).
Остерегайтесь блокировать вашу систему. Я бы лично провел несколько эмпирических тестов, чтобы увидеть, какой приоритет подходит лучше всего и как именно они себя ведут.
Я (мог бы) также вызвать sched_yield (), как только содержимое sysinfo () станет приемлемым ... т.е. система больше не будет испытывать нагрузку. Может быть, я буду придерживаться FIFO, но напишу логику для RT только тогда, когда система (или скоро будет) напряжена, а затем вернусь, когда ее спокойствие.
хм, да, я думаю, что FIFO подходит для этой задачи.
Печально известная программа pchdtvr, которая захватывает цифровые телевизионные сигналы, использует SCHED_FIFO, чтобы убедиться, что телевизионные пакеты записываются на диск, несмотря ни на что. Он может снимать 4 шоу одновременно, играя в Doom на старом компьютере.
Программа печально известна тем, что была выпущена под лицензией GPL и автором пытался отозвать GPL задним числом. Этот акт спровоцировал небольшую огненную бурю. В любом случае, вы можете найти последнюю версию для изучения на http://frequal.com/pmn/pchdtvr.html.
В самом деле забавно видеть, как разработчики выбирают лицензию, которую они не понимают ... на самом деле грустно, но забавно. Я собираюсь использовать FIFO, но «отступлю», когда программа может и должна уступить, и вернуться к нормальному планированию, или вернуться к RT, когда ситуация станет тяжелой. Я посмотрю, как это пойдет.
@tinkertim: Фурор на Slashdot был невероятным. yro.slashdot.org/article.pl?no_d2=1&sid=08/01/26/0341210
Если все ваши другие задачи используют стандартный планировщик, это не имеет значения; SCHED_FIFO и SCHED_RR влияют только на планирование этих задач друг с другом.
Так что в нормальной системе это не имеет значения. FIFO проще всего понять, так что используйте его, я думаю.
Если у вас есть несколько задач с разным приоритетом, будет запущена только более высокая, если все они готовы к запуску (и есть только одно ядро ЦП)
SCHED_FIFO не может быть вытеснен (контекст переключен на другой процесс), если в очереди выполнения не появится другой процесс с более высоким приоритетом.
SCHED_RR может быть вытеснен квантом времени (задержка, предоставляемая процессу для выполнения).
Оба они являются приоритетами "реального времени" планировщиков на базе Linux.
Спасибо за ответ, я просмотрел страницы руководства и различные документы, которые были найдены при поиске. Теперь я без проблем использую SCHED_FIFO, но интересуюсь RR. Я не думаю, что могу использовать RR, поскольку у меня нет возможности узнать, действительно ли я могу выполнить атомарную запись в одном срезе.