System V信号量多次递增/递减

时间:2014-09-26 10:20:30

标签: c linux semaphore sysv-ipc

我正在阅读POSIX和System V信号量之间的区别,我也阅读了一些文章。在每篇文章中都写了这样的陈述: “如果你需要在一个步骤中实现具有多个递增 - 递减的原子操作,那么System V信号量是有益的。”

我的问题是:

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

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

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

我读过的文章供您参考:

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

他还提供了一小部分内容。但没有相同的实际用法。

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

作者在原子操作中编写了一个代码,用于在“实现一组SEMHHORE”标题下多次递增/递减信号量。这里仍然没有提到它的实际用法。

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 个答案:

答案 0 :(得分:0)

多个递增/递减可能很方便的示例:喜欢某种会议系统,其中视频会话需要一个频道用于视频而另一个用于声音,但其他会话仅使用音频频道。要控制对通道的访问,可以使用信号量。当一个会话终止时,它应该立即减少它使用的所有信号量,以便为其他会话释放它们。如果这不是原子的,那么视频会议可能会在启动时抓住音频频道,但也太迟而无法获取视频频道。

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

希望这会让它更清晰。