2015-10-14 3 views
0

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

Предположим, что у меня есть два процесса A и B. Предположим, что процесс A имеет с ним семафор и выполняет некоторую критическую задачу. Теперь, скажем, процесс B посылает сигнал для освобождения семафора. В этом случае будет обрабатываться А освободить семафор, даже если он выполняет какую-то критическую задачу?

+0

Пожалуйста, смотрите эту ссылку http://koti.mbnet.fi/niclasw/MutexSemaphore.html, он имеет хорошее объяснение на семафоре против мьютекса –

ответ

-1

Нет такой вещи, как «наличие» семафора. Семафоры не имеют собственности, как мьютексы. Код, который вы описываете, просто будет ошибкой. Мьютексы не будут работать, если ваш код тоже глючит.

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

Но что, если сам поезд многопоточный? Какая нить должна принадлежать треку?

А что, если сигнальные устройства - это нити, а не поезд? Здесь сигнальное устройство, которое обнаруживает поезд, входящий в дорожку, должно блокировать дорожку, в то время как сигнальное устройство, которое обнаруживает поезд, покидающий дорожку, должно разблокировать его.

Мьютексы подходят для случаев, когда в течение некоторого времени есть что-то, что принадлежит определенной теме. Этот поток может «владеть» мьютексом. Семафоры полезны для случаев, когда нет нити, чтобы владеть чем-либо или ничего для собственного потока.

+0

Не имеет никакого отношения к вопросу. – SergeyA

+0

@SergeyA Действительно? Можете ли вы объяснить, почему вы так думаете? (Или просто ответьте на вопрос самостоятельно.) Я понимаю его вопрос как непонимание того, как может иметь смысл иметь примитив синхронизации, который не принадлежит или почему он не всегда будет ошибкой для общего ресурса, который будет выпущен нить, отличную от той, которая ее заблокировала. –

+0

Потому что вы делаете ложные аналоги и неверны с точки зрения применимости. Нет ничего плохого в использовании семафоров для синхронизации потоков (если вы знаете, что делаете). – SergeyA

0

Вы делаете половину смысла. Речь идет не о собственности. Партнерский выпуск в семафорах (и мьютексах) можно использовать, например, в моем любимом интервью на тему пинг-понга. На самом деле, я специально попробовал к партнерскому выпуску мьютекса для трех реализованных мной реализаций (Linux/Solaris/AIX), а партнер-релиз действительно работал для мьютексов, как ожидалось, - мьютекс был успешно выпущен и потоки блокировка на нем возобновила выполнение. Однако это, конечно, запрещено Posix.

0

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

Хорошим примером может служить телевизор. Только так много людей могут смотреть один и тот же телевизор, поэтому защита его с помощью семафора имеет смысл. Любой может прекратить смотреть телевизор. Пульт дистанционного управления для телевизора может управляться только одним человеком за раз, поэтому вы можете защитить его мьютексом.

Некоторое чтение ...

https://en.wikipedia.org/wiki/Mutual_exclusion

https://en.wikipedia.org/wiki/Semaphore_%28programming%29

0

«Скажем, у меня есть два процесса A и B. Предположим, процесс А, имеющий семафор с ним и выполнения некоторых критическая задача. Теперь, скажем, процесс B отправляет сигнал для освобождения семафора. В этом случае будет обрабатываться A освободить семафор, даже если он выполняет какую-то критическую задачу?"

Ключевым моментом здесь отметить роль ОС ядра. Процесс B не может послать сигнал к процессу A„ чтобы освободить семафор“. То, что он может сделать, это обратиться к ядру, чтобы дать это доступ к ресурсу. Процесс A запросил ядро, и ядро ​​предоставило ему доступ к ресурсу. Теперь процесс A после завершения его работы позволит ядру знать, что это делается с ресурсом, а затем доступ к ядру предоставляет доступ к ресурсу к В.

«возникает Мои сомнения, когда процесс, который не имеет семафор с он может освободить семафор. Что толк иметь семафор?»

Основное различие между мьютексом и семафором, семафор упорядочивает доступ к нескольким экземплярам ресурса. Мьютекс делает то же самое, когда есть один экземпляр ресурс.

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

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

Скажем, существуют процессы A, B и C, которым необходим параллельный доступ к ресурсу (блокировка, файл или структура данных в памяти и т. Д.). Предположим, что есть 2 экземпляра ресурса. Таким образом, максимум два процесса могут быть предоставлены одновременно.

Процесс А запрашивает доступ к экземпляру ресурса, следуя необходимой семантике. Этот запрос к ядру включает структуры данных для идентификации ресурса и максимального количества экземпляров, поскольку 2. ядро ​​создает семафор со счетом 2, предоставляет доступ к ресурсу и уменьшает счет до 1, потому что теперь только один другой процесс может получить доступ.

Теперь процесс B запрашивает доступ к ресурсу, следуя той же семантике. Ядро предоставляет ему доступ и уменьшает значение счета до 0.

Теперь процесс обработки запросов C запрашивает, но ядро ​​сохраняет его в состоянии ожидания, поскольку счетчик равен 0, и не более двух процессов могут получать одновременный доступ.

Процесс А выполняется с ресурсом и позволяет ядру знать. Ядро замечает это и предоставляет доступ к процессу C, который ждал.

В случае мьютекса ядро ​​предоставляет доступ к ресурсу только по одному процессу за раз.

0

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

Для запроса, связанного с 2 процессами A и B, процесс A должен интродуцировать через ядро, что это делается с его критической работой, чтобы ресурс мог быть доступен для ожидающих процессов, таких как B.

Вы можете найти соответствующую информацию в этой ссылке тоже: When should we use mutex and when should we use semaphore

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