Почему семафор? - PullRequest
       29

Почему семафор?

3 голосов
/ 16 ноября 2010

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

Ответы [ 7 ]

6 голосов
/ 16 ноября 2010

Поскольку семафор не простая переменная, это более крупная конструкция, чем эта.

В частности, со счетным семафором (которым двоичный семафор фактически является со счетом 1) добавлена ​​возможность блокировки любого процесса / потока, который пытается увеличить семафор выше своего максимального значения.

Семафоры также имеют дополнительное средство, состоящее в том, что их состояние изменяется «атомарно», что означает, что основная память окружена логикой, чтобы гарантировать, что кэши ЦП и тому подобное очищаются, и что, когда значение изменяется, оно изменяется "каждый". Это особенно важно для современных многоядерных процессоров.

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

3 голосов
/ 16 ноября 2010

Ряд причин.Поскольку семафор предоставляется операционной системой, он может ...

a) использоваться несколькими процессами.

b) использоваться для блокировки процессов в ожидании, а не в режиме ожидания.

в) на самом деле работает.Переменная, совместно используемая несколькими потоками или в общей памяти для нескольких процессов, не обеспечит вам безопасность семафора, потому что вы никогда не знаете, когда ваш поток / процесс потеряет контроль.Когда вы приобретаете двоичный семафор, вы ЗНАЕТЕ, что вы единственный поток / процесс в этом разделе кода, ОС гарантирует, что.

Я рекомендую вам прочитать книгу по этому вопросу, это глупый вопрос :) без обид!

3 голосов
/ 16 ноября 2010

Потому что переменная не работает между процессами. Системный семафор делает.

1 голос
/ 04 января 2012

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

1 голос
/ 16 ноября 2010

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

Thread A checks if email[0] has been read, it has not
Thread B checks if email[0] has been read, it has not
Thread A sends email[0] and marks it as done
Thread B sends email[0] and marks it as done

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

Thread A marks email[0] as in progress via a semaphore
Thread B checks email[0] and sees the semaphore is marked
Thread A sends email[0] and marks it as done then unmarks the semaphore

С семафором только один поток будет обрабатывать электронную почту.

0 голосов
/ 13 февраля 2014

Предположим, что простой способ реализации защиты ресурсов может быть реализован с помощью переменной, то есть BOOLEAN. Я приведу пример:

while {resource_protected == TRUE}
{
// resource is protected
}

Теперь мы можем защитить ресурс, установив resource_protected == TRUE.

Чтобы проверить, доступен ли ресурс, мы просто используем что-то вроде этого:

if {resource_protected == FALSE}
{    // <---- rescheduling possible here!
resource_protected == TRUE; // protect resource
}
else
{
//try again later
}

Но есть две проблемы с этим методом. Во-первых, это создает занятое ожидание , поэтому процессор не может делать другие вещи. Во-вторых, что более важно, этот активный процесс может быть перепланирован (перемещен в очередь ожидания) после он проверяет BOOLEAN, но до он защищает ресурс, устанавливая BOOLEAN в значение TRUE, создавая тем самым иллюзия для других процессов, что ресурс по-прежнему свободен, потому что BOOLEAN еще не установлен. Это позволяет другому процессу запрашивать ресурс. Теперь активный процесс (переведенный из очереди ожидания в очередь из-за перепланирования) защищает ресурс, устанавливая для BOOLEAN значение TRUE (поскольку он не был установлен перепланированным процессом в очереди ожидания). Теперь этот активный процесс перепланирован, и предыдущий процесс снова становится активным, он установит для BOOLEAN значение ИСТИНА (хотя он был установлен в значение ИСТИНА уже во втором процессе), поскольку он уже проверил BOOLEAN. Теперь оба процесса требуют одного и того же ресурса, и вы умрете стариком, пытающимся отладить этот беспорядок.

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

0 голосов
/ 16 ноября 2010

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

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

...