Моя конечная цель - провести несколько испытаний многопоточных программ в системах POSIX ( не только Linux);и я надеюсь разнообразить перемежения, вмешиваясь в графики.
ОБНОВЛЕНИЕ: пример для объяснения моей цели
Например, предположим, что программа в конечном итоге запустит два потока, T1, T2.Предположим, что на функциональном уровне (или других уровнях, таких как уровень команд, уровень базового блока) они имеют следующие трассы:
T1: A1 -> B1 -> C1
T2: A2 -> B2 -> C2
Во время фактического выполнения на одном компьютере может быть только несколько чередований.например, в крайнем случае, независимо от того, сколько раз программа выполняется, существует только одно чередование A1 -> B1 -> A2 -> B2 -> C2 -> C1 на одном компьютере;но возможно, что другое чередование A1 -> A2 -> B1 -> B2 -> C2 -> C1 происходит на другом компьютере, в то время как это чередование приводит к ошибке.Поэтому я надеюсь диверсифицировать перемежение путем добавления некоторого планирования, управляющего вызовами функций POSIX (у нас есть автоматический способ динамического изменения политики и приоритета планирования), чтобы после запуска нескольких версий этих программ, скорректированных по расписанию, это по крайней мере обеспечит больше чередований (но меня не волнует точное чередование).Например, с одной корректировкой он может выполнить трассировку A1 -> A2 -> B1 -> B2 -> C2 -> C1 с большей вероятностью;с другой настройкой, он может выполнить трассу A1 -> B1 -> A2 -> B2 -> C2 -> C1 или A1 -> B1 -> C1 -> A2 -> B2 -> C2 или другие трассы с большей вероятностью.В этом смысле мы увеличиваем охват тестированием.
В настоящее время я думаю о том, чтобы наладить некоторый код для адаптации с различными политиками и приоритетами планирования.И я наткнулся на SCHED_OTHER
и SCHED_RR
.
По умолчанию программы запускаются с SCHED_OTHER
.Однако кажется, что стандарт POSIX не детализировал требования (см. здесь , хотя я не уверен, является ли это последним стандартом).Специально, это даже не говорит, является ли это круговым.И, читая Справочную страницу Linux Sched и Документация Red Hat , он говорит, что статический приоритет фиксирован 0, а динамический приоритет равен
на основе значения nice и увеличивается каждый раз, когда квант готов к запуску потока, но ему запрещен запуск по планировщику
Toмне, кажется, это говорит настройка хорошее значение все еще не может управлять приоритетом, как то, что SCHED_RR
делает .
Эта другая важная проблема заключается в том, что установка хорошего значения для потока может быть невозможным для других систем POSIX, отличных от Linux
Согласно POSIX.1, хорошим значением является атрибут для процесса ;то есть потоки в процессе должны иметь хорошее значение.Однако в Linux хорошим значением является атрибут для каждого потока: разные потоки в одном и том же процессе могут иметь разные хорошие значения.
Поэтому я думаю, возможно ли использовать SCHED_RR
(SCHED_FIFO
не в моих соображениях, поскольку он не основан на квантах времени, поэтому сильно изменит расписание), чтобы имитировать поведение SCHED_OTHER
, так как большинство программ, которые я хотел бы использовать в инструменте, используют политику SCHED_OTHER
по умолчанию.Я выдвинул несколько наивных идей:
- Поскольку непривилегированные
SCHED_OTHER
программы имеют хорошее значение от 0 до 19, я могу обеспечить приоритетность для инструментальных программ SCHED_RR
в этом диапазоне;если это все еще сильно изменило поведение, я могу еще больше сузить этот диапазон, например, 0 ~ 5. - Я сделаю так, чтобы все потоков, которые я хотел бы исследовать, имелито же самое
SCHED_RR
. - Я могу сделать
time slice/quantum
равным или похожим на значение, используемое SCHED_OTHER
(например, в Linux, изменив значения внутри /proc/sys/kernel/sched_rr_timeslice_ms
, см. в этом Q & A ) (Опять же, я не знаю, установить квант времени для SCHED_OTHER
).
Могу ли я знать:
- Является ли эта идеяразумно для POSIX?
- Или, если это не является общим для POSIX, могу ли я узнать, корректно ли это только для Linux?
- Или если использование
SCHED_RR
все еще сильно меняет поведение по умолчанию SCHED_OTHER
в Linux, каковы возможные способы сделать больше мероприятий по многопоточному планированию в Linux?
Другие соответствующие ссылки: