Зачем вам использовать монитор вместо семафора?

11

В настоящее время я посещаю курс параллельного программирования в моем университете, и недавно мы начали говорить о концепции монитора. Хотя я понимаю необходимость взаимного исключения, я не понимаю, почему я бы использовал для этого монитор.

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

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

Деннис Хейн
источник

Ответы:

8

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

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

Другое отличие при использовании семафоров заключается в том, что каждая подпрограмма, обращающаяся к общему ресурсу, должна явно получить блокировку перед использованием ресурса. Это можно легко забыть при кодировании подпрограмм, работающих с многопоточностью. Мониторы, в отличие от семафоров, автоматически приобретают необходимые блокировки. [1]

См. Также высоко оцененный ответ «Переполнение стека» « Семафор против мониторов» - в чем разница? с отличной / запоминающейся аналогией с общественными туалетами и велосипедными стойками.

ВЗН
источник
По сути, я делаю то же самое, что и с семафорами, но я избавляю программиста от необходимости блокировать / разблокировать его, предоставляя ему интерфейс, который позволяет ему получать доступ (и манипулировать) данными, обеспечивая при этом взаимное исключение. Преимуществом будет более чистый код и потенциально меньшее количество ошибок в коде, потому что вы не можете забыть заблокировать / разблокировать (что приведет к потенциально поврежденным данным). Это правильно или я что-то упустил?
Деннис Хейн
Указанный текст вводит в заблуждение, говоря, что при использовании мониторов нет необходимости в получении и снятии блокировки. Это может быть правдой при использовании ключевого слова synchronized в Java, но в соответствии с en.wikipedia.org/wiki/Monitor_(synchronization) обычно переменные состояния монитора имеют вызовы wait / signal, которые также должны быть реализованы в приложении. Но нет необходимости обрабатывать мьютекс в приложении, так что может быть проще в использовании.
Самутам
5

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

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

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

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

Я думаю, мы можем сделать вывод, что это ситуативное решение, независимо от того, нужен ли вам / хотите использовать монитор или семафор. Если вы строите систему реального времени, вы можете использовать семафор, если вы создаете офисную программу, вы можете использовать и монитор.

Деннис Хейн
источник
1

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

vonbrand
источник