1. 程式人生 > >作業系統--第五章虛擬儲存器

作業系統--第五章虛擬儲存器

在此之前,第四章所講述的常規儲存器管理方式的缺點是?
一次性:作業在執行前一次性地全部裝入記憶體
駐留性:作業裝入記憶體後,便一直駐留在記憶體中,直至作業執行結束。

程式執行的特點:
多數情況下仍是順序執行。
少部分的轉移和過程呼叫指令會使程式執行由一部分割槽域轉至另一部分割槽域(但研究表明呼叫深度多數情況下不超過5)
許多由少數指令構成的迴圈結構會多次執行。
對許多資料結構的處理(如陣列)往往侷限於很小的範圍內。

由此我們可以做出如下優化:
基於區域性性原理
程式執行前:不需全部裝入記憶體(打破一次性)僅裝入當前要執行的部分頁面或段即可執行,其餘部分暫留在外存上。
缺頁/段的情況

:要訪問的頁(段) 尚未調入記憶體。程式應利用OS所提供的請求調頁(段)功能,將它們調入記憶體,使程式繼續執行。
調入需要的頁/段時,如果記憶體已滿,無法再裝入新頁(段),通過置換功能將記憶體中暫時不用的頁(段)調至外存,騰出足夠的記憶體空間。(不總駐留)

虛擬儲存器管理—由作業系統提供一個比實際記憶體大的,假想的特大儲存器。

所謂“虛擬儲存器”,是指具有請求調入功能和置換功能,能從邏輯上對記憶體容量加以擴充的一種儲存器系統。
虛擬儲存管理下:
記憶體邏輯容量由記憶體容量和外存容量之和所決定,執行速度接近於記憶體速度,每位的成本卻接近於外存。

虛擬的實現建立在離散分配儲存管理基礎上
方式:請求分頁/請求分段系統
細節:分頁/段機構、中斷機構、地址變換機構、軟體支援

虛擬儲存器的特徵:
1.多次性:一個作業被分成多次調入記憶體執行
2.對換性:允許在作業的執行過程中進行換進、換出。(程序整體對換不算虛擬)
3.最終體現虛擬性:能夠從邏輯上擴充記憶體容量,使使用者所看到的記憶體容量遠大於實際記憶體容量。

請求分頁儲存管理方式
由基本分頁 + “請求調頁”和“頁面置換”功能組成。換入和換出基本單位都是長度固定的頁面.

  1. 頁表基本功能不變:邏輯地址對映為實體地址,增加虛擬功能後需記錄的頁表項資訊有變化:
    頁號+物理塊號/外存地址(儲存何種地址取決於P)+狀態位P+訪問欄位A+修改位M
    狀態位P :指示該頁是否已調入記憶體。
    訪問欄位A :用於記錄本頁在一段時間內被訪問的次數,或記錄本頁最近已有多長時間未被訪問。(置換時考量的引數)
    修改位M :該頁在調入記憶體後是否被修改過。(關係到置換時調出的具體操作)
    外存地址:用於指出該頁在外存上的地址。
  2. 缺頁中斷機構:
    每當要訪問的頁面不在記憶體時,便產生一缺頁中斷通知OS,OS則將所缺之頁調入記憶體。作為中斷,需經歷幾個步驟:
    –“保護CPU環境”
    –“分析中斷原因”
    –“轉入缺頁中斷處理程式”
    –“恢復CPU環境”等。
    作為一種特殊中斷,與一般中斷有明顯區別:
    (1) 在指令執行期間產生和處理中斷訊號。
    (2) 一條指令在執行期間,可能產生多次缺頁中斷。
  3. 地址變換機構:
    分頁系統地址變換機構的基礎上增加分頁系統地址變換機構的基礎上增加
    產生和處理缺頁中斷(請求調入)
    從記憶體中換出一頁的功能(置換)

記憶體分配
作業不一次裝入,部分裝入的情況下如何為程序分配記憶體,涉及三個問題:
1.最小物理塊數的確定(少於此數量程序將不能執行,且與計算機的硬體結構有關,取決於指令的格式、功能和定址方式)
2.物理塊的分配策略
①.固定分配、區域性置換:
為每個程序分配一定數目的物理塊,在整個執行期間不再改變,執行中缺頁時,只能從該程序記憶體中n個頁面中選出一頁換出,然後再調入一頁。
困難:難以把握為每個程序分配“適量”物理塊數.
②.可變分配、全域性置換:
先為每個程序分配一定數目的物理塊
OS管理一個空閒物理塊佇列,發生缺頁時,系統從佇列中取出一塊分配給該程序,將欲調入的頁裝入(動態增長型,全域性空閒空間都可分配使用)
空閒空間不足時,可與其他任何程序頁面置換。“會使其他程序缺頁率提高,影響執行”
優點: 最易實現
③.可變分配、區域性置換:
為每個程序分配一定數目的物理塊
缺頁時,只允許換出該程序在記憶體的頁面,不影響其他程序執行
根據缺頁率增減程序的物理塊數:若頻繁缺頁中斷,則系統再為程序分配若干物理快;若缺頁率特別低,則適當減少分配給該程序的物理塊。
3.物理塊的分配演算法
①.平均分配演算法
將所有可供分配的物理塊平均分配給各程序。
缺點:未考慮各程序本身的大小,利用率不均。
②.按比例分配演算法
根據程序的大小(頁面數佔所有程序頁面總數的比例)按比例分配物理塊。
③.考慮優先權的分配演算法
所有可用物理塊分兩部分:
一部分按比例分配給各程序;另一部分根據各程序優先權,適當地為其增加份額,分配給各程序。

調頁策略

  1. 何時調入頁面
    ①.預調頁策略
    以預測為基礎,將預計不久後便會被訪問的若干頁面,預先調入記憶體。
    優點:一次調入若干頁,效率較好
    缺點:預測不一定準確,預調入的頁面可能根本不被執行到。主要用於程序的首次調入,由程式設計師指出應該先調入哪些頁。
    ②. 請求調頁策略
    執行中需要的頁面不在記憶體,便立即提出請求,由OS將其調入記憶體。
    優點:由請求調頁策略所確定調入的頁,一定會被訪問;比較容易實現。
    缺點:每次僅調入一頁,需花費較大的系統開銷,增加了磁碟I/O的啟動頻率。

  2. 從何處調入頁面
    在請求分頁系統中的外存分為:
    對換區:連續存放資料,讀寫速度較快
    檔案區:離散分配方式,I/O速度相對慢
    發生缺頁時,系統應從何處將缺頁調入記憶體,分成三種情況:
    ①.系統擁有足夠的對換區空間:
    程序執行前所有頁面由檔案區拷貝到對換區;執行需要的頁面全部從對換區調入記憶體,提高調頁速度。
    ②.系統缺少足夠的對換區空間:
    不會被修改的部分,在檔案區操作(即:直接從檔案區調入,換出時不用寫入檔案,再調入時仍從檔案區調入);可能被修改的部分,在對換區操作。
    ③.UNIX方式:(隨執行資料逐漸從檔案區轉到對換區)
    未執行的頁面從檔案區調入;
    曾經執行,但又被換出的頁面放在對換區,下次調入應從對換區調入。
    程序請求的共享頁面可能已被其他程序調入,無需再從對換區調入。
    即:
    系統擁有足夠的對換區空間:對換區
    系統缺少足夠的對換區空間:檔案區/對換區
    UNIX方式:首次請求->檔案區/再次請求調頁->對換區

  3. 頁面調入過程
    程式執行前需要裝入記憶體:上述的2.步策略處理何處調入;
    開始執行:先預調入一部分頁面;
    執行中:需要的頁面不在記憶體時,
    向CPU發出一缺頁中斷,“中斷處理程式”開始工作:
    首先保留CPU環境
    分析中斷原因後,轉入缺頁中斷處理程式。
    處理:判斷是否置換、頁表資訊更新
    恢復現場,重新操作頁面。

頁面置換演算法
頁面置換演算法:選擇換出哪些頁面的演算法,其好壞直接影響系統的效能。應具有較低的缺頁率.(缺頁率:缺頁次數/總頁面使用次數)

  1. 最佳Optimal置換演算法 (無法實現的,理論上的演算法)
    換出以後永不再用的,或在最長(未來)時間內不再被訪問的頁面。
    優點:保證獲得最低的缺頁率
    不足:無法實現,因為無法預知一程序將來的執行情況
    作用:作為參照標準,評價其他演算法。
  2. 先進先出FIFO置換演算法
    先進入的先淘汰,即選擇記憶體中駐留時間最久的頁面予以淘汰。
    優點:實現簡單,把一程序已調入記憶體的頁面按先後次序組織成一個佇列,並設定一個指標(替換指標),使它總是指向隊首最老的頁面。
    不足:與程序實際執行規律不相適應(較早調入的頁往往是經常被訪問的頁,頻繁被對換造成執行效能降低).
  3. 最近最久未使用(LRU)置換演算法
    無法預測將來的使用情況,只能利用“最近的過去”作為“最近的將來”的近似,因此,LRU置換演算法選擇最近最久未使用的頁面予以淘汰。
    不足:
    有時頁面過去和未來的走向之間並無必然的聯絡。
    相應的需較多的硬體支援:記錄每個頁面自上次被訪問以來所經歷的時間t,淘汰時選擇頁面t值最大的;以及需要快速地知道哪一頁是最近最久未使用的頁面,需要用暫存器或棧。
  4. 輪轉演算法(CLOCK)置換演算法
    又稱最近未使用演算法,是LRU的近似演算法,屬於FIFO的折中演算法.
    具體為:
    每個頁設一個使用標誌位,若該頁被訪問則將其置為1。
    設定一個指標,從當前指標位置開始按地址先後檢查各頁,尋找標誌位=0的頁面作為被置換頁。
    若指標經過的頁標誌位=1,修改標誌位=0(暫不調出,給被用過的頁面駐留的機會 ),指標繼續向下。到所有頁面末尾後再返回隊首檢查。
  5. 其他
    ①.最少使用 (LFU):每次被訪問計數器加一,要替換時,替換計數器值最小的一個
    ②.頁面緩衝演算法(PBA):
    仍用FIFO演算法選擇被置換頁
    但並不將其馬上換入外存。
    系統將頁面放入兩個連結串列之一:如果頁面未被修改,就將其歸入到空閒頁面連結串列的末尾;否則將其歸入到已修改頁面連結串列。
    需要調入新的物理頁面時,將新頁面內容讀入到空閒頁面連結串列的第一項所指的頁面,然後將第一項刪除(從空閒連結串列摘下)。
    空閒頁面和已修改頁面,仍停留在記憶體中一段時間,如果這些頁面被再次訪問,只需較小開銷,而被訪問的頁面可以返還作為程序的記憶體頁。
    當已修改頁面達到一定數目後,再將它們一起調出到外存,然後將它們歸入空閒頁面連結串列,這樣能大大減少I/O操作的次數。