linux中支援很多標準,關於訊號量(semaphore )有二種標準給予支援,有posix sem和system V sem ,你要問這是什麼東東,那你就去自己baidu一下了,要多活動一下自己的筋骨曉得不 ^_^
首先,我們來說說這二種sem的區別:
posix
1、不能在多個(無關係的)進程間使用
2、只是一個訊號量
system V
1、可在多個無關的進程間使用
2、是一個訊號量集
還有就是 posix sem操作簡單 而system V相對要複雜得多。OK,我們這裡主要要說的是posix sem下的二值訊號量的處理問題:
訊號量機制
1965年,荷蘭學者提出了利用訊號量機制解決進程同步問題,訊號量正式成為有效進程同步工具,現在訊號量機制被廣泛的用於單處理機和多處理機系統以及電腦網路中。
訊號量S是一個整數,S大於等於零時代表可供並發進程使用的資源實體數,但S小於零時則表示正在等待使用臨界區的進程數。
Dijkstra同時提出了對訊號量操作的PV原語。(這裡為什麼是PV二字母喃 ,原來是這個荷蘭學者英語學得和我一樣差 ???還是和我一樣愛國???以至於只能用本國的意思和 wait post這二單詞意思差不多的二個以p v 開頭的單詞 )呵呵
P原語操作的動作是:
(1)S減1;
(2)若S減1後仍大於或等於零,則進程繼續執行;
(3)若S減1後小於零,則該進程被阻塞後進入與該訊號相對應的隊列中,然後轉進程調度。
V原語操作的動作是:
(1)S加1;
(2)若相加結果大於零,則進程繼續執行;
(3)若相加結果小於或等於零,則從該訊號的等待隊列中喚醒一等待進程,然後再返回原進程繼續執行或轉進程調度。
PV操作對於每一個進程來說,都只能進行一次,而且必須成對使用。在PV原語執行期間不允許有中斷的發生。
二值訊號量:是指 只有0 和 1 這二個值的訊號量 也就是說初始值是1或0 我們這裡假定 初始值是1 那麼 當對其進行wait操作的時候,此值就減一為0了 那麼就會阻塞所有的當前進程中的其它的訊號 和 訊號量;等待post 的到來 ,當post到來後,就釋放掉了阻塞,其它的操作就可以運行了。這種方法常常用來實現一個臨界區的原子執行,有關原子 執行的概念請看我前面的文章,把想要進行原子操作的代碼放到 wait和 post之間,就不會受到其它訊號或其它進程或線程對其所作的影響了,這也相當於互斥操作。