臨界區互斥

2021-09-13 13:06:56 字數 1587 閱讀 8824

在考慮寫**之前應該先考慮我們要用什麼資料結構?以及該資料有什麼意義。

p0:

p1:

在這裡,為了實現互斥使用了乙個共享變數turn。

為什麼有效?

在任意時刻turn的取值只能為0或1.因此條件while(turn != x)有且僅有乙個會被滿足,因而使得乙個程序得以訪問臨界區。(至於turn被誰修改,什麼時候修改,都不會對該過程產生不利影響)
有什麼不足?

乙個識別符號只有2個資訊。它只能表示1.p0幹完了.2.p1幹完了。 所以當p0幹完了,p1又不幹活的時候,p0還傻傻的等p1
turn表示什麼?

turn其實是程序間約定的執行順序。2個程序約好輪班工作,乙個在幹完活了通知另乙個,反覆交替。turn可以理解為許可證,只有持有turn的程序才能進去工作。就好像看病取票排隊一樣。
p0:

p1:

這是乙個典型的錯誤方法。

為什麼出錯?busy表示什麼?

busy像是一扇大門,先進去的人從裡面反鎖不讓外面的人進來。裡面的人出來以後再重新開門。但是busy也只有2個資訊量,也就是開和關。當它開門的時候無法控制進入的數量。所以極有可能一下子進去好多人。
但是它解決了前面的乙個問題:無法「空閒讓進」。

p0:

p1:

flag是什麼?

首先看迴圈等待條件flag[1]&&turn != 1,對其取反即為通過條件!flag[1]||turn==1。因此進入臨界區的條件是獲得許可(turn==1)或者p1空閒(!flag[0])。flag為0表示程序很空,flag為1表示想要進入臨界區(不一定進入)。這裡可以形象地理解為2個程序都盯著對方,一旦對方空了下來,就馬上衝過去。
這裡的turn有點不一樣!

這裡不再是輪班工作了。而是在表達完進入的意願後(flag置1)將turn設為自己。說白了就是爭奪模式。最後只有乙個程序搶到turn,另一就等待對方空閒退出。
這個演算法其實也不太完美,通過以上分析很容易就能知道它只允許2個程序的併發。

警告:該演算法自創,將來程式出了差錯,我是不會負責的

結合一下前面幾種方法,盡可能地減少資訊量,還要解決多程序的併發問題。現在再整理一下思路。首先,需要乙個大門。然後門後面需要取票排隊。

pi:

// critical section

flag=0;// 退出區

// remainder section

}

如何工作?

利用flag控制大門開關。當裡面沒人時,馬上進入,進去後就趕緊把門反鎖(flag=1)。此時是有可能多個程序同時溜進去的,怎麼辦呢?划拳把!(turn=i)總之不管怎麼樣,最後turn為這幫人中的某乙個,因此有且僅有乙個得以進入,其他的則被轟出門外重新尋找機會。

臨界區的硬體互斥方案

臨界區互斥的硬體解決 基本硬體機制包括禁止中斷 test and set指令 swap指令。1 禁止中斷 這是最簡單的方法,程序一旦進入臨界區就禁止一切中斷,在離開臨界區前放開中斷,但是該方案有如下致命的弱點 將禁止一切中斷的權利賦予普通使用者,若使用者沒有開放中斷,系統的正常執行將受到影響。不適合...

臨界區 互斥 訊號量

引言 臨界區 互斥 訊號量都是在併發執行中,對資源的訪問進行控制的方式。在本文中,資源即為 1 臨界區 臨界區即獨佔式資源,在多執行緒中,有且只有乙個執行緒可以訪問臨界區。例1 多個執行緒做同樣的一件事 列印檔案a。定義臨界區 初始化臨界區 執行緒a主程式 例2 多個執行緒列印不同的檔案。定義臨界區...

臨界區的硬體互斥方案

臨界區互斥的硬體解決 基本硬體機制包括禁止中斷 test and set指令 swap指令。1 禁止中斷 這是最簡單的方法,程序一旦進入臨界區就禁止一切中斷,在離開臨界區前放開中斷,但是該方案有如下致命的弱點 將禁止一切中斷的權利賦予普通使用者,若使用者沒有開放中斷,系統的正常執行將受到影響。不適合...