2014-09-26 17 views
5

我在讀POSIX和System V信號量之間的差異,我讀了一些相同的文章。在每篇文章中,該陳述都寫爲: 「如果您需要以多個增量實現原子操作 - 在一個步驟中遞減,則系統V信號是有益的。」系統V信號量多次遞增/遞減

我的問題是:

1)什麼是在單個原子操作需要多個遞增/遞減?你能用一個例子來解釋嗎?

2)爲什麼semop允許將值更改爲小於-1且大於+1的值?有沒有實際的用法/相同的例子?我知道用系統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

UPDATE:

我已經閱讀了下面的文章,其對利用執行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

作者已經寫爲信號量的多個遞增/遞減一個代碼在一個原子操作的標題下的「實施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系統V,該信號量機制使得一些調整操作原子被保留但是操作的相加或相減的值可以是。 (爲什麼?有什麼用?)甚至更多的進程可以同時執行多個信號量操作,以避免多個進程同時競爭多個不同資源時出現死鎖問題。(如何?實例?)」

我希望,使問題更加清晰。

請評論,如果你有問的問題有任何懷疑。提前

謝謝!

回答

0

例子多重遞增/遞減可能會很方便:想象某種類型的會議系統,視頻會話需要一個視頻通道,另一個需要聲音,但其他會話只使用音頻通道。要控制對通道的訪問,可以使用信號量。當一個會話終止時,它應該立刻減少它使用的所有信號量,以釋放它們以用於其他事務呃會議。如果這不是原子的話,視頻會議會話可能會在開始時抓住音頻通道,但已經太晚而無法獲取視頻通道。

你的第二個問題涉及到負載平衡。通過允許除[-1..1]之外的其他值,可以將信號量值用作隊列大小計。在上面的會議示例中,如果所有本地信道上的負載很重,也許可以將您的會話重定向到另一個擁有自己的信道的不太繁忙的中繼。

希望這可以讓它更清晰一些。

+0

嗨,Rein,感謝您的回覆,但我仍然存在以下疑問: – Sahil 2014-10-13 06:26:27

+0

1)如果會話終止,是不是應該增加信號量? (最有可能是一個錯字,但只是想指出。) 2)我從你的解釋中瞭解到,多次遞增/遞減的原子性可以防止死鎖情況。但是不能通過連續進行2次semop操作來避免這種情況? (按照相同的順序 - 首先遞減音頻,然後遞減每個會話中的視頻。) – Sahil 2014-10-13 06:31:57

+0

3)我真的不明白我們如何能夠使用信號量來實現負載平衡。根據我的理解,信號量與任何資源都沒有關係。請儘可能澄清並提供程序化證明。謝謝 :) – Sahil 2014-10-13 06:35:32