Терминология семафоров - PullRequest
2 голосов
/ 06 февраля 2012

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

a) Спинлоки связаны с занятым ожиданием, поэтому во избежание этого у нас есть семафоры.б) Семафоры - это своего рода спин-блокировки, но у нас могут быть семафоры, не занятые ожиданиемв) переменные pthread_condition делают то же самое, что и семафоры?Если это так, они эквивалентны семафорам из библиотеки semaphore.h.Я запутался, если оба представляют одну и ту же функциональность.

Ответы [ 2 ]

4 голосов
/ 06 февраля 2012

Абстрактно говоря, семафор - это замок с количеством разрешений, связанных с ним.Семафоры поддерживают две операции:

  1. Вверх , который увеличивает количество разрешений, и
  2. Вниз , который пытается уменьшить числоразрешений.Если недостаточно разрешений, эта операция ожидает, пока их станет достаточно.

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

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

  1. Wait , которые блокируют поток до тех пор, пока он не получит сигнал,
  2. Notify , который сообщает, что один поток ожидаетна условную переменную, которую он может продолжить, и
  3. Notify-all , который сообщает всем потокам, ожидающим на условной переменной, что они могут продолжить.

Условиепеременные и семафоры (как правило) могут использоваться взаимозаменяемо, с подходящим изменением в дизайне использования блокировки.Однако иногда с семафорами легче работать, а иногда с условными переменными легче работать, поэтому у нас есть оба примитива.Как правило, вы выбираете использовать один над другим из-за конкретной библиотеки или языка, который вы используете.Например, объекты Java имеют встроенную поддержку мониторов (условные переменные в паре с блокировкой), поэтому часто полезно использовать условные переменные в Java, хотя семафоры Java существуют.Если вы программируете в Windows, семафоры являются предпочтительным методом синхронизации, хотя условные переменные существуют.

Надеюсь, это поможет!

0 голосов
/ 06 февраля 2012

спин-блокировки используют занятое ожидание, поэтому имя spin-thread spins ничего не делает.

Что означает «могу я войти? Могу ли я войти? Могу ли я войти… и т. Д.», Пока блокировка не разрешит это в критической секции (CS)

семафоры: обычно реализуются с сигналом / уведомлением и очередью, поэтому, когда поток наступает на семафор, он переходит в режим сна и в очередь, если в критической секции есть другой поток.Если в CS нет другого потока, текущий поток входит в него.Все остальные потоки, которые наступают на семафор, пока другой поток находится в CS, идут в очередь.Когда первый поток выходит из CS, он снова входит в семафор.Семафор теперь берет первый поток в своей очереди и пробуждает его, что в свою очередь заставляет поток войти в CS.

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

РЕДАКТИРОВАТЬ: Семафоры против Условий

Операции ожидания и передачи сигналов по условиям очень похожи на операции P и V при подсчете семафоров.Оператор wait может блокировать выполнение потока, в то время как оператор сигнала может вызвать возобновление другого потока.Однако между ними есть различия.Операция P не обязательно блокирует поток, поскольку счетчик семафора может быть больше нуля.Оператор wait, однако, всегда блокирует поток.Оператор сигнала может подготовить (разблокировать) заблокированный поток по условию так же, как операция V подготавливает заблокированный поток на семафор.Разница в том, что операция V всегда увеличивает счетчик семафоров;тем самым влияя на последующую P-операцию.Оператор сигнала в пустом состоянии не влияет на последующий оператор ожидания и, следовательно, теряется.Другое отличие состоит в том, что несколько потоков, заблокированных на семафоре, могут без задержки возобновить выполнение, если будет выполнено достаточное количество V-операций.В случае типа мьютекса несколько операторов сигнала разблокируют несколько потоков, но только один из этих потоков может выполняться из-за свойства взаимного исключения типа мьютекса.

...