Семафор против мониторов - какая разница?


233

Каковы основные различия между монитором и семафором ?


8
Вы можете думать о мониторе как о двоичном семафоре.
Максим Егорушкин


1
Пожалуйста, пройдите этот albahari.com/threading/part2.aspx . Я прочитал эту статью, лучшую, которую я когда-либо читал на Threading
Shantanu Gupta

5
Я не думаю, что ты прав, Максим. Семафор - это «низкоуровневая» структура, если я не ошибаюсь, тогда как Monitor - это полноценный объект. Я помню, что мы кратко изучили мониторы в моем классе операционных систем в колледже, но я не помню, как монитор отличался от Mutex, кроме того, что он был объектно-ориентированным. Я помню, одну проблему можно было решить с помощью мониторов, но мы не могли использовать этот же метод в классе из-за ограничений языка Си.
user919860 14.10.11

1
Семафор и монитор сильно отличаются друг от друга, но по мощности они эквивалентны в том смысле, что вы можете реализовать одно из другого. Вы можете прочитать оригинальную статью Хоара, которая доказывает их эквивалентность, отсюда
Thanh DK

Ответы:


529

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

Семафор является объектом более низкого уровня. Вы можете использовать семафор для реализации монитора. Семафор - это просто счетчик. Когда счетчик положителен, если поток пытается получить семафор, он разрешается, и счетчик уменьшается. Когда поток завершен, он освобождает семафор и увеличивает счетчик.

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

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

Семафор походит на место проката велосипедов. У них есть определенное количество велосипедов. Если вы попытаетесь взять напрокат велосипед, а у него есть один бесплатный, то вы можете взять его, иначе вам придется подождать. Когда кто-то возвращает свой велосипед, кто-то другой может взять его. Если у вас есть велосипед, то вы можете дать его кому-нибудь еще, чтобы его вернуть - пункт проката велосипедов не заботится о том, кто его вернет, если он вернет свой велосипед.


162
+1 Отличная аналогия с общественными ванными комнатами и местом проката велосипедов. Я никогда не забуду разницу между ними сейчас.
Drupad Panchal

4
Ваш ответ противоречит stackoverflow.com/a/7336799/632951 .. так кто же прав?
Pacerier

6
@Pacerier: Я :-) Единственное противоречие - вещь высокого уровня / низкого уровня. Вы можете построить монитор из семафоров, он не очень аккуратный, именно потому, что монитор представляет собой структуру более высокого уровня, чем семафор. Семафор - это просто счетчик с ожиданием. Предлагаю прочитать «Маленькую книгу семафоров» greenteapress.com/semaphores
Энтони Уильямс,

3
@AnthonyWilliams: я, возможно, сомневаюсь, что вы можете создавать мониторы только из семафоров. Возможен и другой путь, и поэтому мы не можем сказать, что монитор - это объект более высокого уровня, чем семафоры.
Кавиш Двиведи

5
Да, вы можете создать семафор с монитора. Вы всегда можете построить низкоуровневые объекты из высокоуровневых. Материал высокого / низкого уровня связан с возможностями и областью действия, а не с тем, который можно использовать для создания другого.
Энтони Уильямс

11

Следующее объяснение фактически объясняет, как wait () и signal () монитора отличаются от P и V семафора.

Ожидания () и сигнал () операции по условию переменных в мониторе аналогичны P и V операций по подсчету семафоров .

Оператор ожидания может блокировать выполнение процесса, а оператор сигнала может вызвать разблокировку другого процесса. Тем не менее, есть некоторые различиямежду ними. Когда процесс выполняет P-операцию, он не обязательно блокирует этот процесс, потому что счетный семафор может быть больше нуля. Напротив, когда выполняется оператор ожидания, он всегда блокирует процесс. Когда задача выполняет V-операцию с семафором, она либо разблокирует задачу, ожидающую этот семафор, либо увеличивает счетчик семафора, если задача не разблокируется. С другой стороны, если процесс выполняет оператор сигнала, когда нет другого разблокируемого процесса, это не влияет на переменную условия. Другое различие между семафорами и мониторами заключается в том, что пользователи, пробуждаемые операцией V, могут без задержки возобновить выполнение. Наоборот, пользователи, пробуждаемые сигнальной операцией, перезапускаются только тогда, когда монитор разблокирован. К тому же,

Ссылка: здесь для дальнейшего чтения. Надеюсь, поможет.


6

Ответ в одну строку:

Монитор: контролирует только ОДИН поток, который может одновременно выполняться на мониторе. (необходимо получить блокировку для выполнения одного потока)

Семафор: замок, который защищает общий ресурс. (необходимо получить блокировку для доступа к ресурсу)


5

Семафор позволяет нескольким потокам (до заданного числа) получать доступ к общему объекту. Мониторы обеспечивают взаимоисключающий доступ к общему объекту.

монитор

семафор


10
Но тогда чем Монитор будет отличаться от MutEx? Блокировка взаимного исключения делает то же самое, что и семафор, но позволяет только одному потоку одновременно получать доступ к критической области.
user919860 14.10.11

2
Да какая разница между мнитором и мьютексом?
Pacerier

2
Стоит отметить, что семафоры не контролируют доступ к общему объекту, а скорее к общему ресурсу (который будет содержать несколько объектов).
xbonez

@xbonez: Если мы посмотрим java.util.ArrayList: это объект или контейнер из нескольких объектов? Ну, это одновременно. Так подходит ли семафор для контроля доступа к нему? Я бы сказал: нет.
dma_k

В самом принятом ответе упоминается, что в Monitor реализовано взаимное исключение. См. «Функции-члены или методы объекта монитора будут обеспечивать взаимное исключение, поэтому только один поток может выполнять какое-либо действие над объектом в данный момент времени»
achoora

2

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

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

Монитор имеет встроенный механизм для синхронизации условий в виде переменной условия перед продолжением. Если условие не выполняется, процесс должен ждать, пока он не будет уведомлен об изменении условия. Когда процесс ожидает синхронизации условий, реализация монитора заботится о проблеме взаимного исключения и позволяет другому процессу получить доступ к монитору.

Взято из Открытого университета. Часть 3 курса 3 «Взаимодействующий процесс».


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

2

Семафор:

Использование счетчика или флага для управления доступом к некоторым общим ресурсам в параллельной системе подразумевает использование семафора .

Пример:

  1. Счетчик, позволяющий только 50 пассажирам приобрести 50 мест (общий ресурс) любой театральной / автобусной / железнодорожной / развлекательной поездки / классной комнаты. И разрешить нового Пассажира, только если кто-то освободит место.
  2. Бинарный флаг, указывающий свободный / занятый статус любой ванной комнаты.
  3. Светофоры являются хорошим примером флагов. Они контролируют поток, регулируя проезд транспортных средств по дорогам (общий ресурс)

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

Монитор:

Monitor синхронизирует доступ к объекту, связываясь с потоками , заинтересованных в объекте, попросив их доступ приобретает или подождать какое - то условие , чтобы стать правдой.

Пример:

  1. Отец может выступать в качестве монитора для ее дочери, позволяя ей встречаться только с одним парнем за раз.
  2. Школьный учитель с помощью дубинки разрешил говорить в классе только одному ребенку.
  3. И, наконец, технический: транзакции (через потоки) на объекте Account синхронизируются для обеспечения целостности.

Я думаю, что светофор на перекрестке также является бинарным флагом: либо автомобили на одной дороге, либо на ортогональной дороге могут ездить (взаимоисключающие), поэтому пример (3) такой же, как (2). Также я думаю, что эти примеры являются угловым случаем для семафоров (тривиальный случай), который может быть реализован с помощью монитора. В википедии есть более типичные примеры .
dma_k
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.