2012-05-03 62 views
3

我閱讀有關「操作系統概念」信號燈(對於那些你們誰知道),我想我完全瞭解信號燈,直到我讀到這樣一段話:瞭解信號燈

信號燈的重要方面它們是以原子方式執行 。我們必須保證沒有兩個進程可以同時執行等待 和對同一信號量的信號操作。

而且也:

如果硬件不提供任何特殊的原子操作,我們 可以使用任何的軟件解決方案的關鍵部分 問題,其中的關鍵部分包括等待和信號 程序。

這段話是指面對SignalWait的操作必須是原子的。 我認爲信號量的全部目的是讓任何時候只有一個進程在關鍵部分 - 如果我必須使用另一種算法(如麪包店算法),爲什麼我還需要信號量?

我意識到我的問題可能會讓人困惑。如果是這樣,那只是因爲這個話題對我來說依然模糊,所以即使提出一個問題也有點困難。

很想讀任何澄清...

回答

4

我認爲你遇到了信號量和互斥量之間的區別。二進制信號量可以像互斥體一樣實現,但它們實際上是爲了不同的目的。信號量保護資源,而互斥量嚴格保護一段代碼。區別通常是微妙的。

隨着信號量的進入,像計算信號量這樣的變化,所以只有一個進程可以訪問資源的想法並非總是如此。您可能想要阻止對一個進程或線程的寫入,但允許從多個(讀取器/寫入器鎖定)讀取。

我建議你看看關於這個主題的維基百科文章。其實相當不錯。
http://en.wikipedia.org/wiki/Semaphore_(programming)

1

這是在談論信號燈的實現,而不是它們的使用。如果硬件支持像信號量這樣的原子操作,當用戶調用Signal/Wait時,它們將被使用。如果硬件不支持它,信號量實現本身會找到其他方法來確保相同的功能。

這對用戶是透明的,只是在調用SignalWait時沒有這種支持的系統會花費更長的時間。 (另外,如果不是所有的現代硬件平臺,大多數都支持信號量的原子操作。)

如果你想互斥,你用來獲取它的機制必須是原子的。

3

原子性是你如何實現互斥。假設您一次只需要一個線程進入代碼的關鍵部分。你是怎樣做的?那麼,你有一個「鎖定/解鎖」指標。並且你強制一個線程在它進入代碼的關鍵部分之前將指示器從「解鎖」改變爲「鎖定」。

但是,當兩個線程都看到指示器被「解鎖」,同時將其切換爲「鎖定」,然後同時執行代碼的關鍵部分時,什麼都停止了?答案是,從「解鎖」切換到「鎖定」的操作必須是原子操作。也就是說,它必須一次全部發生,所以兩個線程都無法成功地將指示器更改爲「鎖定」。

+1

看看有什麼困惑我的是,你建立一個鎖,然後您「鎖上的鎖」 ... – yotamoo

-3

我在課堂上向同學提出了同樣的問題,他的回答是「把信號量當作錘子,一旦你有了錘子,就可以用它做很多事情,而用原子支持彼此排斥的硬件或軟件解決方案(如Peterson或Bakery)受到限制「。

0

信號燈壯漢想想在夜總會。俱樂部一次允許有一定數量的專用人員。如果俱樂部已滿,則不允許任何人進場,但一旦有人離開另一人可能進場。

這只是一種限制特定資源消費者數量的方法。例如,限制應用程序中同時調用數據庫的次數。

Source: