Где нам действительно нужен набор System v Semaphores?
Каждый раз, когда я читаю описание semget: The semget() system call returns the semaphore set identifier associated with the argument key.
Интересно, где нам действительно нужен набор семафоров System V?
Я всегда даю nsems
параметр как 1
потому что в большинстве случаев мне требуется один семафор. Даже если мне не нужен двоичный семафор, зачем мне создавать набор из 5-6 семафоров (скажем).
и что, если процесс создает набор из 6 семафоров, связанных с одним ключом, а другой пытается выполнить полугетку с тем же ключом, запрашивая только 3 семафора. Также не все эти 6 семафоров 6 отдельных двоичных семафоров. Я хочу пить и ищу ответ на этот вопрос в течение 2 месяцев (не постоянно, конечно).
Мне жаль, если этот вопрос кажется самым глупым, но если я не получу пример реального использования набора семафоров, это сомнение останется в моей памяти. Я пытался найти пример кода C, где кто-то использует набор семафоров, но я не смог его найти.
Я был бы очень благодарен вам, ребята, если бы вы могли помочь мне в этом. Спасибо за тонну заранее.
3 ответа
Я работаю над СУБД, которая использует один семафор для каждого из набора взаимодействующих процессов, которые работают с одними и теми же данными, взаимодействуя через общую память. Необходимость распределять их по одному было бы неприятностью; очень удобно иметь семафор, в котором 20 (или что-то еще) семафоров.
Наиболее типичная ситуация, которую я знаю для семафора, - это когда у вас есть очередь данных, обрабатываемая одним или несколькими потоками обработки. Каждый поток будет уменьшать семафор для каждой записи, удаляемой из очереди, и по мере добавления новых данных в очередь семафор увеличивается. Тогда все, что вам нужно сделать, это ждать семафора, а не постоянно запрашивать обновление.
Я использовал набор семафоров в задании по курсу «Операционные системы» в моем университете.
Задача состояла в том, чтобы создать сервер, который порождает клиентов. Клиенты могли отправлять запросы и получать ответы от сервера. Только один клиент в каждый момент времени мог отправить запрос на сервер.
Поэтому я использовал три семафора:
- 1 в качестве мьютекса (инициализированного равным единице), используемого исключительно между клиентами
- 1 для запросов между клиентом и сервером.
- 1 для ответов, между сервером и клиентом