第9章 虛擬記憶體 (virtual memory)
基本觀念 生意好的餐廳有所謂的翻桌率,也就是在同一段進餐時間,同一桌可能可以陸續讓好幾組客人依序用餐。所以即使餐廳只有10張桌面,可能一個中午出了 30桌的菜量 電腦的記憶體空間也有限,為了服務更多的處理元,作業系統也採用類似的概念,而且有過之而無不及,處理元執行時需要的資料放置到記憶體中,即使有的放不下,也暫時放到磁碟上,等需要用到時再想辦法移到記憶體中
隨選分頁(demand paging) 隨選分頁的方法可以讓一個程式在沒有完全載入到主記憶體中的情況下,依然能夠繼續執行 如此一來,程式占有空間的大小就比較沒有限制了 這種技術稱為虛擬記憶體(virtual memory) ,分頁本身在系統的安排下,能夠在磁碟與主記憶體中移動,讓使用者覺得執行的程式一直都位於主記憶體中
分頁與分段虛擬記憶體技術比較
虛擬記憶體技術的優點 執行程式的大小可以不受限於主記憶體空間的大小。 記憶體的使用會更有效率,因為程式會用到的部分才會占用記憶體的空間。 可以進行更廣泛的多工(multiprogramming)。 避免external fragmentation的問題,降低internal fragmentation的程度。 容許程式碼與資料的共用。 讓程式片段的動態連結(dynamic linking)更容易。
虛擬記憶體的缺點 處理器硬體成本增加 處理分頁中斷(page interrupts)的額外成本 為了避免頻繁置換(thrashing)而增加的軟體複雜性
虛擬記憶體運作的方式
虛擬記憶體的機制 虛擬記憶體可以讓沒有完全存在於主記憶體中的處理元能夠執行 換句話說,處理元的位址空間(address space)並沒有完全載入到主記憶體中 做法是把處理元的位址空間分割,如此一來,需要用到的位址空間分割(address space partition)必須載入,還用不上的就可以先存在secondary memory裡頭
虛擬記憶體擴充主記憶體空間的原理
實體記憶體的抽象化 虛擬記憶體管理員在secondary memory建立的虛擬位址空間(virtual address space)可以看成是實體記憶體的抽象化 當系統運作時,虛擬記憶體管理員會自動控制主記憶體與虛擬記憶體之間的對應,促成資料方塊在主記憶體與次記憶體間自動的移轉 在虛擬位址空間存在的情況下,對於使用者來說,其實虛擬位址空間跟實體位址空間並沒有差別,只是在程式用到虛擬位址空間的時候,作業系統要把資料搬到實體記憶體中
位址對應的過程
分段式的虛擬記憶體機制(segmentation) 分段式的虛擬記憶體和relocation register與limit register的方法近似,由程式設計者本身決定程式的分割方式,產生大小不一的分段(segment) 例如UNIX C compiler訂的text, data與stack segment 分割之後,記憶體空間的位置就可以用 : <分段號碼, 平移量(offset)> 來決定 分段號碼指定記憶體的某個區塊,平移量指所在之處與分段起點之間的距離 分段本身就成為虛擬記憶體管理員在主記憶體與次記憶體之間移動資料的單位
分段式的記憶體配置方式
SMT的內容與用途
分段法的實作
分頁的記憶體配置(paged memory allocation) 分頁的記憶體配置方式將CPU所要處理的job分成大小一樣的分頁(page) 有的作業系統以記憶體區塊的大小為分頁的大小,而且也剛好跟磁碟上區塊的大小一樣
分頁的記憶體配置(paged memory allocation)方式
分頁的虛擬記憶體機制(paging) 分頁的虛擬記憶體機制(paging)使用單一成份的位址,虛擬記憶體空間分成線性的(linear)虛擬位址 程式設計者不需要知道虛擬記憶體空間如何運作,完全由虛擬記憶體管理程式負責把固定大小的分頁(page)依照需求在主記憶體與次記憶體之間移動 在實作上,分頁機制比較簡單,使用者對於技術上的細節不必了解 每個處理元的虛擬位址空間分成邏輯上的分頁,外部空間散佈的問題(external fragmentation)比較小
常見的分頁配置演算法 靜態配置演算法(static allocation) 動態配置演算法(dynamic allocation)
靜態分頁配置演算法(static paging algorithm) 取用政策(fetch policy) : 決定分頁何時載入主記憶體。 替換政策 (replacement policy) : 決定系統資源不足時那一個分頁應卸載。 置放政策 (placement policy) : 決定取用的分頁應放在何處。
取用政策(fetch policy) 取用政策決定分頁那時候會被載入到主記憶體中 分頁演算法通常不會預先知道分頁引用的順序,所以要做到預先擷取(prefetch)是不太可能的,prefetch是指在分頁被引用之前就先載入到主記憶體中 大多數的演算法都採用所謂的依需求取用分頁(demand paging)的方法,也就是當程式引用到分頁時才將分頁載入到主記憶體中
需求分頁法(demand paging) 依需求分頁(demand paging)的觀念是指只將程式的一部分載入到記憶體中 原本在job開始執行一直到結束,整個job都要放在記憶體中 假如程式引用到沒有載入的分頁,再將分頁載入到page frame
Belady的靜態配置演算法
LRU的靜態配置演算法
LFU的靜態配置演算法
FIFO的靜態配置演算法
只使用了3個page frame的FIFO靜態配置演算法
動態分頁配置演算法(dynamic paging algorithm) 動態配置演算法會考量處理元執行過程中需求的改變,修正記憶體的配置情況 處理元引用記憶體位址的區域性關聯(locality)在此就可以派上用場 工作集演算法(working set algorithm)就是著名的動態配置演算法
工作集(working set) 一個job的工作集(working set)是記憶體中job使用的pages的集合 當使用者開始執行程式以後,開始會有pages載入到記憶體中,經過一陣子以後,大多數的程式對於pages的存取都會進入穩定的狀態,很少有page fault發生,代表job會用到的pages都已經在主記憶體中,這些pages就形成了job的working set 程式的執行有可能在進入另一個階段以後又開始產生page faults,因為用到的working set改變了
工作集中兩個重要的觀念 為什麼不乾脆把job的working set中所有的pages一次全部都載入到記憶體中呢 ? 首先,working set會隨locality而改變,所以除非是把所有用道pages都載入,否則無法全部一次都載入。 分時系統中會有job swapping的現象,重新載入記憶體的job一開始都會產生很多page faults,影響系統的效能。
Window size為3的工作集動態配置演算法
Window size為4的工作集動態配置演算法
Window size為9的工作集動態配置演算法
使用4個page frames但是引用次序不同的工作集動態配置演算法
分段分頁法的原理