互斥 軟體演算法

2021-08-10 10:02:57 字數 1250 閱讀 8101

標籤(空格分隔): 作業系統 互斥

軟體方法的實現方式能夠解決併發程序在乙個或者多個共享記憶體的處理器上執行的問題。這些方法通常是基於在訪問記憶體是基本互斥條件的假設。即,儘管訪問的順序沒有具體安排,同時訪問記憶體中的同乙個位址的操作被記憶體仲裁序列化(沒有丟失)。此外,沒有考慮硬體、作業系統或是程式語言的支援(相對通用)。

boolean flag[2];             //這裡用兩個程序舉例,有兩個flag

int turn;

void p0()

}/*critical section*/;

turn = 1;

flag[0] = false;

/*remainder*/;

}}void p1()

}/*critical section*/

turn = 0;

flag[1] = false;

/*remainder*/;

}}void main()

臨界區:任何不想或不能被多個程序「同時」執行(單處理器的巨集觀同時或多處理器的同一時間)的**片段。為了保證某個程序對某個資源的使用過程的連續性。特定臨界區的**任何時刻最多只能有乙個程序在執行。

函式p0、p1用來模擬兩個程序。

每個程序在進入臨界區前,先宣告自己想進入,即將自己的flag變數置1。然後檢查別的程序是否想進入臨界區(檢查別人的flag是不是1)。如果也有其他程序想訪問臨界區,那麼檢查仲裁變數turn,如果turn不歸自己,就撤銷自己的宣告(flag清零)並等待turn;如果turn歸自己,並且別人已經從臨界區退出了,那麼自己進入臨界區。退出臨界區是把turn給別人,並撤銷自己的flag。

設計互斥演算法的難點在於任何兩個指令之間都有可能發生程序切換。

boolean flag[2];

int turn;

void p0()

}void p1()

}void main()

peterson演算法比較好理解。

對於每乙個程序都有自己的flag。整個系統有乙個turn變數。每個程序想要進入臨界區都要先經過兩個步驟:1.將自己的flag置一 2.將turn置成自己的序號。然後進行判斷:如果存在其他程序的flag為一(這表明別的程序也在試圖進入臨界區)而且turn為自己所置的序號(說明自己是此刻最後修改turn的程序)那麼就忙等待。

問題來了:作業系統精髓與設計原理(p506)這本書上說這個演算法很容易擴充套件到多個程序的情況,怎麼辦?

軟體方法實現互斥

一.單標誌法 輪流交替使用。缺點 當有乙個程序不再進入臨界區,便不能修改公共變數的turn,來標識另外乙個程序可以進入臨界區。因此另外乙個程序將永久不能進入臨界區,違背 空則讓進 的原則 a程序 while turn a critical section 臨界區 turn b remainder s...

演算法 互斥集合

表示互斥集合 disjoint set 時,經常會使用另一種具有獨特形態的樹結構 並查集 union find 資料結構。互斥集合 假設有n名客人參加聚會,主持人要求相同生日的人組成一隊。話音剛落,客人們立刻開始組隊。剛開始時,因為不知道哪位客人的生日與自己的生日相同,所以大家只能單獨徘徊。不過,只...

程序互斥的軟體實現方法

1.單標誌法 缺點 turn 表示當前允許進入臨界區的程序號,而只有當前允許進入臨界區的程序在訪問了臨界區之後,才會修改turn的值。也就是說,對於臨界區的訪問,一定是p0 p1 p0 p1 這樣輪流訪問。這種必須 輪流訪問 帶來的問題是,如果此時允許進入臨界區的程序是p0,而p0一直不訪問臨界區,...