1、順序環境和順序程序
- 順序環境
- 程序的指令或語句序列是順序的;
- 在計算機系統中只有一個程序在運行;
- 一個程序獨占系統中所有資源;
- 一個程序執行不受外界影響。
- 順序特征
- 順序性執行;
- 封閉獨占資源;
- 確定可再現性。
2、並發環境和並發進程
- 並發環境
- 在一定時間內物理機器上有兩個或兩個以上的程序;
- 程序處於開始運行但尚未結束的狀態;
- 程序執行次序不是事先確定的。
- 並發特征
- 程序結果是不可再現性的;
- 程序的執行呈現間斷性;
- 系統中各類資源共享;
- 獨立性和制約性;
- 程序和計算不再對應。
3、相交進程和無關進程
- 間接式和直接式制約
- 直接作用:也稱"合作關系",是指一個進程執行完后,另一個進程才能開始,否則不能開始;
- 間接作用:也稱“競爭關系”,是指一個進程訪問共享資源時,其他需訪問此資源的進程必須等待。
- 相交和無關進程
- 相交進程:邏輯上的有某種聯系的並發進程;
- 無關進程:邏輯上無任何聯系的並發進程;
- 直接作用只發生在相交進程之間;
- 間接作用可以發生再相交進程或無關進程之間。
4、進程同步和進程互斥
- 進程同步(直接制約)
- 根據一定的時序關系合作完成一項任務;
- 並發進程因直接制約而互相等待,彼此相互發送消息進行合作,使得個進程按一定的速度執行。進程間的直接制約關系來源於合作;
- 進程建的互相聯系式有意識安排的,直接作用只發生再相交的進程間。
- 進程互斥(間接制約)
- 各進程競爭使用臨界資源;
- 臨界資源:在操作系統中,進程是占有資源的最小單位(線程可以訪問其所在進程內的所有資源,但線程本身並不占有資源或僅僅占有一點必須資源)。但對於某些資源來說,其在同一時間只能被一個進程所占用。這些一次只能被一個進程所占用的資源就是所謂的臨界資源。典型的臨界資源比如物理上的打印機,或是存在硬盤或內存中被多個進程所共享的一些變量和數據等(如果這類資源不被看成臨界資源加以保護,那么很有可能造成丟數據的問題);
- 進程間通過中介發生聯系,是無意識安排的;
- 可發生在相交進程間,也可發生再無關進程間。
- 進程同步和互斥的關系
- 互斥反映了進程間的競爭關系,而同步則反映了進程間的合作關系;
- 進程互斥是進程同步的一種特殊情況;
- 互斥所涉及的進程之間沒有固定的必然的聯系,它們只是競爭獲得共享資源的使用權;而同步所涉及的並發進程之間有一鍾必然的聯系,即使資源可用,若沒有獲得同步消息,進程也不能去使用。
- eg.
- 若干同學去圖書館借書(互斥)
- 輸入進程和計算進程(同步)
- 流水線生產的各道工序(同步)
- 若干進程使用一台打印機(互斥)
- 商品生產和社會消費(同步)
5、訪問臨界資源
- 對於臨界資源的訪問,必須是互斥進行。也就是當臨界資源被占用時,另一個申請臨界資源的進程會被阻塞,直到其所申請的臨界資源被釋放。而進程內訪問臨界資源的代碼被成為臨界區。對於臨界區的訪問過程分為四個部分:
- 進入區:查看臨界區是否可訪問,如果可以訪問,則轉到步驟二,否則進程會被阻塞
- 臨界區:在臨界區做操作
- 退出區:清除臨界區被占用的標志
- 剩余區:進程與臨界區不相關部分的代碼
6、臨界區及其使用原則
- 臨界區
- 進程中涉及臨界資源的程序段
- 多個進程的臨界區為相關臨界區
- 使用原則
- 有空讓進
- 無空等待
- 多中擇一(讓權等待)
- 有限等待
7、臨界區管理軟件方法
- Dekker算法
- Dekker算法用指示器turn來指示應該哪個進程進入臨界區
1 var inside: array[1..2] of Boolean; 2 inside[1] = false; 3 inside[2] = false; 4 turn: interger; 5 turn := 1 or 2;
-
- 進程1
1 process P1 2 begin 3 inside[1] = true; 4 while inside[2] do if turn = 2 then 5 begin 6 inside[1]:= false; 7 while turn = 2 do begin end; 8 inside[1]:= true; 9 end 10 臨界區; 11 turn := 2; 12 inside[1]:= false; 13 end;
-
- 進程2
1 process P2 2 begin 3 inside[2] = true; 4 while inside[1] do if turn = 1 then 5 begin 6 inside[2]:= false; 7 while turn = 1 do begin end; 8 inside[2]:= true; 9 end; 10 臨界區; 11 turn:= 1; 12 inside[2]:= false; 13 end;
8、臨界區管理的硬件方法
- 測試並建立指令TS
1 /* s代表臨界資源狀態,由TS指令控制 */ 2 s : boolean; 3 s := true; 4 process Pi /* i = 1,2,...,n */ 5 pi : boolean; 6 begin 7 repeat pi := TS(s) until pi; 8 臨界區; 9 s := true; 10 end;
- 交換指令SWAP
- 交換指令將交換兩個字的內容
- 公共變量lock決定臨界區是否上鎖
- 每個進程的私有變量key用於與lock交換
1 /* 交換函數 */ 2 void SWAP(int* a, int* b) { 3 int temp; 4 temp = *a; 5 *a = *b; 6 *b = temp; 7 } 8 9 key = true; 10 do {SWAP(&lock, key);} 11 while(key); 12 臨界區; 13 lock := flase;
- 開關中斷指令
- 進入臨界區前執行“關中斷”指令
- 離開臨界區后,執行“開中斷”指令
- 控制進程互斥進入臨界區
9、軟硬件方法的優缺點
- 軟硬件方法都采用了忙等待方式
- 軟件方法實現復雜,需要編程技巧
- 硬件指令方法代碼簡潔有效
- 硬件中斷屏蔽方法代價較高
