什麼是進程互斥?
所謂進程互斥,就是對於系統的某種資源,若一個進程正在訪問它,其他進程必須等待,不能同時使用。這是一種源於資源共享的制約關係,也稱爲間接制約關係。
接下來,我們來簡要的瞭解一下幾個概念:
-
這種限定資源只能排他性的訪問的資源叫做臨界資源。
-
程序中訪問臨界資源的那段代碼稱爲臨界區或臨界段。
如何實現進程互斥?
爲實現對臨界資源的互斥訪問,應保證諸進程互斥的進入各自的臨界區。在操作系統中,最早採用軟件的方法,後來常採用硬件指令或者在系統中設置專門的同步機構方法。這些方法共同形成臨界區的使用原則:
(1)當臨界區空閒時,必須讓一個要求進入臨界區的進程立即進入,以有效的利用資源;
(2)當臨界區已經有進程進入時,其他試圖進入臨界區的資源必須等待,以保證互斥地進入臨界區;
(3)對於要求進入臨界區的進程應在有限的時間內使之進入,以免陷入“死等”;
(4)等待進入臨界區的進程必須立即釋放CPU,以免“忙等”。
上鎖與開鎖是一種最簡單的進程互斥方法。它使用一個變量“W”來表示某種臨界資源的狀態。若W=1,表示資源已經被使用,若W=0,表示資源可用。一般將上鎖與開鎖原語設置在臨界區相應的程序段前後。
舉個栗子:
甲進程:
其他代碼:
LOCK(W);
甲進程的臨界區;
UNLOCK(W);
其他代碼;
進程進入臨界區之前應該測試W的值,若W=1,資源被佔用,則應返回測試;若W=0,即資源可用,則在進入臨界區前爲防止其他進程進入二給資源上鎖,將W置爲1。用完資源退出前,給資源解鎖,使W=0。
但是有沒有想過,如此簡單的條件測試有可能會導致CPU“忙等”?於是就有了信號量機制的產生。