《作業系統概念-第七版》概念複習筆記第6章
阿新 • • 發佈:2019-01-05
- 【協作程序】:可以與系統內執行的其他程序相互影響的程序
- 【競爭條件RC】:多個程式併發訪問和操作同一資料且執行結果與訪問發生的特定順序有關係
- 【臨界區】:不管是硬體資源還是軟體資源,多個程序必須互斥的對它進行訪問,每個程序中訪問臨界資源的那段程式碼稱為臨界區;(記憶體中的兩個或多個程式碼塊,他們共享一些資源,如果這兩個程式碼塊併發執行的話可能產生RC條件,所以這兩個或多個程式碼塊必須需要實現互斥,那麼這樣的兩個或多個程式碼塊互稱臨界區)
- 【進入區】:實現請求進入臨界區的程式碼段
- 【互斥】(解決臨界區必須滿足):如果程序P在其臨界區內執行,那麼其他的程序都不能在其臨界區內執行
- 【前進】(解決臨界區必須滿足):如果沒有程序在其臨界區內執行且有程序需進入臨界區,那麼只有那些不在剩餘區內執行的程序可參加選擇,以確定是哪一個程序進入其臨界區,且這種選擇不能無限的推遲
- 【有限等待】(解決臨界區必須滿足):從一個程序做出進入臨界區的請求,直到該請求允許為止,其他程序允許進入其臨界區的次數有上限
- 【搶佔核心】是指允許核心模式的程序被搶佔; 搶佔核心更適合實時程式設計,因為它能允許實時程序搶佔處於核心模式執行的其他程序
- 【Peterson 演算法】:基於軟體的臨界區問題的解答; 演算法如下所示:兩個程序P0、P1,變數turn表示哪個程序可以進入臨界區; flag表示哪個程序想要進入臨界區
do{ flag[i] = true; turn = j; while(flag[j] && turn == j); // //臨界區 // flag[i] = false; // //剩餘區 // }while(true)
- 【鎖】程序在進入臨界區之前必須得到鎖,而在退出臨界區時釋放鎖
- 對於單處理器環境,臨界區問題可以簡單地加以解決:在修改共享變數時要禁止中斷出現
- 【原子的】:不可中斷地指令
- TestAndSet(不可中斷)
使用,宣告一個bool 的 lock ,初始化為falsebool TestAndSet(bool *target){ bool rv = *target; *target = true; return rv; }
do{ while(TestAndSet(&lock)) ;//do nothing // //臨界區 // lock = false; }while(true)
- Swap(不可中斷)
使用,宣告一個bool 的lock ,初始化為falsevoid Swap(bool *a, bool *b) { bool temp = *a; *a = *b; *b = temp; }
do{ key = true; while(key == true) Swap(&lock, &key); // //臨界區 // lock = false; }while(true)
- 上面兩種情況解決了互斥,但是並沒有解決有限等待要求;下面是使用TestAndSet 的有限等待互斥演算法
分析:bool waiting[n] 初始化為false; bool lock 初始化為 false; 只有waiting[i] = false 或 key = false時,程序Pi才進入臨界區;只有當其他程序離開其臨界區時,變數waiting[i] 的值才能變成false; 每次只有一個waiting[i] 被設定為false,以滿足互斥要求do{ waiting[i] = true key = true; while(waiting[i] && key) key = TestAndSet(&lock); waiting[i] = false; // //臨界區 // j = (i + 1)%n; while((j != 1) && !waiting[j]) j = (j + 1)%n; if(j == i) lock = false; else waiting[j] = false; }while(true)
- 若多個程序的某些操作在執行的時間、順序上有制約,則稱這幾個程序是【同步】關係
- 訊號量S(將訊號量初始化為1)
在wait()和signal()操作中,對訊號量整形值的修改必須不可分地執行,即當一個程序修改訊號量值時,不能有其他程序同時修改同一訊號量的值wait(s) { while(s <= 0) ;//do nothing s--; } signal(s) { s++; }
- 【忙等待】:當一個程序位於其臨界區內時,任何其他試圖進入其臨界區的程序都必須在其進入程式碼中連續地迴圈; 這浪費了CPU時鐘
- 【自旋鎖】:處理辦法是用忙等待的訊號量也叫做自旋鎖,因為程序在等待鎖時還在執行(自旋鎖有其優點,程序在等待鎖時不進行上下文切換; 所以如果鎖的佔有時間短的話,自旋鎖就有用了;)多用於多處理器系統
- 【死鎖】:兩個或多個程序無限地等待一個事件,而該事件只能由這些等待程序之一產生; 這樣,這幾個程序就無法獲得資源而繼續執行下去;(組內每個程序都是等待一個事件,而該事件只能由組中的另一個程序產生)
- 【無限期阻塞】、【飢餓】:程序在訊號量內無限期等待
- 【管程】:有程式設計師定義的、在管程內互斥的操作; 管程內定義的子程式只能訪問位於管程內的區域性宣告的變數和新手引數; 管程結構確保一次只有一個程序能在管程內活動
- 【適應互斥】:保護對每個臨界資料項的訪問
- 【十字轉門】:一個佇列結構,包含有阻塞在鎖上的程序
- 【觸發狀態】:表示物件可用且執行緒在獲取它時不會阻塞
- 【非觸發狀態】:表示物件不可用且執行緒在獲取它時會阻塞
- 當執行緒阻塞在非觸發排程物件上時。其狀態從就緒轉變為等待,且該程序被放到物件的等待佇列上; 當排程物件的狀態成為觸發時,核心會檢查是不是有執行緒在該物件上等待,如果有,核心將改變一個或多個執行緒的狀態,使他們從等待狀態切換到就緒狀態以重新執行
- 如果一個執行緒試圖獲取處於非觸發狀態的互斥排程物件是,那麼該執行緒會被掛起,並被放到互斥物件的等待佇列上
- 【事務】:執行單個邏輯功能的一組指令或操作
- 處理事務的關鍵就是不管計算機系統出現什麼錯誤,都要保證事務的原子性(不可被中斷); 可以認為事務是訪問且可能更新各種駐留在磁碟檔案中的資料項的程式單元
- 【提交】:commit,表示事務已經成功執行;
- 【撤銷】:abort,表示事務因各種邏輯錯誤,事務必須停止操作
- 【回退】:被中止的事務必須對其修改的資料不產生任何影響,以確保原子性; (必須恢復到事務剛開始執行之前)
- 【穩定儲存】:駐留在穩定儲存上的資訊絕不會損失
- 【先記日誌後操作】:確保原子性的一種方法, 在穩定儲存上記錄有關事務對其訪問的資料所做各種修改的描述資訊
- 【檢查點】:檢查點之前是已經提交了的資料,可以只從檢查點之後的事務恢復為原來的值;(只要<Tk, commits>出現在日誌中,就執行redo(Tk)更新值; 如果沒有出現在日誌中,就執行undo(Tk),恢復值)
- 【序列排程】:每個事務原子的執行的排程;屬於單個事務的指令在排程中一起出現,因此,對於n個事務的集合,共有n!個不同的有效的序列排程
- 【衝突可序列化】:排程S可以經過一系列非衝突操作的交換而轉換成序列排程的話, S就是衝突可序列化
- 【兩階段加鎖協議】:要求每個事務按兩個階段來發出加鎖和放鎖請求;(增長階段:事務可以獲取鎖,但不能釋放鎖; 收縮階段:事務可釋放鎖,但不能獲取新的鎖)
- 【時間戳】:對於系統內的每個事務Ti,都為之關聯一個唯一固定的時間戳,並記為TS(Ti),這個在事務Ti開始執行之前由系統賦予
- 如果TS(Ti) < TS(Tj),那麼系統必須確保所產生的排程相當於事務Ti在事務Tj之前的序列化排程