各位看官們,大家好,上一回中咱們說的是進程間同步與互斥的例子,這一回咱們說的例子是:使用信號量進行進程間同步與互斥。閒話休提,言歸正轉。讓我們一起talk C栗子吧!
看官們,信號量是由著名計算機科學家迪傑斯特拉(Dijkstra)提出的一種概念,專門用來解決進程間同步與互斥。在他提出的概念中信號量是一個非負整數值.
信號量的操作只能有兩種原子操作:
等待信號; 發送信號。“什麼是原子操作呢?”台下有看官在提問,原子操作就是指某個動作在運行時不能被其它動作中斷,它會一直進行,直到該動作運行完成為止。比如,我們在寫代碼的時候,突然收到一封郵件,這時候系統會暫時中斷寫代碼的程序vim(我用的是vim),然後讓郵箱客戶端發一個收到郵件的通知,然後再恢復到vim寫代碼的動作中。例子中使用vim寫代碼的動作就不是一個原子操作,只有它不能被其它動作中斷時,它才是一個原子操作。接下來我們介紹對信號量的原子操作。
等待信號也叫P操作。例P(sem)表示對信號量sem進行P操作。
如果sem的值大於零,p操作會把sem的值減去1; 如果sem的值等於零,那麼掛起執行p操作的進程;發送信號也叫V操作。例如V(sem)表示對信號量sem進行V操作。
如果有進程在因為等待sem而被掛起,那麼喚醒等待的進程;如果沒有進程因為等待sem而被掛起,那麼把sem的值加上1.下面是使用信號量進行進程同步與互斥的偽代碼:
nocritical code //非臨界區的代碼
P(sem); //執行P操作,進入臨界區,執行臨界區中的代碼
{
critical code; //臨界區代碼
do something
}
V(sem); //執行V操作,離開臨界區
nocritical code //非臨界區的代碼
假設上面偽代碼中的信號量sem值為1,進程A開始執行上面的偽代碼,在進入臨界區前先對信號量進行P操作,這時sem的值變為0,然後進程A執行臨界區中的代碼,這個時候進程B也開始執行上面的偽代碼,在進入臨界區前先對信號量進行P操作,這時進程A還沒有離開臨界區,信號量sem的值為零,進程B就會被掛起,直到進程A離開臨界區執行V操作時,sem的值變為1,然後喚醒等待sem的進程B,接著進程B進入臨界區並且執行臨界區中的代碼。
大家可以看到,通過信號量的P/V操作,可以保證在同一個時間內,只有一個進程在執行臨界區中的代碼,也就是說實現了進程的同步與互斥。
看官們,本章回中就不寫代碼了,因為我們還沒有介如何使用信號量,在後面的章回中,我們會介紹信號量的操作,並且結合具體的例子,把偽代碼轉換成實際的代碼。
各位看官,關於使用信號量進行進程間同步與互斥的例子咱們就說到這裡。欲知後面還有什麼例子,且聽下回分解 。