日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[OS复习]进程互斥与同步2

發布時間:2025/3/15 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [OS复习]进程互斥与同步2 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
互斥與同步的解決策略 當前,利用軟件方法、硬件方法、信號量方法、管程方法、消息傳遞方法都可以有效地解決進程間的互斥與同步,其中信號量的方法更具有優勢(目前已經通用)。

1. 軟件方法:

軟件方法是指由進程自己,通過執行相應的程序指令,實現與別的進程的同步與互斥,無須專門的程序設計語言或操作系統的支持。實踐證明,該方法很難正確控制進程間的同步與互斥,而且可能會大大地增加系統的額外開銷。?

軟件解決方法有很多種,比較有代表性的軟件方法有荷蘭數學家Dekker提出的Dekker算法和科學家G.L.Peterson提出的Peterson算法。為了說明設計并發程序時可能出現的典型錯誤,下面以Dekker算法為例,分析如何設計并改進一個互斥算法的過程。

1.1 初步設想

suppose1:控制兩個進程互斥進入臨界區,可以讓兩個進程輪流進入臨界區。
suppose2:當一個進程正在臨界區執行時,另一個進程就不能進入臨界區,而在臨界區外等待。

評價 1.該方法可以保證互斥。【相互依賴對方賦予使用的權限】 2.會造成忙等現象,此時互斥的進程并不是處于阻塞狀態,而是在不斷的循環檢測。 3.進程嚴格交替進入臨界區。如果進程需要多次使用臨界區,那么使用臨界區頻率低的進程嚴重制約著使用臨界區使用頻率高的進程的執行。【也就是說,如果不交替執行一次,A進程無法持續的推進】 實例 suppose:P0需要每10分鐘使用一次臨界區,P1需要每1分鐘使用一次臨界區。
A. 假設turn的初值為0,進程P0正好先請求進入臨界區,并成功進入臨界區執行,這時,如果P1申請進入臨界區,循環檢測turn=0,不可以進入,只能“空”循環,等待。
B. 當P0退出臨界區時,修改turn的值為1。P1循環檢測到turn = 1時,就可以進入臨界區執行,退出臨界區時,修改turn=0。
C. 根據假設,P1很快又需要進入臨界區,但是P0卻只能在10分鐘之后,按照turn規定的順序,進入臨界區執行,退出時修改turn=1。
即P1必須在臨界區空閑的情況下,等待10分鐘,才能使用臨界區。這不符和互斥原則,降低了系統性能。

1.2 第一次改進

可以為臨界區設置一個狀態標志,標明臨界區是否可用。當臨界區空閑時,任何一個進程都能進入,但此時必須修改臨界區標志為“被占用”,別的進程就不能進入臨界區。當臨界區使用完畢,必需修改該標志為“空閑”。
這樣就不再使諸進程嚴格交替使用臨界區,而且,如果某進程在臨界區外失敗,也不會影響其它進程。其算法描述如圖所示:


分析: 1. 如果進程在臨界區外失敗,其他進程不會阻塞。
2.?問題1:“忙等” 3.?問題2:若進程在臨界區內失敗且相應的flag為true,則其他進程永久阻塞。 4. 問題3:不能保證進程互斥進入臨界區。試按以下順序執行:

1.3 第二次改進

互斥算法的第一次改進不能實現 “互斥” 。因為,進程首先檢測臨界區狀態,若“被占用”,則“忙等”,否則就直接進入臨界區。從而,可能出現同時進入臨界區的現象。能否讓進程預先表明“希望進入臨界區的態度”,然后,再檢測臨界區狀態。第二次改進。

分析: 1.?假設P0需要進入臨界區,首先執行flag[0]:=true,再執行while flag[1],若P1正在占用臨界區,則P0忙等;否則,P0進入臨界區。 2.?但是,如果此時P1未占用臨界區,而與P0幾乎同時需要使用臨界區,如下圖示:

1.3?第三次改進

互斥算法的第二次改進可能導致死鎖,因為P0、P1都“堅持自己的權利,執意進入臨界區,且互不謙讓”。可以考慮,允許進程既表明需要進入臨界區的“態度”,又能相互“謙讓”。即首先表示自己需要使用臨界區,再檢測臨界區的狀態,若臨界區“被占用”,可以等一小段時間再申請。算法如圖所示:

分析: P0、P1的“謙讓”可能使它們都不能進入臨界區。這種現象不是死鎖,因為這種僵局不會是永久行為,某一時刻可能會自動解除。但是,這種現象也是不希望出現的。

1.4?Dekker互斥算法?

該算法既允許進程“謙讓地”申請進入臨界區,又通過給定序號避免“過分謙讓”。偽代碼描述如下:

1.5?Peterson互斥算法

分析P0的執行:
置flag[0]:=true;{阻止P1進入臨界區}
執行while flag[1]
?false, P0進入臨界區,執行完成,置
? ? ? ? flag[0]:=false;
?true, P0循環等待,只要P1退出,即可 ? ??
? ? ? ? ?進入

2. 硬件方法:

為了解決軟件方法存在的不足,有人提出了硬件解決方法,通過屏蔽中斷或采用專門的機器指令控制同步與互斥。與軟件解決方法比較,這種方法減少了系統額外開銷,但由于需要太強的硬件約束條件,以及可能導致進程饑餓與死鎖現象,一直沒有成為通用的解決方法。?
采用軟件方法實現進程互斥使用臨界資源是很困難的,它們通常能實現兩個進程的互斥,很難控制多個進程的互斥。算法設計需要非常小心,否則可能出現死鎖,或互斥失敗等嚴重問題。軟件方法始終不能解決“忙等”現象,降低系統效率。硬件方法包括屏蔽中斷和專用機器指令。

2.1 屏蔽中斷

由于進程切換需要依賴中斷來實現,如果屏蔽中斷,則不會出現進程切換。
因此,為了實現對臨界資源的互斥使用,可以在進程進入臨界區之前,屏蔽中斷,當進程退出臨界區時,打開系統中斷。中斷被屏蔽以后,系統時鐘中斷也被屏蔽。處理機將不會被切換到其他進程。于是,一旦屏蔽中斷,進程就可以檢查和修改共享內存區中的數據,而不必擔心其他進程介入。其偽代碼如下:
repeat
<屏蔽中斷>;
<臨界區>;
<打開中斷>;
<其余部分>
forever.
分析: 這種方法約束條件太強,付出的代價太大;因為中斷被屏蔽以后,系統將無法響應任何外部請求,也不會響應當前執行進程的任何異常及系統故障,嚴重地降低了處理機性能。這種方法僅對單處理機系統有效,如果系統有兩個或多個共享內存的處理機,屏蔽中斷僅僅對執行本指令的處理機有效,其它處理機仍將繼續運行,并可以訪問共享內存空間。

2.2?專用機器指令

利用一些專用機器指令也能實現互斥,機器指令在一個指令周期內執行,不會受到其它指令的干擾,也不會被中斷。Test and Set指令就是較常用的一種機器指令,其定義如下:?
function testset ( var i:integer ) : boolean ;beginif i = 0 thenbegini := 1;testset := true;endelse testset :=false;end.program mutualexclusion; const n=…; /*進程數*/ var bolt:integer; procedure P(i:integer); beginrepeat repeat {nothing} until testset (bolt);<臨界區>;bolt :=0;<其余部分>forever end; begin /* 主程序*/bolt :=0;parbeginP(1);P(2);…P(n)parend end.

2.3?exchange指令

procedure exchange ( var r :register; var m :memory ); var temp; begintemp := m;m := r;r := temp; end. program mutualexclusion; const n=…; /*進程數*/ var bolt:integer; procedure P(i:integer); var key:integer; beginrepeatkey:=1;repeat exchange(key,bolt) until key=0;<臨界區>;exchange(key,bolt);<其余部分>foreverend; begin /* 主程序*/bolt :=0;parbeginP(1);P(2);…P(n)parend end.

2.4?機器指令優點

非常簡單,易于證明;同時適合于單處理機系統和共享內存的多處理機系統中多個進程的互斥;可以分別為臨界區設置屬于它自己的變量,以實現對多個臨界區的互斥訪問。
“忙等” 現象仍然存在。進程都需要循環檢測,等待時機進入臨界區。但是,由于采用了機器指令,這種“忙等”消耗的機器時間比軟件方法小,屬于“可接受的忙等”。可能出現饑餓現象。當臨界區空閑時,執行循環檢測的若干等待進程能進入臨界區的機率是相等的,有的進程可能“運氣”非常不好,很難有機會進入臨界區,而饑餓。
還有可能導致死鎖。
例如,進程P1的優先級低于P2的優先級,若P1通過執行專用機器指令,進入臨界區,且在臨界區內被中斷,P2被調度執行。若P2也需要進入該臨界區,由于臨界區被P1占用,P2 “忙等” 。由于P1的優先級低于P2,調度程序不可能強行剝奪P2的執行而調度P1。這樣,P1將一直占用臨界區被中斷,P2一直“忙等”,如果沒有外力的作用,這種“僵持”狀態將一直保持下去,即系統出現死鎖。

3.信號量(semaphores)方法

軟件方法和硬件方法都存在“忙等”問題,浪費了處理機的時間。信號量方法能實現進程的互斥與同步,而不必“忙等”。(交通信號燈:紅燈停,綠燈行就是典型的信號量實例)

3.1 原理

兩個或多個進程可以通過傳遞信號進行合作,可以迫使進程在某個位置暫時停止執行(阻塞等待),直到他收到一個可以“向前推進”的信號(被喚醒)。像影帝,將實現信號燈作用的變量稱為信號量,常定義為記錄型變量s,其中一個域為整型,另一個域為隊列,其元素為等待該信號量的阻塞進程(FIFO)。

3.2 信號量定義及兩個原子操作

type semaphore = record conut:integer; queue:list of process end;
var s: semaphore; ======================== wait(s) 和 signal(s) ======================== wait(s) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? signal(s) s.count : = s.count - 1; ? ? ? ? ? ? ? ? ? ? ? ? ? s.count := s.count + 1; if s.count < 0 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if s.count <=0 then begin ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?then begin 進程阻塞 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?喚醒隊首進程 進程進入s.queue隊列; ? ? ? ? ? ? ? ? ? ? ? ? 將進程從s.queue阻塞隊列中移除 end; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?end; 進程進入臨界區之前,首先執行wait(s)原語,若s.count<0,則進程調用阻塞原語,將自己阻塞,并插入到s.queue 隊列中進行排隊。 注意,阻塞進程不會占用處理機時間,不是“忙等”。直到某個從臨界區退出的進程執行signal(s)原語,喚醒它。 一旦其他某各進程執行了signal(s)原語中的s.count+1操作之后,發現s.count<=0,即阻塞隊列中還有被阻塞進程,則調用喚醒原語,把s.queue中第一個進程修改為就緒狀態,送就緒隊列,準備執行臨界區代碼。

3.3 利用信號量實現互斥的通用模式

count n=....; //進程數 var s:semaphore(:=1); //定義信號量s,s.count初始化為1 procedure P(i:integer) begin repeat wait(s);// <臨界區> signal(s); <其余部分>

forever

end;

begin ?//主程序

parbegin

P(1),P(2);......P(n)

parend

end

4.管程方法/*待研究*/

5.消息傳遞方法/*待研究*/

總結

以上是生活随笔為你收集整理的[OS复习]进程互斥与同步2的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。