一.單標誌法
輪流交替使用。
缺點:當有乙個程序不再進入臨界區,便不能修改公共變數的turn,來標識另外乙個程序可以進入臨界區。因此另外乙個程序將永久不能進入臨界區,違背「空則讓進」的原則
a程序
while
(turn != a)
;critical section 臨界區
turn = b
remainder section 剩餘區
b程序while
(turn != b)
;critical section
turn = a
remainder section
二.雙標誌先檢查法
為了解決在單標誌法**現的違背「空則讓進」的原則的問題,增加乙個變數用於檢查對方的狀態。
bool flag[2]
=; flag[a]
==true 表示a正在使用臨界區
flag[b]
==true 表示b正在使用臨界區
a程序while
(flag[b]
==true
); 當b在臨界區便一直迴圈檢查 (1)
flag[a]
=true
; 表示a自己在臨界區域中 (3)
critical section
flag[a]
=false
; 表示a自己退出臨界區
remainder section
b程序while
(flag[a]
==true
); 當a在臨界區便一直迴圈檢查 (2)
flag[b]
=true
; 表示b自己在臨界區域中 (4)
critical section
flag[b]
=false
; 表示b自己退出臨界區
remainder section
優點:不需要交替進入臨界區,可以連續使用
缺點:兩個程序可能會同時進入臨界區,初始狀態,a與b程序均不在臨界區內,所以flag[a]==flag[b]=false,此時按照cpu若按照,(1)(2)(3)(4)的順序進行執行,a,b程序都能檢查到對方不在臨界區中,然後進入臨界區,分別置自己的值為true,但此時臨界區中有兩個互斥的程序,違背「忙則等待」的原則。出現這種問題的原因是:檢查對方的狀態和置自己的狀態這兩步操作之間存在漏洞,不是原子的。
三.雙標誌後檢查法
為了解決在雙標誌先檢查法**現的違背「忙則等待」的原則的問題,雙標誌後檢查法的做法是:首先更改自己的狀態為進入臨界區,然後再檢查對方是否在臨界區中。
flag[2]
=;a程序flag[a]
=true;(
1)while
(flag[b]
==true);
(3)critical section
flag[a]
=false
;remainder section;
b程序flag[b]
=true;(
2)while
(flag[a]
==true);
(4) critical section
flag[b]
=false
;remainder section;
優點:雙標誌後檢查法解決了在雙標誌先檢查法**現的違背「忙則等待」原則的問題。
缺點:可能會造成飢餓現象,違背「有限等待」的原則。
原因:cpu可能是按照(1)(2)(3)(4)的順序執行程式,此時a與b程序均將自己的狀態修改為進入臨界區,此時執行(3)(4),a,b程序均檢查到對方在臨界區中,最終造成飢餓,違背「優先等待」的原則。
四.peterson演算法
為了解決雙標誌後檢查出現的違背「有限等待」的原則,提出了peterson演算法,該演算法基於比較紳士友好的想法,a與b都宣告自己對於臨界區的佔有權flag[a]=true,flag[b]=true,但是它們比較紳士,考慮到雙方都要宣告對臨界區的占用權,最終會爭吵的難分難捨,不分高低。所以雙方都各自非常紳士的說到,雖然我對臨界區有佔有權,但是你要的話可以讓你優先使用,不要客氣,因此設定乙個turn變數表示臨界區讓誰用。
a程序
flag[2]
=;flag[a]
=true
;我有佔有權 turn=b;你先用,不要客氣
while
(flag[b]
==true
&& turn==b)
;critical section
flag[a]
=false
;remainder section
b程序flag[2]
=;flag[b]
=true
;我有佔有權 turn=a;你先用,不要客氣
while
(flag[a]
==true
&& turn==a)
;critical section
flag[b]
=false
;remainder section
優點:peterson演算法完美的遵守了空則讓進,有限等待,忙則等待的原則。但是,當a或b程序其一在臨界區中,而此時處理機排程b或a時,while迴圈進行了忙輪詢,浪費消耗處理機時間,違背「讓權等待」的原則。 程序互斥的軟體實現方法
1.單標誌法 缺點 turn 表示當前允許進入臨界區的程序號,而只有當前允許進入臨界區的程序在訪問了臨界區之後,才會修改turn的值。也就是說,對於臨界區的訪問,一定是p0 p1 p0 p1 這樣輪流訪問。這種必須 輪流訪問 帶來的問題是,如果此時允許進入臨界區的程序是p0,而p0一直不訪問臨界區,...
程序互斥的軟體實現方法
演算法思想 兩個程序在訪冋完臨界區後會把使用臨界區的許可權轉交給另乙個程序。也就是說每個程序進入臨界區的許可權只能被另乙個程序賦予 turn的初值為0,即剛開始只允許0號程序進入臨界區。若p1先上處理機執行,則會一直卡在 直到p1的時間片用完,發生排程,切換p0上處理機執行。不會卡住p0,p0可以正...
互斥 軟體演算法
標籤 空格分隔 作業系統 互斥 軟體方法的實現方式能夠解決併發程序在乙個或者多個共享記憶體的處理器上執行的問題。這些方法通常是基於在訪問記憶體是基本互斥條件的假設。即,儘管訪問的順序沒有具體安排,同時訪問記憶體中的同乙個位址的操作被記憶體仲裁序列化 沒有丟失 此外,沒有考慮硬體 作業系統或是程式語言...