按需調頁,使用懶惰交換->隻有在需要頁時,才調入記憶體,
交換程式(swapper)對整個程序進行操作
調頁程式(pager)隻是對程序的單個頁進行操作
對标記為無效的通路會産生頁錯誤陷阱
純粹按需調頁(pure demand paging)
一條指令可能通路多個頁的記憶體(一頁用于指令,其它頁用于資料)則一頁可能産生多個頁錯誤, 不好的系統性能。 局部引用(locality of reference)
頁表:有效無效位
次級存儲器 :用來儲存不在記憶體中的頁, 快速磁盤,交換裝置, 用于交換的這部分磁盤稱為交換空間(swap space)
請求調頁的關鍵要求 :能夠在頁錯誤後重新執行指令, 在出現頁錯誤時,儲存中斷程序的狀态(寄存器, 條件代碼, 指令計數器)
若頁錯誤出現在指令擷取時, 可以再次擷取指令
若出現在擷取操作數時, 那麼可以再次擷取指令, 再次譯碼指令,然後再次擷取操作數。
9.2.2 按需調頁的性能
p為頁錯誤的機率, p接近于0, 頁錯誤越少, 那麼有效通路時間為 :
有效通路時間 = (1-p) * ma + p * 頁錯誤時間
按需調頁的另一個重要方面 : 交換空間 的處理和使用
磁盤I/O到交換空間通常比到檔案系統要快。 因為 交換空間 按大塊來配置設定的, 并不使用檔案查找和間接配置設定方法
如果在程序開始時将整個檔案鏡像複制到交換空間, 并從交換空間執行按頁排程, 那麼有可能獲得更好的調頁效果,另一選擇是開始時從檔案系統中進行按需調頁, 但是當出現頁置換時則将頁寫入交換空間, 這種方法確定隻有所需的頁才從檔案系統中調入, 而以後出現的調頁時從交換空間中讀入的。
9.3 寫時複制
通過采用類似頁面共享的技術, 采用系統調用fork建立程序的開始階段可能不需要按需調頁, 這種技術提供了快速程序建立, 且最小化新建立程序必須配置設定的新頁面的數量
寫時複制(copy-on-write) : 允許父程序與子程序開始時共享同一頁面,這些頁面标記為寫時複制頁,即如果任何一個程序需要對頁進行寫操作, 那麼就建立一個共享頁的副本。
注意 隻有可能修改的頁才需要标記為寫時複制,不能修改的頁(即包含可執行代碼的頁)可以為父程序和子程序所共享,寫時複制是一種常用技術,為許多作業系統所采用,如Windows XP, Linux和Solaris
采用寫時複制 從哪裡配置設定空閑頁?
許多OS提供 空閑緩沖池 這些空閑頁在程序棧或隊必須擴充時可用于配置設定, 或用于管理寫時複制頁,作業系統通常采用 按需調零(zero-fill-on-demand)的技術以配置設定這些頁。 按需調零頁在需要配置設定之前先填零,清除了以前的内容。
fork()不同于寫時複制的fork() , fork()會将父程序挂起。子程序使用父程序的位址空間。如果子程序修改父程序位址空間的任何頁, 修改過的頁在父程序重新開機時是可見的。
9.4 頁面置換
過度配置設定(over-allocating)
常用解決方法 :頁置換(page replacement)
9.4.1 基本頁置換
幀配置設定算法(frame-allocation) 和 頁置換算法(page-replacement algorithm)
如果在記憶體中有多個程序,那麼必須決定為每個程序各配置設定多少幀, 當需要頁置換時,必須選擇要置換的幀
記憶體的引用序列稱為引用串(reference string)
9.4.2 FIFO頁置換
9.4.3 最優置換(optimal page-replacement algorithm)
9.4.4 LRU頁置換
FIFO :頁調入記憶體的時間
OPT :頁将來使用的時間
最優置換和LRU置換都沒有Belady異常, 都屬于同一類算法, 稱為 棧算法(stack algorithm)
9.4.5 近似LRU頁置換
1.附加引用位算法
作業系統把每個頁的引用位轉移到其8位位元組的高位,包含着該頁在8個時鐘周期内沒有使用,無符号整數,最小值的頁為LRU置換頁
數量可降為0, 隻有引用位本身, 第二次機會頁置換算法(second-chance page-replacement algorithm)
2. 二次機會算法
基本算法是FIFO置換算法
一個頁如果經常使用以至于引用位總是被設定,不會被置換
實作算法 (有時稱為時鐘算法): 采用循環隊列
3.增強型二次機會算法
9.4.6 基于計數的頁置換
* 最不經常使用頁置換算法(LFU)
* 最常使用頁置換算法(MFU) : 理論為具有最小次數的頁可能剛調入,還未使用
9.4.7 頁緩沖算法
系統保留一個空閑幀緩沖池
在犧牲幀寫出之前,所需要的頁就從緩沖池中讀到空閑記憶體,當在犧牲幀以後寫出時,它再加入到空閑幀池
9.4.8 應用程式與頁置換
有的作業系統允許特殊程式将磁盤作為邏輯塊數組使用,而不需要通過檔案系統的資料結構,這種數組有時稱為生磁盤(raw disk), 而對數組的I/O則稱為生I/O。
雖然有些應用程式使用其特有的磁盤存儲服務更為高效,但是絕大多數程式使用通用檔案系統服務會更好
9.5 幀配置設定
若采用純按需調頁
9.6 系統颠簸
局部置換算法(local replacement algorithm) (或 優先置換算法(priority replacement algorithm))能限制系統颠簸
局部置換 : 一個程序開始颠簸,那麼它不能從其他程序拿到幀,且不能使後者也颠簸
如果程序颠簸,那麼絕大多數時間内也會排隊來等待調頁裝置,由于調頁裝置的更長的平均隊列,頁錯誤的平均等待時間也會增加。是以,即使對沒有颠簸的程序, 其有效通路時間也會增加。
局部模型(locality model)
9.6.2 工作集合模型
工作集合模型(working-set model)是基于局部性假設的
工作集合視窗(working-set window)
9.7 記憶體映射檔案
9.7.3 記憶體映射I/O
當通過記憶體映射序列槽發送一長串位元組時,CPU寫一個資料位元組到資料寄存器,并設定控制寄存器的一個位以表示有位元組可用。
裝置讀取位元組,并清除控制寄存器的位以表示可以接收下一個位元組。
接着,CPU可傳輸下一個位元組,如果CPU采用輪詢方式來檢測控制位,這種操作稱為程式I/O(programmed I/O, PIO)
如果采用接收裝置就緒後可發下一個位元組的中斷的方式,稱為中斷驅動(interrupt driven)