同步與互斥

2021-07-06 07:39:08 字數 3610 閱讀 2550

在多道程式系統中,由於程序併發,資源共享與程序協作,使得程序間可能產生兩種形式的制約:

1、間接相互制約:源於資源共享,如果程序ab共享一種資源,如果a請求資源時發現程序b正在訪問這種資源,那麼程序a就進入阻塞佇列,當程序b釋放資源,程序a被喚醒到就緒狀態

2、直接相互制約:源於程序協作,如果程序a通過單項緩衝向程序b提供資料,當緩衝為空程序b得不到資料而進入阻塞佇列,一旦a程序的資料進入緩衝,程序b被喚醒,反之,緩衝滿了,則a被阻塞,只有b取走資料後a才能被喚醒

程序同步:同步程序的直接相互制約

程序互斥:源於間接相互制約,資源共享,保證每次只有乙個程序訪問共享資源

臨界資源:一次只允許乙個程序訪問的資源

臨界區:訪問臨界資源的那段程式

同步準則:空閒就進,遇忙則等,有限等待(對要求進入的程序,應在有限的時間內進入,避免死等),讓權等待(對於等待程序要立即釋放處理機,避免程序忙等)

實現臨界區互斥的基本方法:

1、單標誌位:

程序1:

while(turn!=0);

do_something

turn = 1;

程序2while(turn!=1);

do_something

turn = 0;

演算法設定了乙個標誌位,0時候允許程序1進入臨界區,1時候執行程序2進入臨界區,弊端:了,兩個程序必須交替進入臨界區

2、雙標誌位先檢查:

while(flag[j]);1

flag[i] = true;3

do_something

flag[i] = false;

程序2while(flag[i]);2

flag[j] = true;4

do_something

flag[j] = false;

優點可以連續使用,確定如果按照1234的順序執行,可能兩個程序同時進入臨界區

2、雙標誌位後檢查:

flag[i] = true;

while(flag[j]);

do_something

flag[i] = false;

程序2flag[j] = true;

while(flag[i]);

do_something

flag[j] = false;

先置位後檢查,可以克服上個演算法的缺點,但是有可能兩個程序先後置位後雙方都不能進入臨界區

4、peterson algorithm

flag[i] = true;

turn = j;

while(flag[j]&&turn == j);

do_something

flag[i] = false;

程序2flag[j] = true;

turn = i;

while(flag[i]&&turn == i);

do_something

flag[j] = false;

增加乙個標誌位turn表示不允許某程序進入臨界區,可以使得只有乙個程序進入臨界區

完全用軟體方式實現同步和互斥機制,有很大的侷限性,用硬體支援的原子性指令(如ts指令和swap指令),可以使操作不會打斷,可以解決臨界區問題

1、檢測和設定ts指令

乙個bool值false的時候沒有程序使用,true的時候有程序使用

while ts(&lock);

do_something

lock = false;

2、swap指令

key = true;

doswap(&lock,&key);

}while(&key);

do_something

lock = false;

硬體方法的有點:適用於任意數目的程序,簡單容易驗證正確性,如果有多個臨界區,只要為每個臨界區設立乙個bool變數

缺點:等待要耗費處理機時間,不嫩做到讓權等待,可能出現飢餓,可能出現死鎖

訊號量之前提到的演算法都是平等程序間的協商機制,作業系統可以從程序管理者的角度來處理互斥問題,訊號量就是一種有效手段

訊號量是乙個荷蘭科學家2023年提出,p,v都是荷蘭語的首字母,由乙個二元組組成,乙個int初始非負,乙個初始狀態為空的等待佇列(pcb佇列)int大於零表示資源個數,小於零表示排隊程序數,p為減一,v為加一。

p操作:

int--;申請乙個資源

if(int<0)表示沒有空閒資源

程序進入等待佇列

阻塞程序

v操作int++;釋放乙個資源

if(int<=0)表示有程序處於阻塞狀態

從等待佇列取出乙個程序

程序進入就緒佇列,喚醒乙個程序分配處理機

互斥模型實現:

typedef int semaphore;

semaphore mutex = 1;

p1p(mutex);

do_something

v(mutex);

p2p(mutex);

do_something

v(mutex);

同步模型(p1生產,p2消費)

typedef int semaphore;

semaphore mutex = 0;p1

do_something

v(mutex);

p2p(mutex);

do_something

管程:用訊號量和pv操作,訊號量的操作分散在程序中,易讀性,維護性,正確性難以保證

管程定義:共享資源用資料結構表示時候,資源管理程式可以定義一組過程處理資源,把這組過程和資料結構叫做管程,3部分共享資料,過程方法和初始化,任何時候只有乙個程序可以在管程中執行,管程需要編譯器支援

經典的同步互斥問題:

死鎖:兩個以上的程序無限期的等待不會發生的條件,處於一種停滯狀態,產生死鎖的原因:推進順序不當,對互斥資源分配不當

四個必要條件:

互斥條件(一次只能有乙個程序使用資源),占用並請求(部分占用,還要請求更多資源),非剝奪條件,迴圈等待(請求資源的程序形成了迴圈)

處理策略:

1、忽略:鴕鳥演算法

2、死鎖檢測和恢復:根據保有的資源資訊定期檢查是否有死鎖(有向圖法和矩陣法),然後處理1、資源剝奪(掛起程序釋放資源)2、程序撤銷(撤銷占用資源多或者代價小的程序),程序回退(如果有程序歷史資訊,可以回退到無死鎖狀態),重啟系統。

3、死鎖避免:銀行家演算法,規定安全順序和非安全順序,安全一定不會死鎖,不安全可能有死鎖

4、預防死鎖:打破四個必要條件

由於鎖獲取順序產生的死鎖:

thread1:

a.clock()

b.clock()

thread2

b.clock()

a.clock()

順序不同造成死鎖,處理方法1改變順序

2一次獲得兩個鎖

用getlock(a,b)偽**一次獲得兩個鎖

在windows裡面有waitformultipleobjects系統呼叫

執行緒之間的關係有三種:無關係,共享,同步。

程序之間通訊、協調、通過一些事件通知或等待互斥鎖的釋放方面,不同的平台所支援的方式不一樣

多程序共享資料代價大於執行緒,因為涉及序列化與反序列化的開銷。一些ipc手段是單機os支援的,到了多機的分布式系統上要自己實現,而且效能有問題,網線頻寬問題

同步與互斥

雖然多個程序可以共享系統中的各種資源,但其中許多資源一次只能為乙個程序所使用,我們把一次僅允許乙個程序使用的資源稱為臨界資源。許多物理裝置都屬於臨界資源,如印表機等。此外,還有許多變數 資料等都可以被若干程序共享,也屬於臨界資源。對臨界資源的訪問,必須互斥地進行,在每個程序中,訪問臨界資源的那段 稱...

同步與互斥

同步與互斥的概念 當執行緒併發執行時,由於資源共享和執行緒協作,使用執行緒之間會存在以下兩種制約關係。1.間接相互制約。乙個系統中的多個執行緒必然要共享某種系統資源,如共享cpu,共享i o裝置,所謂間接相互制約即源於這種資源共享,印表機就是最好的例子,執行緒a在使用印表機時,其它執行緒都要等待。間...

同步與互斥

現代作業系統基本都是多工作業系統,即同時有大量可排程實體在執行。在多工作業系統中,同時執行的多個任務可能 這兩種情形是多工程式設計中遇到的最基本的問題,也是多工程式設計中的核心問題,同步和互斥就是用於解決這兩個問題的。互斥 是指散步在不同任務之間的若干程式片斷,當某個任務執行其中乙個程式片段時,其它...