一、進程一般分爲三個狀態:運行態、就緒態和阻塞態。三種狀態之間的相互轉換以下圖所示:spa
當調度程序選擇了另外一個進程時,當前運行的進程由運行態轉化爲就緒態;指針
當調度程序選擇了一個就緒狀態的進程時,該進程右就緒態轉化爲運行態;隊列
當前運行進程等待某事件時,由運行態轉化爲阻塞態。進程
當等待的事件發生時,由阻塞態轉化爲就緒態。事件
二、信號量概念:資源
信號量是最先出現的用來解決進程同步與互斥問題的機制。 同步
信號量(Saphore)由一個值和一個指針組成,指針指向等待該信號量的進程。信號量的值表示相應資源的使用狀況。信號量S>=0時,S表示可用資源的數量。執行一次P操做意味着請求分配一個資源,所以S的值減1;當S<0時,表示已經沒有可用資源,S的絕對值表示當前等待該資源的進程數。請求者必須等待其餘進程釋放該類資源,才能繼續運行。而執行一個V操做意味着釋放一個資源,所以S的值加1,若此時S<=0,表示有某些進程正在等待該資源,所以要喚醒一個等待狀態的進程,使之運行下去。請求
注意,信號量的值只能由PV操做來改變。程序
三、關於PV操做容易產生的一些疑問:im
1,S大於0那就表示有臨界資源可供使用,爲何不喚醒進程?
S大於0的確表示有臨界資源可供使用,也就是說這個時候沒有進程被阻塞在這個資源上,因此不須要喚醒。
2,S小於0應該是說沒有臨界資源可供使用,爲何還要喚醒進程?
V原語操做的本質在於:一個進程使用完臨界資源後,釋放臨界資源,使S加1,以通知其它的進程,這個時候若是S<0,代表有進程阻塞在該類資源上,所以要從阻塞隊列裏喚醒一個進程來「轉手」該類資源。好比,有兩個某類資源,四個進程A、B、C、D要用該類資源,最開始S=2,當A進入,S=1,當B進入S=0,代表該類資源恰好用完, 當C進入時S=-1,代表有一個進程被阻塞了,D進入,S=-2。當A用完該類資源時,進行V操做,S=-1,釋放該類資源,由於S<=0,代表有進程阻塞在該類資源上,因而喚醒一個。
3,若是是互斥信號量的話,應該設置信號量S=1,可是當有5個進程都訪問的話,最後在該信號量的鏈表裏會有4個在等待,也是說S=-4,那麼第一個進程執行了V操做使S加1,釋放了資源,下一個應該可以執行,但喚醒的這個進程在執行P操做時因S<0,也仍是執行不了,這是怎麼回事呢?
當一個進程阻塞了的時候,它已經執行過了P操做,並卡在臨界區那個地方。當喚醒它時就當即進入它本身的臨界區,並不須要執行P操做了,當執行完了臨界區的程序後,就執行V操做。
4,S的絕對值表示等待的進程數,同時又表示臨界資源,這究竟是怎麼回事?
當信號量S小於0時,其絕對值表示系統中因請求該類資源而被阻塞的進程數目.S大於0時表示可用的臨界資源數。注意在不一樣狀況下所表達的含義不同。當等於0時,表示恰好用完。