2、作業系統記憶體管理——分頁
注:參考哈工大李治軍老師公開課。
1、 分頁原理
在記憶體管理中,為了減少記憶體的空間的浪費,採用了頁作為分配的基本單位(大小通常是4K),而且在分配的過程中採用了頁號(邏輯地址)和頁框號(實體地址)的對映表,這樣使得程式在記憶體中的分佈就不需要嚴格的連續分佈了。例子如下:
圖一:頁訪問過程
在圖一中,需要訪問的地址是0x2240,且頁面大小是4K,那麼記憶體中的MMU就會進行計算0x2240/4K=0x0002(右移12位)得到頁號,那麼剩下的就是頁內偏移量了。這樣就的到了邏輯地址<0x0002,0x0224>,程序PCB中的頁表指標就會根據邏輯地址中的頁號去查詢頁號-頁框號對映表,得到頁框號3,在結合邏輯地址中的頁內偏移量0x0224 ,得到實體地址<3,240>,然後進行訪問。
這樣的方式看起來簡單方便,但是卻有一個極其致命的問題,我們計算機的記憶體如果是4GB,頁面大小是4KB,那麼就有4GB/4KB=1M這麼多個表項,這個表項的儲存代價是巨大的。雖然我們的程式用不到這麼多,有很多表項是不需要的;但是我們為了提高查詢效率(起始地址+偏移量)就必須把那些不需要的表項頁記錄在表中。為了解決這個問題,有以下兩種解決方案:
2、採用多級頁表:
就像書的目錄一樣,先安裝章排序,再每章按照小節排序,以此類推;這樣的話如果需要找到某一項的話,就只需要先讀入章目錄,再讀入特定章的小節目錄,以此類推,這樣就大大減少了記憶體的消耗,增加了記憶體使用的效率,節省了記憶體空間。
圖二:多級頁表
雖然這種方式極大的提高了空間的利用率,但是依然存在問題,就是每查一級目錄就需要訪問一次記憶體,這樣導致每次訪問記憶體都需要額外的訪問幾次。為了解決這一問題,可以採用一種類似cache結構的折中方式——快表。
3、 快表(TLB,類似cache)
快表是一種利用程式空間區域性性(即一段時間內程式執行的是同一段程式),是一組相聯快速儲存,是暫存器(速度快,價格貴),大小一般在64-1024之間。
圖三:程式空間區域性性
快表的使用類似cache的使用,就是先直接在快表中順序查詢,如果找到就直接獲得頁框號,得到實體地址;如果沒有找到,再採用多級頁表查詢。
圖四:快表的使用