Каков диапазон общего семафора. Я знаю, что он может принимать отрицательные значения, 0 и 1. Отрицательные значения, демонстрирующие количество процессов, которые блокируются в очереди блоков. 0 означает, что процесс не находится в блоке, а 1 означает, что есть один доступный ресурс, который ни один процесс не выгрузил, я хочу знать, возможно ли иметь для него значения, превышающие 1 (например, 2) и что это значит? Означает ли это, что у нас есть более одного ресурса для одного семафора?Что такое общий ассортимент семафоров?
ответ
Вы должны точно указать, о каком семафоре вы говорите. 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 пользователей - у вас нет создано взаимное исключение, но вы создали механизм дросселирования . Видеть?
да, поэтому значения, превышающие 1 для семафоров, означают количество похожих ресурсов, которые могут отправляться между процессами, и между ними не будет блокировки. это правда? ваш ответ был настолько полезен. спасибо – muradin
Да, это идея.Имейте в виду, что этот сценарий довольно бесполезен - подавляющее большинство семафоров используют для взаимного исключения с максимальным количеством ресурсов, равным 1. –
Общим способом думать о семафорах является аналогия корзины с шарами. Если в корзине есть мяч, то процесс или задача могут вывести мяч из корзины и получить доступ к общему ресурсу или совместному месту выполнения.
Получение мяч из корзины представляет отсчет семафора и наоборот, положить мяч в корзину аналогия для подсчитывая семафор. Он может использоваться для взаимного исключения, синхронизации и других случаев.
Обычно не существует ограничения на то, какие значения может принимать семафор, кроме того, что это только целые значения и ограничены реализацией целых чисел платформы.
Это может зависеть от вашего конкретного случая использования, действительно ли семафор может достигать значения> 1, в некоторых случаях это возможно, а в других можно предположить, что семафор не может стать больше 1, но там диапазон будет зависеть о конкретном использовании семафоров.
Отрицательный, на семафоре есть точно -N нитей.
Zero, без ожидающих потоков, операция ожидания помещает очередь в вызывающий поток.
Положительный, без ожидающих потоков, операция ожидания не помещает очередь в вызывающий поток.
подсчета семафоров, как правило, используются в качестве охранников ресурсов, доступных в дискретном количестве. Например, счетчик может представлять количество используемых слотов в круговой очереди, потоки производителей будут «сигнализировать» семафоры при вставке элементов в очередь, потребительские потоки «ожидают», чтобы элемент отображался в очереди, это обеспечило бы отсутствие потребитель мог бы получить элемент из очереди, если нет доступных предметов.
Максимальное число зависит от системы. Семафор может быть реализован с использованием файлового дескриптора, и в этом случае приложения могут открывать по крайней мере в общей сложности файлы {{OPEN_MAX} и семафоры.
Вы можете проверить текущее значение в вашей системе: cat /proc/sys/fs/file-max
Я очень благодарен вашему концептуальному ответу. но ответ Майкла Берра более технический, и я должен его принять. Благодарю. – muradin
Ее известный как счетный семафор. , например: - у вас есть критический раздел разделяемой памяти, и вы инициализировали счетный семафор до 10, это означает, что за один раз в критический раздел для чтения можно ввести только макс. 10 процессов. и для записи в критический раздел используйте двоичный семафор и используйте комбинацию как вышеупомянутого, так и двоичного семафора для доступа к региону во время чтения.
например: - при записи декремента двоичный семафорный счетчик равен 0, и процесс чтения будет проверять только двоичный счетчик семафора, если (0) ждать, если (1) будет готов к чтению.
- 1. Что такое общий метод ГИС?
- 2. Что такое общий тип возврата
- 3. Как MessageBodyReader знает, что такое общий тип?
- 4. Что такое «общий» тип для массива enum?
- 5. Что такое «открытый общий тип» в .NET?
- 6. WPF: Что такое общий контроль контейнера?
- 7. Что такое «фирменный ZigBee»?
- 8. Ассортимент форумов - Symfony 3
- 9. Что такое обработчики событий?
- 10. Понимание семафоров ...
- 11. семафоров значение
- 12. Ассортимент ONLYOFFICE и mime-типов
- 13. Multiple ассортимент продукции в Python
- 14. Ассортимент фильтров на Spree commerce
- 15. Проблемы сонаты сокета [Ассортимент продуктов]
- 16. Получить ассортимент в заказе коллекции
- 17. Ассортимент связанного списка в c
- 18. Случайный ассортимент чисел для переменных
- 19. Ассортимент продуктов массового импорта - WooCommerce?
- 20. Что такое общий логический раздел под z/OS?
- 21. Что такое общий, переносимый способ отключения команд в Linux?
- 22. Что такое общий обработчик в asp.net и его использование?
- 23. Что такое общий язык для продукта применения единого правила производства?
- 24. Что такое общий Lisp-эквивалент объекта по умолчанию для схемы?
- 25. Что такое общий способ использования проекта Spring внутри другого?
- 26. Что такое хороший общий подход к написанию инструмента обновления
- 27. Что такое общий шаблон для запланированной обработки событий весной?
- 28. Что такое хороший общий термин для ошибок и предупреждений?
- 29. Что такое общий способ предоставления аварийного режима для службы wcf
- 30. Что такое «общий» (необходимо/полезно знать) SQL Database-операции?
Посмотрите [здесь] (http://www.greenteapress.com/semaphores/) для подробного объяснения семафоров. –
И статья в Википедии содержит также хорошее объяснение http://en.wikipedia.org/wiki/Semaphore_(programming) – nos