作業系統(九) -- 多級頁表與快表

williamgavin發表於2018-10-21

單級頁表的缺點

前面說了為了提高記憶體的利用率,記憶體是分頁管理的,並且有一個頁表用來儲存頁號與頁框的對應關係。這個思想理論上是沒有問題的,但是實際使用的時候就不行了,為什麼?

為了更好的提高記憶體的利用率,每一頁就應該做得足夠小,但是每一頁都要在頁表裡面有一項與頁框對應,也就是說頁數越多頁表也就會越大,頁表如果很大的話就會對記憶體造成浪費,因為存放頁表的這部分你記憶體是不能給程式使用的,並且一直存放在該程式的PCB裡面。那麼究竟會造成多大的浪費?假設頁面尺寸為4K,地址是32位,那麼就有220個頁面,頁表裡面就有220個頁表項,如果每個頁表項是4個位元組,2^20個就是4M;系統併發十個程式,需要40M記憶體。如果併發一百個就是400M記憶體,這無疑是一個很大的開銷。

但是實際上大部分的邏輯地址根本不會用到。為什麼?如果你跑一個小程式,可能只需要幾M或者幾十M,也就是說頁表裡面用到的項只佔2^20的很小一部分,那麼能不能把不需要的那些項給遮蔽掉呢,也就是不儲存那些項。

多級頁表的提出

第一種嘗試:頁表裡面只存放用到的頁

比如一個程式用到了第1,3,5,6頁,那麼頁表裡面只需要儲存這四頁對應的頁框號,但是這樣的話頁表裡面的項就不連續了,這樣找某一頁對應的頁框就不能直接使用偏移量的形式了。比較好的方法是折半查詢(因為頁號是有順序的)。但是即便使用折半查詢耗費的時間也會比使用偏移量大很多倍。比如如果一個表項有210個,時間複雜度log(210)=10,也就是需要10次,而如果使用偏移量就只需要一次就好了。所以頁表裡面的頁號必須是連續的。

第二種嘗試:多級頁表,頁目錄表+頁表

一個邏輯地址用10bits的頁目錄號+10bits的頁號+12bits的偏移組成。頁目錄表的每一項對應一個頁表,然後再根據頁表找到對應的頁。這種思想就類似與書本,目錄的地方有一個章目錄(頁目錄表)和節目錄(頁表),如果要查詢某一節的內容首先找到這一章的地方,然後再查具體的某一節。我如果要找第五章的第4節,那麼前面四章都不用看,直接找第五章就行了,這樣除了第五章之外的頁號對應的頁框號的就不用存了。能節省大量記憶體;並且保證了章目錄和節目錄都是連續的,這就意味著可以使用偏移量的形式查詢對應的章節。如下圖:

在這裡插入圖片描述

多級頁表的缺點

但是這種方式也存在一個問題,每一次訪問的時候都要根據章目錄找到頁目錄再找到具體的頁。也就是需要訪問三次記憶體;cpu每一條指令執行的時間其實大部分都是浪費在訪問記憶體上,cpu的執行速度是非常快的,比如訪問記憶體的時間幾乎可以忽略了;換言之,兩級頁表的形式雖然提高了控制元件效率,但是在時間上其實是變成了原來的3倍的;這還只是兩級頁表,如果是4級或者5級的,因為電腦不是32位的啊,現在基本上都是64位的了。

相連快速儲存TLB(快表)

在CPU與記憶體訪問之間加一層TLB,TLB是一組暫存器,用來存放最近使用過的頁對應的頁框號;這樣如果CPU需要訪問某一頁首先在TLB裡面找,如果TLB裡面有就不用訪問記憶體了,因為TLB是暫存器,cpu訪問暫存器的速度遠大於對記憶體的訪問速度。這樣就可以提升時間效能了。可以看到提升時間效能最主要的因素就是可以在TLB裡面直接找到該頁對應的頁框號。那麼如何提升命中率的,首先TLB肯定是越大越好,但是TLB材料很貴,不會做得很大。TLB的大小大概是[64,1024]。為什麼TLB裡面存放這麼少的項就能實現“近似訪存1次”?因為程式的區域性性原理。程式的區域性性原理在使用者程式裡面對應的就是迴圈。TLB也被稱為快表。

小結

總結一下:為了提高記憶體的空間效能,提出了多級頁表的概念;但是提到空間效能是以浪費時間效能為基礎的,因此為了補充損失的時間效能,提出了快表(即TLB)的概念,快表利用的是程式的區域性性原理。

參考資料

哈工大李志軍作業系統

相關文章