Linux - потоки с более низким приоритетом не планируются, когда задача с более высоким приоритетом занята

Среда - встроенное устройство с ядром Linux 2.6.18 Требования - 3 потока (созданные из одного процесса, скажем, P1 создал T1, T2, T3)

T1 имеет приоритет linux 99 (самый высокий), T2 имеет приоритет linux 50 (средний), T3 имеет приоритет 2 linux (самый низкий). Никаких хороших значений не установлено явно ни для одного из потоков.

И T1, и T3 увеличивают переменную один раз в секунду. T1 печатает обе переменные один раз в 5 секунд. Это идет гладко. [Проблемное место] Когда T2 входит в бесконечный цикл "for(;;);", то после T1 счет увеличивается должным образом, но счет T3 вообще не увеличивается. Это означает, что у T3 никогда не было времени для работы в CPU.

Все это время я думал, что CFS Linux гарантирует, что все приоритеты получат соответствующую долю (в зависимости от веса). Но это доказывает, что любой поток, который уходит в процессор, не спя, останавливает работу всех других потоков с более низким приоритетом.

Ответьте, пожалуйста, если кто-нибудь знает, почему планировщик CFS ведет себя таким образом и есть ли способ исправить это?

1 ответ

Классы планирования в реальном времени всегда опережают любые более низкие классы планирования. То есть нить с SCHED_RR, если он готов к запуску, всегда будет вытеснять поток SCHED_OTHER, Эти классы следует использовать только для выполнения (обычно коротких) срочных задач, которые необходимы для удовлетворения потребностей других потоков, аппаратного обеспечения (например, чтение из последовательного порта или буфера сетевой карты) или в целях безопасности (например, написание записей аудита или журналов или фиксация транзакций базы данных). Например, драйверы устройств пользовательского режима могут использовать эти приоритеты, поскольку они должны завершить свою работу для запуска других потоков.

Аналогично внутри SCHED_RR процесс с более высоким приоритетом всегда запускается, если он готов, что объясняет, что вы видите.

Ключ заключается в следующем: настройка касается приоритетного доступа к ЦП, а не совместного доступа к ЦП. Более высокий приоритет всегда побеждает. Вот что значит приоритет.

(Чтобы предотвратить патологические случаи, процессы реального времени по умолчанию ограничены использованием 95% процессорного времени. Это никогда не должно происходить в исправной системе.)

Если вы просто хотите, чтобы ваши потоки имели большую долю общих ресурсов, вы должны использовать SCHED_OTHER и установите свой nice(2) значение в отрицательное число, используя nice(2) или же setpriority(2),

nice(2) о совместном использовании процессора, потому что это приятно поделиться.

Другие вопросы по тегам