儲存管理中的設計問題
光了解Page的基本原理還不夠,還需要知道如何設計儲存才能達到一個更好的效能。
頁式儲存管理
工作集模型
在虛擬頁儲存管理中,當一個程序被啟動,其所有頁面都還在外存。當CPU取第一條指令時,就會引發缺頁中斷。因此,在程式啟動一開始,很容易發生缺頁中斷,工作一段時間後再維持穩定,如圖所示:
這種工作方式被稱為demand paging
:頁面不是預先被裝入記憶體,而是根據需要隨時調整。
訪存的區域性性與工作集
- 訪存的區域性性(locality):在程序執行的任何階段,它都只訪問它的頁面中較小的一部分
- 工作集(working set):一個程序當前使用的頁的集合
- 抖動
- 工作集模型:頁式儲存管理系統跟蹤程序的工作集,並保證在程序執行以前它的工作集就已經在記憶體中了。在程序執行之前預先裝入頁面也叫做預先調頁(prepaging)。
分配策略
當發生缺頁時,頁面置換演算法作用的範圍不同,對應不同的分配策略:
- 區域性頁面置換演算法:在程序所分配的頁面範圍內選取將被置換的頁面
- 每個程序分配固定大小的記憶體空間
- 全域性頁面置換演算法:在記憶體中所有的頁面範圍內選取被置換的頁面
- 所有程序動態共享系統的物理頁面,分配給每個程序的頁面數動態變化
一般來說,全域性演算法的效能更好。這是因為在程序執行期間,工作集可能發生較大的變化;而區域性演算法可能浪費空間,也更容易造成抖動。
物理頁面的分配
那麼,如何來分配不同程序的物理頁面呢?
在全域性演算法下,當一個程序剛開始執行時,可以先根據程序的大小給它分配一定數量的物理頁面,然後在程序的執行過程中,再動態調整記憶體空間的大小。
可以採用缺頁率(Page Fault Frequently)演算法:
- 缺頁率:一秒鐘內出現的缺頁數(統計)
- 定義程序缺頁率的上下界,使得程序的缺頁率在其範圍之內
- 負載控制(load control):系統內執行的程序過多,無法使所有程序的缺頁率都低於A,則需要將一些程序換出至外存,這裡的交換是為了減少潛在的記憶體需求
- 這種演算法的前提假設是:當分配給程序的物理頁面增多時,缺頁率將會下降。
頁面大小
頁面大小需要權衡多方互相矛盾的因素:
- 內碎片、空間利用率
- 從統計的規律看,內碎片的大小一般是半個頁面;頁面越小、內碎片也會越小、浪費越少
- 例,記憶體被分配n段,頁面大小為p, 則總內碎片大小為np/2
- 頁表項數、頁表裝入時間
- 同一程式,頁面大小越小,需要的頁表項會越多
- 傳送不同大小頁面所花的時間相差不多,同一程式,頁面越小、頁面數會越多、故時間會越長
一般來說,頁面大小為512位元組到4KB之間。
虛擬儲存介面
通常虛擬儲存器對程序和程式設計師是透明的,即所能看到的全部是在一個帶有較小的物理儲存器之上一個大的虛地址空間
允許程式設計師對記憶體對映進行某些控制,可以實現兩個或多個程序共享同一段記憶體空間,即頁面共享
- 可用來實現高效能訊息傳遞系統
分散式共享儲存器
- 允許在網路上的多個程序共享一組頁面,這些頁面可以組成一個共享的線性地址空間
段式儲存管理
頁式管理是把記憶體視為一維線性空間;而段式管理是把記憶體視為二維空間。
很多時候,擁有兩個或多個獨立的虛擬地址空間可能要比單個空間好得多。
將程式的地址空間劃分為若干個段(segment),程式載入時,分配其所需的所有段(記憶體分割槽),這些段不必連續;實體記憶體的管理採用動態分割槽。
程式通過分段(segmentation)劃分為多個模組,如程式碼段、資料段、共享段。
- 可以分別編寫和編譯
- 可以針對不同型別的段採取不同的保護
- 可以按段為單位來進行共享,包括通過動態連結進行程式碼共享
優點
- 沒有內碎片。
- 便於改變程序佔用空間的大小。
- 易於實現程式碼和資料共享,如共享庫
引入新的問題
- 存在外碎片,需要通過記憶體緊縮來消除。
與頁式儲存系統的不同:頁面是定長的而段不是。
當進行段排程時,可能會出現很多的外碎片(external fragmentation)
參考資料
- Operating System:Design and Implementation,Third Edition