信號量機制的提出,是爲了解決進程間關係通訊的問題,由於進程間不可能用嘴來講「我在使用這個資源啊,你先等我用完再用」,或者說「我用完了,接下來輪到你了!」這是咱們人之間通訊的方式,那麼現實中如何讓某個進程知道,本身暫時不能用哪一個資源或能夠用哪一個資源呢?web
好比在火車上上廁所,假設有個空廁所,門上顯示器寫着"無人",當我進去把門鎖上後,門上顯示變爲"有人",這樣後來者看到門上顯示"有人"就會在外等待而不會冒然闖進來。svg
這就是用到信號量的機制,其中門上的顯示器就扮演了"信號量"的角色,在計算機中,咱們稱這是進程互斥。固然,進程間關係還不止互斥。xml
首先有幾個概念咱們要先了解隊列
一段時間內只容許一個進程訪問的資源稱爲臨界資源或獨佔資源。
好比打印機,上文咱們提到的廁所,只能你一我的用,不能多人同時用。進程
進程中訪問臨界資源的那段代碼稱爲臨界區。
這個容易理解,我有一段代碼,其中調用打印機的那段代碼塊,就是臨界區。資源
爲使多個進程互斥地訪問某臨界資源,須爲該資源設置互斥信號S,並設其初始值爲1,而後將各進程訪問資源的臨界區置於p操做和v操做之間便可。同步
P操做是申請使用資源的操做,假設我要使用打印機了,就進行P(S),這樣以後,S的值就會減1變成0,S的值爲0表示打印機也就是資源不可用。it
若是另外一我的要使用也是先進行P(S),因爲S爲0資源還不能用,這樣S的值會變成-1,表示他暫時沒能使用而在排隊,信號量S爲負數時其絕對值表示阻塞隊列中等待該資源的進程數。class
若是沒人在排隊,當我用完打印機後就執行V操做,V操做表示釋放資源,V(S)就讓信號量S由0加1變成了1,這樣後來者就能夠用打印機了。
如有1人在排隊,那S就變0,這個後來者直接使用打印機,使用完後再V操做,S會變1。變量
兩進程協做完成一件事,咱們叫同步。
設有a,b兩進程共用一個變量x,a負責算數獲得x的結果,而後把結果傳給b,b負責把結果x打印出來。這裏咱們須要兩個信號量S1,S2,初值爲1,0。(S1給a用,S2給b用)
要完成此次任務
執行P(S1)→獲得結果→V(S2)→P(S2)→打印結果→V(S1)
P(S1)表示a進程要工做了,把它對應的信號量S1置0,表示a進程不可用正在工做中。 獲得結果後,V(S2)把S2置1,表示b能夠開始工做。 P(S2)表示b進程要工做了,把它對應的信號量S2置0。 打印出結果後,V(S1)講S1置1,表示任務完成,a進程能夠開始下一輪的工做了。