1. 程式人生 > >作業系統的儲存管理

作業系統的儲存管理

3.虛擬記憶體的實現

一. 分頁的概念         大部分虛擬記憶體系統中都是用了一種叫分頁的技術。程序的虛擬地址空間按照固定大小劃分成頁面的若干單元,在實體記憶體中相應的單元稱為頁框,且它們的大小通常是一樣的。頁面與頁框形成一一對映關係,這種對映關係的建立有賴於一種存在於記憶體中的資料結構----頁表。頁表結構如下圖所示:          二. 對映機制描述         當CPU執行一條指令時,如MOV AX, [1000]這條指令時,它要把地址為1000的記憶體單元的內容複製到REG中。這個地址是虛擬地址,它先是被送到記憶體管理單元MMU,然後MMU通過頁表把虛擬地址對映為實體記憶體地址,過程如下圖所示:
        
三. 對映機制實現         
假設虛擬地址空間到實體記憶體地址的對映如上圖頁表所示。 (1)當程式試圖訪問已對映的頁面時,比如執行指令         MOV REG, 0         它將訪問虛擬頁面0的第0個位元組所對應的實體地址,地址送到MMU,MMU通過頁表查詢,看到虛擬地址落在頁面0(0K ~ 4K),根據對映結果,這一頁面對應的是頁框2(8K ~ 12K),因此MMU把地址變換為8192,並把地址8192送到總線上。記憶體對MMU一無所知,它只看到一個讀或寫地址8192的請求並執行它。MMU從而有效地把所有0K ~ 4K的虛擬地址對映到了8K ~ 12K的實體地址。         (2)當程式試圖訪問未對映的頁面時,比如執行指令         MOV REG, 32780         它將訪問虛擬頁面8的第12個位元組所對應的實體地址,地址送到MMU,MMU通過頁表查詢,看到該頁面並沒有對映,於是使CPU陷入到作業系統,這個陷阱為缺頁中斷。作業系統找到一個很少使用的頁框並把它的內容寫回磁碟,隨後把要訪問的頁面讀到剛才回收的頁框中,並修改對映關係,然後重新啟動引起陷阱的指令。 四. MMU的內部結構         1. 舉個例子說明MMU的內部是如何工作的         當虛擬地址8192被送到MMU時,輸入的16位虛擬地址被分為4位的頁號和12位的偏移量。4位的頁號可以表示16個頁面,12位偏移可以為一頁內的全部4096個位元組編址。如下圖所示,可以用頁號作為頁表的索引,以得出對應於該虛擬頁面的頁框號,如果在/不在位是0,則將引起一個作業系統陷阱。如果該位是1,則將在頁表中找到的頁框號複製到輸出暫存器的高3位中,再加上輸入虛擬地址中的低12位偏移量。如此便構成了15位的實體地址。         
  2. MMU中虛擬地址到實體地址的對映機制總結:
  • 每對記憶體中的資料讀寫時,需要訪問記憶體兩次,查頁表一次,讀寫一次。
  • 虛擬地址被分成虛擬頁號(高位部分)和偏移量(低位部分)。
  • 虛擬頁號可用作頁表的索引,以找到該虛擬頁面對應的頁表項。由頁表項可以找到頁框號(如果有的話),然後把頁框號拼接到偏移量的高位端,以替換掉虛擬頁號,形成送往記憶體的實體地址。
  • 頁表的目的是把虛擬頁面對映為頁框。從數學角度說,頁表是個函式,它的引數是虛擬頁號,結果是物理頁框號。通過這個函式可以把虛擬地址中的虛擬頁面域替換成頁框域,從而形成實體地址。     
 五. 加速分頁過程        在任何分頁式系統中,都需要考慮兩個問題:
  1. 虛擬地址到實體地址的對映必須非常快
  2. 如果虛擬地址空間很大,頁表也會很大
        第一個問題是由於每次訪問記憶體,都需要進行虛擬地址到實體地址的對映。因此每條指令進行一兩次或更多頁表訪問是必要的。如果執行一條指令需要1ns,頁表查詢必須在0.2ns之內完成,以避免對映成為一個主要瓶頸。         第二個問題來自現代計算機使用至少32位的虛擬地址,而且64位變得越來越普遍。另外每個程序都有自己的獨立的頁表。         針對這兩個問題,有兩種簡單粗暴的處理辦法:
  1. 頁表都放在暫存器中
  2. 頁表都放在記憶體中
        第一種處理辦法的思想是:當啟動一個程序時,作業系統把儲存在記憶體中的程序頁表的副本載入到暫存器中,在程序執行過程中,不必再為頁表而訪問記憶體。這麼做的優點是簡單並且在對映過程中不需要訪問記憶體,缺點是在頁表很大時,代價高昂。         第二種處理辦法的思想是:整個頁表都放在記憶體中,屆時所需的硬體僅僅是一個指向頁表起始位置的暫存器。這麼做的優點是進行上下文切換時只需要重新載入一個暫存器,缺點是在執行每條指令時,都需要一次或多次記憶體訪問,以完成頁表項的讀入,速度非常慢。         現在討論加速分頁機制和處理大的虛擬地址空間的解決方案:         1. 使用TLB(針對第一個問題)
  • TLB的基本概念:在MMU內設定一個小型的硬體裝置,將虛擬地址直接對映到實體地址,而不必再防蚊液表,這種裝置稱為TLB。TLB中含有少量的表項,在實際中很少會超過64個。
  • TLB的工作機制:在將一個虛擬地址放入MMU中進行轉換時,硬體首先通過將該虛擬頁號與TLB中所有表項同時(並行)進行匹配,判斷虛擬頁面是否在其中。如果發現存在,則將頁框號直接從TLB中取出而不必再訪問頁表。而當虛擬頁號不在TLB中時,就會進行正常的頁表查詢。接著從TLB中淘汰一個表項,然後用新找到的頁表項代替它。這樣,如果這一頁面很快再被訪問,第二次訪問TLB時自然將會命中。當一個表項被清除出TLB時,將修改位複製到記憶體中的頁表項,而除了訪問位,其他的值不變。當頁表項中從頁表裝入到TLB中時,所有的值都來自記憶體。
        2. 使用多級頁表和倒排頁表(針對第二個問題):
  • 多級頁表:引入多級頁表的原因是避免把全部頁表一直儲存在記憶體中,特別是那些不需要的頁表就不應該保留。一級頁表不管你映不對映,所有表項都必須存在,否則找不到入口,這樣做會極大地增加頁表空間;而多級頁表通過只為程序實際使用的虛擬記憶體區請求頁表來減少頁表,即程序未使用的頁可以暫時不用為其建立頁表。
  • 倒排索引:在這種設計中,在實際記憶體中每一個頁框有一個表項。而不是每一個虛擬頁面有一個表項(即根據實體地址來找邏輯地址,而不是根據邏輯地址來找實體地址)。當虛擬地址空間比實體地址空間大得多時,倒排頁表節省了大量空間。缺點是需要搜尋整個倒排索引表才能找到對映關係。但可使用hash演算法進行優化,如下圖所示: