2013-07-19 3 views
5

В политике планирования RR, что произойдет, если поток с низким приоритетом блокирует мьютекс и удаляется планировщиком, потому что ожидает еще один высокоприоритетный поток?Планирование потоков в unix

Будет ли он также выпускать блокировку, удерживаемую резьбой с низким приоритетом?

Например, рассмотрите 3 потока, выполняющихся в процессе с приоритетами 10,20 и 30 в политике планирования RR.

Теперь в данный момент времени ничтожный приоритет нитки 1 блокирует мьютексы и все еще выполняет среднее выполнение, в то время как поток с высоким приоритетом всплывает, а также ожидает мьютекс, удерживаемый нитью 1. Теперь поток 2 приходит к картине, которая также нуждается в тот же мьютекс, заблокированный нитью 1.

Насколько я знаю, согласно алгоритму планирования потоки, спящие или ожидающие мьютекс, семафор и т. д., удаляются, а другие, даже имеющие низкий приоритет, могут выполняться. Это верно? Если это так, в приведенном выше примере в конечном счете потоки с высоким приоритетом ожидают завершения потока с низким приоритетом, что не имеет никакого смысла. Как работает система, если на всех потоках сконструированы, как я уже говорил выше?

или приоритет потока должен быть установлен таким образом, чтобы приоритет приоритета не зависел от мьютекса с низким приоритетом?

Также может кто-нибудь объяснить мне, как планирование работает на уровне процесса? Как установить приоритет для процесса?

+0

Проблема была «слишком много потоков, недостаточно ядер», но многоядерный оборот быстро решает эту проблему. Приоритеты потоков полезны, когда вам нужно выбрать, какой поток запускать, а не когда разработчики чипов задаются вопросом, может ли дополнительное ядро ​​все же сделать что-то полезное. – MSalters

ответ

5

Как правило, планирование и блокировки не связаны ни в каком другом аспекте, кроме как «ожидающий поток не запланирован, пока он не будет завершен». Было бы довольно глупо иметь MUTEX, который «останавливает доступ другого потока к моим данным», но он работает только в том случае, если другой поток имеет тот же или более низкий приоритет, чем текущий поток.

Явления с «низким приоритетом» содержат блокировку, требующую высокой приоритетности потока », называется инверсией приоритета, и это хорошо известный сценарий в компьютерной теории.

Существует несколько схем, которые «временно увеличивают приоритет фиксирующего потока, пока он не освободит блокировку до наивысшего приоритета ожидающих потоков» (или приоритет первого потока ожидания, если он выше текущего потока, или некоторые другие варианты этой темы). Это делается для борьбы с инверсией приоритета, но у него есть и другие недостатки, поэтому он не реализован во всех ОС/планировщиках (в конце концов, он влияет на другие потоки, кроме того, который тоже ожидает).

Редактировать:

Точка взаимной блокировки (или других подобных замков) является то, что он предотвращает два потока от доступа те же ресурсы одновременно. Например, предположим, что мы хотим обновить пять разных переменных с довольно длинной обработкой (сложная математика, выборка данных из последовательного порта или сетевого диска или некоторые из них), но если мы выполняем только две переменные, некоторые другие процессы используют они получили бы недействительный результат, тогда мы явно не можем «отпустить» блокировку.

В потоке с высоким приоритетом просто нужно дождаться обновления всех пяти переменных и блокировки с низким приоритетом.

Нет простого способа обхода, который приложение может выполнить для «исправления» этой проблемы - не держите блокировки больше, чем необходимо, конечно [и, возможно, мы можем исправить описанную выше проблему, выполнив длительная обработка ВЗЛЫ блокировки, и только сделать окончательный «сохранить его в 5 переменных» с блокировкой. Это уменьшит потенциальное время, в течение которого поток с высоким приоритетом должен ждать, но если система действительно занята, это не решит проблему.

На эту тему написана целая кандидатская диссертация, и я не специалист по «составлению планировщика». У меня есть справедливое представление о том, как работает, точно так же, как я знаю, как работает двигатель в моей машине - но если кто-то дал мне кучу подходящих базовых форм из стали и алюминия, а также необходимые инструменты/рабочее пространство и сказал мне, чтобы я построил двигатель, я сомневаюсь, что он отлично поработает ... То же самое с планировщиком - я знаю, какие части называются, но не как их построить.

+0

Теперь я понял, что то, о чем я думал, может произойти в реальном мире. Теперь вопрос заключается в том, что операционная система заботится об этих корректировках приоритета или нам приходится обрабатывать их в нашем программном обеспечении. Если да, то можете ли вы указать мне небольшой пример? Что касается мьютекса, вы являетесь правильной блокировкой, если только нет конкурирующей высокоприоритетной нити. Но мой вопрос заключается в том, что после блокировки получается поток с низким приоритетом, а затем наступает черед высокоприоритетного потока. – suresh

+0

@suresh, AFAIK запасное ядро ​​Linux не временно увеличивает приоритет потока, чтобы очистить блокировку от приглушения, которую требует поток с более высоким приоритетом. Однако исправление ядра PREMPT_RT делает это. Лично я считаю, что это лучший планировщик, но поскольку я занимаюсь системами реального времени, я бы подумал, что ... как и для других Unix, я не думаю, что там есть много, что делает приоритетное разрешение инверсии; это скорее норма в мире в реальном времени. – bazza

+0

+1 к матам, хороший ответ – bazza

2

Если поток с высоким приоритетом должен ждать по потоку с низким приоритетом (семафором мьютекса и т. Д.), Поток с низким приоритетом временно повышается до того же приоритета, что и поток с высоким приоритетом.

+0

Является ли это «всегда» где-то, о чем я не знаю? Насколько мне известно, «повышение приоритетов» - это трюк, который реализуется в некоторых местах, но, конечно же, не во всех ОС/планировщиках. –

+0

Не по умолчанию вам нужно использовать атрибут mutex 'PTHREAD_PRIO_INHERIT'. См. Http://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_mutexattr_getprotocol.html –

+0

Спасибо за ссылку..и ясно, что если поток ожидает того же самого mutext с PTHREAD_PRIO_INHERIT, то поток, содержащий один и тот же мьютекс будет выполняться с высоким приоритетом, чем ожидающий поток. В основном это достигается путем определения приоритетов для мьютексов. – suresh

0

В потоке с высоким приоритетом не будет блокировки, для которой он запрашивает, пока нить низкого приоритета не разблокирует его.

Чтобы избежать этого, мы можем использовать семафор, где любой другой поток может инициировать разблокировку, но в мьютексе это невозможно.

+0

Точно что вы говорите? Я думаю, что там нет «нет» ... –

Смежные вопросы