System V 信号量倍增/减量

Posted

技术标签:

【中文标题】System V 信号量倍增/减量【英文标题】:System V semaphore multiple increment/decrement 【发布时间】:2014-11-21 07:58:39 【问题描述】:

我正在阅读 POSIX 和 System V 信号量之间的区别,并且我阅读了一些相同的文章。在每篇文章中都写了这样的声明: “如果您需要在一个步骤中实现具有多个递增-递减的原子操作,则 System V 信号量非常有用。”

我的问题是:

1) 在单个原子操作中需要多次递增/递减吗?可以举个例子解释一下吗?

2) 为什么 semop 允许将值更改为小于 -1 且大于 +1 的值?是否有任何实际用法/示例?

(我知道使用 System V 信号量中的 semop() 函数,我可以使信号量增加或减少一个指定值,而不是信号量数组中的一个信号量,并且不能用 sem_wait() 或 sem_post 完成同样的操作() 的 POSIX 信号量。但是相同的有什么用?)

我看过的文章,供大家参考:

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

2)Differences between System V and Posix semaphores

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 信号量的强大之处在于它们可以用于在一个操作中原子地检查和设置多个信号量。”

他也给出了如何做的一个小sn-p。但没有实际用法。

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

作者在题为“IMPLEMENTING A SET OF 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#v=onepage&q=system%20v%20semaphore%20multiple&f=false

本书摘录:

“在UNIX System V中,信号量机制做了一些调整,操作原子性被保留了。但是操作的加减值可以大于1。(为什么?有什么用?)。而且,进程可以同时执行多个信号量操作,以避免在多个进程同时竞争多个不同资源时出现死锁问题。(如何?示例?)"

我希望这能让问题更清楚。

如果您对所提出的问题有任何疑问,请发表评论。

提前致谢!

【问题讨论】:

【参考方案1】:

多个增量/减量可能很方便的示例:想象某种会议系统,其中视频会话需要一个通道用于视频,另一个用于声音,但其他会话只使用音频通道。为了控制对通道的访问,可以使用信号量。当会话终止时,它应该立即减少它使用的所有信号量,以释放它们用于其他会话。如果这不是原子的,那么视频会议会话可能会在它开始时能够获取音频通道,但为时已晚,无法同时获取视频通道。

您的第二个问题与负载平衡有关。通过允许 [-1..1] 以外的其他值,您可以将信号量值用作队列大小计量器。在上面的会议示例中,如果所有本地通道上的负载都非常重,也许您可​​以将会话重定向到另一个拥有自己通道的不太忙的中继。

希望这能让它更清楚一点。

【讨论】:

您好 Rein,感谢您的回复,但我仍有以下疑问: 1) 如果会话终止,它不应该“增加”信号量吗? (很可能是错字,但只是想指出这一点。) 2)我从您的解释中了解到,多重递增/递减的原子性可以防止出现死锁情况。但是不能通过连续进行 2 次 semop 操作来避免这种情况吗? (以相同的顺序 - 意味着在每个会话中先减少音频,然后减少视频。) 3) 我真的不明白我们如何能够使用信号量来实现负载平衡。据我了解,信号量与任何资源都无关。如果可能,请澄清并提供程序证明。谢谢:)

以上是关于System V 信号量倍增/减量的主要内容,如果未能解决你的问题,请参考以下文章

System V 信号量

进程间通信——System V IPC 之进程信号量

System V 信号量使用相关函数

正确销毁命名的 System V 信号量

linux进程间通讯-System V IPC 信号量

使用 System V 信号量制作聚集/屏障功能