2013-12-18 3 views
3

Каков диапазон общего семафора. Я знаю, что он может принимать отрицательные значения, 0 и 1. Отрицательные значения, демонстрирующие количество процессов, которые блокируются в очереди блоков. 0 означает, что процесс не находится в блоке, а 1 означает, что есть один доступный ресурс, который ни один процесс не выгрузил, я хочу знать, возможно ли иметь для него значения, превышающие 1 (например, 2) и что это значит? Означает ли это, что у нас есть более одного ресурса для одного семафора?Что такое общий ассортимент семафоров?

+0

Посмотрите [здесь] (http://www.greenteapress.com/semaphores/) для подробного объяснения семафоров. –

+0

И статья в Википедии содержит также хорошее объяснение http://en.wikipedia.org/wiki/Semaphore_(programming) – nos

ответ

4

Вы должны точно указать, о каком семафоре вы говорите. Linux поддерживает семафоры ядра, семафоры POSIX и семафоры System V.

Документов API System V семафоров, что значение semaphoer можит быть меньше 0.

Документами API POSIX семафоров, что «Если семафор заблокирован, то объект, к которому SVAL точка должен либо быть установлена ​​в ноль или отрицательное число, абсолютное значение которого представляет количество процессов, ожидающих семафор в какое-то неопределенное время во время вызова ». Похоже, что реализация glibc семафоров POSIX не позволяет семафору count/value упасть ниже нуля.

Семафоры ядра Linux имели обыкновение иметь реализацию, которая отслеживала официантов, используя отрицательные подсчеты - это реализация, которая задокументирована в Bovet & Книга Cesati «Понимание ядра Linux». Однако в какой-то момент в эволюции ядра 2.6 (я думаю, что после 2.6.11 и до 2.6.32) реализация изменилась так, что значение семафора не опустится ниже нуля.

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

Но варианты использования, в которых семафор, более 1, полезен, довольно редки. Как сказал Линус Торвальдс в телеконференции проводки (http://yarchive.net/comp/linux/semaphores.html):

Однако почти все практическое применение семафоров является частным случаем где счетчик инициализируется 1, и где они используются в качестве простого взаимного исключения с только один пользователь разрешен в критическом регионе. Такой семафор часто называют семафором «мьютекс» для MUTual EXclusion.

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

/* Maximum concurrent users */ #define MAX_CONCURRENT_USERS 20 
struct semaphore sem; 

init_sema(&sem, MAX_CONCURRENT_USERS); 

, а затем каждый пользователь делает вниз() на семафор перед началом операции , Он не будет блокироваться до тех пор, пока у вас не будет 20 пользователей - у вас нет создано взаимное исключение, но вы создали механизм дросселирования . Видеть?

+0

да, поэтому значения, превышающие 1 для семафоров, означают количество похожих ресурсов, которые могут отправляться между процессами, и между ними не будет блокировки. это правда? ваш ответ был настолько полезен. спасибо – muradin

+0

Да, это идея.Имейте в виду, что этот сценарий довольно бесполезен - подавляющее большинство семафоров используют для взаимного исключения с максимальным количеством ресурсов, равным 1. –

0

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

enter image description here

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

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

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

3

Отрицательный, на семафоре есть точно -N нитей.

Zero, без ожидающих потоков, операция ожидания помещает очередь в вызывающий поток.

Положительный, без ожидающих потоков, операция ожидания не помещает очередь в вызывающий поток.

enter image description here

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

Максимальное число зависит от системы. Семафор может быть реализован с использованием файлового дескриптора, и в этом случае приложения могут открывать по крайней мере в общей сложности файлы {{OPEN_MAX} и семафоры.

Вы можете проверить текущее значение в вашей системе: cat /proc/sys/fs/file-max

+0

Я очень благодарен вашему концептуальному ответу. но ответ Майкла Берра более технический, и я должен его принять. Благодарю. – muradin

0

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

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

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