2013-12-18 49 views
3

一般信號量的範圍是什麼。我知道它可以取負值0和1. 負數值表示阻塞隊列中阻塞的進程數。 0表示沒有進程處於阻塞狀態,1表示有一個資源可用,沒有進程搶佔它,我想知道是否有可能具有大於1的值(例如2),它是什麼意思?這是否意味着我們有單個信號量的多個資源?什麼是一般信號量範圍?

+0

查看[here](http://www.greenteapress.com/semaphores/)以獲取有關信號量的全面說明。 –

+0

維基百科文章也有一些很好的解釋http://en.wikipedia.org/wiki/Semaphore_(programming) – nos

回答

4

你應該明確指出你正在談論什麼樣的信號量。 Linux支持內核信號量,POSIX信號量和System V信號量。

該semaphoer值水溼小於0

POSIX信號API文檔「如果SEM被鎖定,則該對象到SVAL點應或者被設置爲系統V信號量API文檔零或一個負數,其絕對值代表在呼叫期間某個非特定時間等待信號量的進程數「。看起來像POSIX信號量的glibc實現不允許信號計數/值降到零以下。

Linux內核信號量曾用於使用負計數跟蹤等待者的實現 - 這是Cesati的「瞭解Linux內核」一書中Bovet &中記錄的實現。然而,在2.6內核的演化過程中(我認爲在2.6.11之後和2.6.32之前的某個時間點),實現發生了變化,所以信號量值不會低於零。

因此,所有信號量都允許大於零的計數,它表示可以同時獲取的一定數量的資源。信號量計數是否可以低於零是一個實現細節 - 只要等待資源與信號量實現相同,這些信號量的行爲與不使計數降至零以下的信號量實現相同。

但是信號數大於1的用例非常少見。正如Linus Torvalds的一個新聞組(http://yarchive.net/comp/linux/semaphores.html)說:

但是,信號的幾乎所有的實際用途是其中計數器被初始化到1的特殊情況 ,並在它們被用作與 簡單互斥在關鍵的 區域中只允許一個用戶。這種信號量通常被稱爲「互斥量」信號量,用於MOLual排除。

我從來沒有見過任何人使用更復雜的 信號量的情況,儘管我知道它可能有用的情況。對於 例如,一個採用更復雜的信號是爲「油門」,其中 你做這樣的事情:

/* Maximum concurrent users */ #define MAX_CONCURRENT_USERS 20 
struct semaphore sem; 

init_sema(&sem, MAX_CONCURRENT_USERS); 

,然後每個用戶確實對信號向下()開始的 操作之前。它不會阻止,直到你有20個用戶 - 你沒有創建一個互斥的 ,但是你創建了一個節流 機制。看到?

+0

是的,因此信號量大於1意味着可以在進程間分派的類似資源的數量,並且不會發生阻塞。這是真的嗎?你的回答非常有幫助。謝謝 – muradin

+0

是的,這就是主意。請記住,這種情況非常不容易 - 絕大多數信號量的使用是互斥的,最大資源數爲1。 –

0

思考信號量的常見方法是用籃子和球類比。如果籃子裏有一個球,那麼這個過程或任務就可以從籃子中拿球,並且可以訪問共享資源或共享執行空間。

enter image description here

獲取從籃球表示遞減計數信號,並且反之亦然,把一個球在籃子爲向上計數信號一個類比。它可以用於互相排斥,同步和其他情況。

對於信號量可以採用什麼值通常沒有具體的限制,它只是整數值,並受平臺的整數實現限制。

它可以取決於您的具體使用情況信號量實際上是否可以達到值> 1,在某些情況下它可以和其他人可以想象信號量不會大於1,但是範圍取決於關於信號量的具體使用。

3

Negative,在信號量上正好有N個線程排隊。

,沒有等待的線程,一個等待操作會把調用線程放入隊列。

正面,沒有等待線程,一個等待操作不會使調用線程排隊。

enter image description here

計數信號量通常被用作在離散量可用資源的警衛。例如,計數器可以表示在循環隊列中使用的槽的數量,生產者線程在將項插入隊列中時將「信號」信號量,消費者線程將「等待」項目出現在隊列中,這將確保否如果沒有可用項目,消費者將能夠從隊列中獲取項目。

最大數量取決於系統。信號量可以使用文件描述符來實現,在這種情況下,應用程序至少可以打開{OPEN_MAX}個文件和信號量。 cat /proc/sys/fs/file-max

+0

我非常感謝你的概念答案。但邁克爾伯爾的回答更具技術性,我應該接受它。謝謝。 – muradin

0

它稱爲一個計數信號:

您可以通過在系統上查看當前值。 例如: - 您擁有共享內存的關鍵部分,並且您已將計數信號量初始化爲10,這意味着一次只有最多10個進程才能進入關鍵部分進行讀取。 並寫入臨界區使用二進制信號量,並使用上述和二進制信號量的組合來讀取區域。

例如: - 當寫入遞減二進制信號量計數器爲0和讀取過程將只檢查二進制信號量計數器如果(0)等待如果(1)準備好讀取。