在多道程式系統中,由於程序併發,資源共享與程序協作,使得程序間可能產生兩種形式的制約:
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在使用印表機時,其它執行緒都要等待。間...
同步與互斥
現代作業系統基本都是多工作業系統,即同時有大量可排程實體在執行。在多工作業系統中,同時執行的多個任務可能 這兩種情形是多工程式設計中遇到的最基本的問題,也是多工程式設計中的核心問題,同步和互斥就是用於解決這兩個問題的。互斥 是指散步在不同任務之間的若干程式片斷,當某個任務執行其中乙個程式片段時,其它...