我读了POSIX和System信号量之间的区别,我读了一些关于同样的文章。在每一篇文章中,这条语句都是这样写的:“如果您需要在一个步骤中实现多个增量--递减--那么System信号量是有益的。”
我的问题是:
1)在一个原子操作中,有什么必要进行多次增量/递减?你能举个例子解释一下吗?
2)为什么semop允许将值更改为小于-1且大于+1的值?是否有任何实际的用法/例子?
(我知道,使用System信号量中的semop()函数,我可以使信号量在信号量数组中增加或减少一个以上的指定值& POSIX的sem_wait()或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信号量的威力在于,它们可以用于在一次操作中原子地检查和设置多个信号量。”
他也给出了一个关于如何做这件事的小片段。但没有实际使用相同的。
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
这本书的节选:
在UNIX系统V中,信号量机制进行了一些调整。操作原子性被保留。然而,操作的加减值可能大于一个。(为什么?有什么用?)更重要的是,当多个进程同时争夺多个不同的资源时,进程可以同时执行多个信号量操作,以避免死锁问题。(如何?举个例子?)
我希望这使问题更加明确。
如果你对所提问题有任何疑问,请发表评论。
提前感谢!
发布于 2014-10-12 16:05:04
例如,多个增量/递减可能很方便:想象一下某种会议系统,在这种系统中,视频会话需要一个视频通道,另一个需要声音通道,但其他会话只使用音频通道。要控制对通道的访问,可以使用信号量。当一个会话终止时,它应该立即减少它使用的所有信号量,以便将它们释放给其他会话。如果这不是原子化的,那么视频会议会议可能会在它开始时,能够捕获音频频道,但也太晚了,无法获取视频频道。
第二个问题与负载平衡有关。通过允许-1.1以外的其他值,您可以使用信号量值作为队列大小计。在上面的会议示例中,如果所有本地通道的负载都很重,也许您可以将您的会话重定向到另一个较少繁忙的主干道上。
希望这能让事情更清楚些。
https://stackoverflow.com/questions/26057316
复制相似问题