System V семафор множественное увеличение / уменьшение

Я читал разницу между семафорами POSIX и System V, и я прочитал несколько статей об этом. В каждой статье написано следующее утверждение: "Семафоры System V полезны, если вам нужно реализовать атомарные операции с несколькими приращениями-убываниями за один шаг".

Мои вопросы:

1) Зачем нужно многократное увеличение / уменьшение в одной атомарной операции? Можете ли вы объяснить с примером?

2) Почему semop допускает изменение значения на значение меньше -1 и больше +1? Есть ли практическое использование / пример того же?

(Я знаю, что с помощью функции semop() в семафорах System V я могу увеличить или уменьшить семафор на указанное значение более, чем на один семафор в массиве семафоров, и что то же самое нельзя сделать с помощью sem_wait() или sem_post() из Семафоры POSIX. Но какая польза от этого?)

Статьи, которые я прочитал, для вашей справки:

1) http://www.ibm.com/developerworks/library/l-semaphore/

2) Отличия семафоров System V и Posix

3) http://www.linuxdevcenter.com/pub/a/linux/2007/05/24/semaphores-in-linux.html?page=4

4) http://linuxtips.pbworks.com/w/page/29023300/SystemV%20vs%20Posix%20IPC

ОБНОВИТЬ:

Я прочитал статьи ниже, в которых есть упоминание о множественном увеличении / уменьшении семафора с использованием semop(), но я все еще не смог получить пример / практическое использование того же самого. Статьи для ознакомления:

1) http://kaharris.org/teaching/51081/Assignments/Final/systemV.pdf

Отрывок из статьи: (под заголовком "Пример операций с несколькими семафорами")

"Сила семафоров System V заключается в том, что их можно использовать для атомарной проверки и установки нескольких семафоров за одну операцию".

Он также дал небольшой фрагмент того, как это сделать. Но нет практического использования того же самого.

2) http://www.anirudhtom.com/2011/02/system-v-semaphores-for-babies.html

Автор написал код для многократного увеличения / уменьшения семафора в атомарной операции под названием "РЕАЛИЗАЦИЯ НАБОРА SEMAPHORE". Практическое использование того же самого по-прежнему здесь не упоминается.

3) http://books.google.co.in/books?id=-Mq5ve5KHXQC&pg=PA109&lpg=PA109&dq=system+v+semaphore+multiple&source=bl&ots=SsdKqyG-Kp&sig=Y7AGqHrsOWaOk8EvCX2dH2RqEnA&hl=en&sa=X&ei=RVomVK-pIIuEuwSV0ILwBQ&ved=0CDQQ6AEwBDgU

Отрывок из книги:

"В UNIX System V механизм семафоров вносит некоторые коррективы. Атомность операции сохраняется. Однако добавленное или вычтенное значение операций может быть больше единицы. (Почему? Что использовать?). И даже больше, процессы могут выполнять несколько семафоров. операции одновременно, чтобы избежать проблем взаимоблокировки, когда несколько процессов конкурируют за несколько разных ресурсов одновременно. (Как? Пример?)"

Я надеюсь, что это делает вопрос более ясным.

Пожалуйста, прокомментируйте, если у вас есть какие-либо сомнения по задаваемому вопросу.

Заранее спасибо!

1 ответ

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

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

Надеюсь, это немного прояснит ситуацию.

Другие вопросы по тегам