У меня была та же проблема. tl; доктор:
Если последний АРГУМЕНТ [позволенных] оценивает к 0, позвольте возвратам 1; позвольте возвратам 0 иначе.
Нет много для нахождения связанным с этим вопросом, но я действительно находил этот поток. Это немного датировано с 2009, и это расценивает 2.6. X Ядер Linux, но казались склонными.
Заголовок этого потока, Предмета: вопрос на sched-rt ограничении выделения группы: sched_rt_runtime_us - message#01766.
выборка
Я записал маленькую тестовую программу что:
(a) ветвления два потока, один SCHED_FIFO и один SCHED_OTHER (этот поток является reniced к-20) и связывают их обоих с определенным ядром.
(b) выполнения оба потоки в жестком цикле (то же количество повторений для обоих потоков) до потока SCHED_FIFO завершаются.
(c) вычисляет количество завершенных повторений регулярного потока SCHED_OTHER против постоянного числа повторений потока SCHED_FIFO. Это затем вычисляет процент на основе этого.
Я выполняю вышеупомянутую рабочую нагрузку против варьирования sched_rt_runtime_us значения (200 мс к 700 мс) хранение sched_rt_period_us константы на уровне 1 000 мс. Я также экспериментировал немного путем уменьшения значения sched_rt_period_us (таким образом увеличивающий sched гранулярность) без очевидного изменения в поведении.
Мои наблюдения перечислены в табличной форме:
Отношение # завершенных повторений reg распараллеливает / sched_rt_runtime_us / # повторений потока RT (в %) sched_rt_runtime_us
- 0.2 100% (регулярный поток завершил все свои повторения).
- 0.3 73%
- 0.4 45%
- 0.5 17%
- 0.6 0% (поток SCHED_OTHER полностью отрегулировал. Никогда не работал),
- 0.7 0%
Это такой старый вопрос, давайте попробуем. Как я понял, вы используете механизм защиты от тупиков ( this ), чтобы избежать остановки ваших обычных процессов из-за вашего RT-процесса.
Вы говорите, что
у меня есть простая работа, которая требует не более миллисекунды или около того процессорного времени на вызов
Это короткая периодическая задача или короткая задача, запускаемая внешним входом?
Для первого случая ( краткосрочные задачи ): вы должны знать, что в Linux ядре 3.14 стало доступно SCHED_DEADLINE
]класс. Это позволяет вам установить политику планирования для ваших процессов, чтобы у них периодически выделялось как минимум столько процессорного времени. Взгляните на его документацию , вы также найдете понятную диаграмму в разделе SCHED_DEADLINE
в man 7 sched . Если триггер внешний (случайный, а не периодический), то он не может быть решением.
Для второго случая ( короткая спорадическая задача ): если вы можете утверждать, что ваша программа будет выполнять только короткую работу каждый раз, когда это необходимо, вы можете попробовать отказаться от использования приоритетов и просто позвонить по номеру sched_yield после того, как ваша работа будет сделана. Это ба-подход, если занятый пул. Если вам действительно нужны приоритеты, то, возможно, вы можете дополнить его usleep , процессы, не относящиеся к rt, будут выполняться, пока этот процесс RT спит. Вы также можете знать, что если он запускается прерываниями, то, возможно, вам следует использовать нижние половины , более сложный подход.
Мммм и кое-что еще: вы должны иметь в виду, что может появиться больше процессов реального времени, чем у вас. Например, есть потоки ядра .