System V信号量多次增加/减少

5
我正在阅读关于POSIX和System V信号量的区别,看了一些相关文章。每篇文章都写道:“如果需要在单个步骤中执行多个增减操作,则使用System V信号量会更加有益。”我的问题是:
1)为什么需要在单个原子操作中进行多个增减操作?您能举个例子来解释一下吗?
2)为什么semop允许将值更改为小于-1和大于+1的值?这样做有任何实际用途或示例吗?
(我知道,在System V信号量的semop()函数中,我可以使信号量数组中的一个或多个信号量按指定值增加或减少,而在POSIX信号量的sem_wait()或sem_post()中则不能这样做。但是这样做有什么用途?)
我阅读的文章如下:
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

作者编写了一个多个信号量原子增减操作的代码,在标题“实现一组信号量”下。然而,其实际使用仍未在此处提及。

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

3) 此链接提供的是有关System V信号量多路复用的书籍内容。

一本书的摘录:
“在UNIX System V中,信号量机制进行了一些调整。操作原子性得以保留。但是,操作添加或减去的值可以大于1(为什么?有何用途?)。而且,进程可以同时执行多个信号量操作,以避免当多个进程同时竞争多个不同资源时出现死锁问题(如何实现?例如?)。”
希望这样更清楚了解问题。
如果您对所提出的问题有任何疑问,请发表评论。
提前致谢!
1个回答

0

多个自增/自减可能非常方便的示例:想象一种会议系统,其中视频会话需要一个通道用于视频和另一个通道用于声音,但其他会话仅使用音频通道。为了控制对通道的访问,可以使用信号量。当会话终止时,它应该立即递减它使用的所有信号量,以将它们释放给其他会话。如果这不是原子操作,则视频会议会话可能在开始时能够抓取音频通道,但可能太迟无法同时抓取视频通道。

您的第二个问题与负载平衡有关。通过允许使用[-1..1]以外的其他值,您可以将信号量值用作队列大小计量器。在上面的会议示例中,如果所有本地通道的负载都很重,请考虑将您的会话重定向到另一个具有自己通道的不那么繁忙的主干线。

希望这使它更清晰一些。


嗨Rein,感谢您的回复,但我仍然有以下疑问: - Sahil
  1. 如果会话终止,它不应该“增加”信号量吗?(很可能是打字错误,但我只是想指出。)
  2. 我从你的解释中理解的是,多个增量/减量的原子性将防止死锁情况。但是通过连续进行2个semop操作也可以避免这种情况吗?(按相同顺序 - 意味着在每个会话中先减少音频,然后再减少视频。)
- Sahil
  1. 我真的不明白我们如何能够使用信号量实现负载均衡。据我所知,信号量与任何资源都没有关系。如果可能,请澄清并给出编程证明。谢谢 :)
- Sahil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接