5

我正在阅读 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) 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

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

书中的一段摘录:

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

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

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

提前致谢!

4

1 回答 1

0

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

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

希望这使它更清楚一点。

于 2014-10-12T16:05:04.840 回答