Мютексы (англ. mutex, от mutual exclusion — взаимное исключение) – объекты синхронизации, позволяющие нескольким потокам безопасно использовать общие ресурсы: перед обращением к разделяемым ресурсам поток блокирует мютекс, выполняет какие-либо операции и после этого разблокирует его.

Мютекс, как и бинарный семафор, может находиться только в двух состояниях: блокированном и разблокированном. Отличие заключается в том, что у мютекса имеется понятие владельца. Если мютекс уже заблокирован одном потоке, он не может быть разблокирован или заблокирован снова в другом. Это может привести к непредсказуемому поведению системы. Поток, пытающийся заблокировать мютекс, принадлежащий другому потоку, будет блокирован до тех пор, пока владелец не разблокирует мютекс. В бинарных семафорах понятия владельца нет: один поток может заблокировать семафор, а другой разблокировать.

Мютексы, в отличие от семафоров, обеспечивают защиту от инверсии приоритетов. Инверсия приоритетов возникает в тех случаях, когда поток с низким приоритетом незаконно не дает выполняться потоку с более высоким приоритетом. Пусть, например, высокоприоритетный поток ожидает мютекс, которым владеет низкоприоритетный поток. Если в этот момент низкоприоритетный поток будет вытеснен другим потоком со средним приоритетом (приоритет которого выше, чем у него, но ниже, чем у высокоприоритетного потока), то возникает инверсия приоритетов: поток со средним приоритетом заблокировал выполнение потока с высоким приоритетом.

Существует два метода борьбы с инверсией приоритетов. Первый метод (Priority Ceiling Protocol) заключается в том, что при завладении мютексом приоритет потока повышается до некоторого порогового значения, определяемого, например, при конфигурации операционной системы. Недостатком этого метода является то, что для установки корректного порогового значения необходимо знать значения приоритетов потоков, использующих мютексы. Другой недостаток заключается в том, что если пороговое значение будет слишком велико, выполнение других потоков с более низкими приоритетами будет заблокировано, что может привести к нарушению временных параметров системы. Кроме того, изменение приоритетов потоков происходит даже тогда, когда инверсии приоритетов нет.

Более гибким способом борьбы с инверсией приоритетов является механизм наследования приоритетов – Priority Inheritance Protocol. Наследование приоритетов позволяет потоку, владеющему мютексом, увеличить свой приоритет до максимального из всех значений приоритетов потоков, ожидающих этот мютекс. Этот метод применяется только тогда, когда поток с высоким приоритетом ожидает мютекс. Недостатком данного механизма является увеличение времени работы планировщика, поскольку при вызове функций синхронизации будут проверяться условия наследования приоритетов.



 Семафор – объект синхронизации, позволяющий нескольким потокам ожидать наступления некоторого события. Событие может быть создано другим потоком или функцией-обработчиком прерывания DSR в ответ на прерывание. Счетчик семафора определяет количество необработанных событий.

Для работы с семафорами используются две операции – post и wait. Операция wait сравнивает значение счетчика семафора с нулем. Если значение больше нуля, операция wait уменьшает его и возвращает управление. Если значение счетчика семафора равно нулю, процедура wait не возвращает управление потоку, а поток переводится в состояние ожидания.

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

Различают два вида семафоров: счетные и бинарные. В бинарных семафорах, в отличие от счетных, значение счетчика не может быть больше 1. Таким образом, бинарные семафоры могут находиться только в двух состояниях: блокированном и разблокированном. Счетные семафоры могут находиться в нескольких состояниях в зависимости от значения их счетчика.



Последнее изменение: Понедельник, 5 сентября 2011, 12:30