深刻淺出計算機組成原理學習筆記:第四十講

1、簡單頁表

一、頁表的概念

想要把虛擬內存地址,映射到物理內存地址,最直觀的辦法,就是來建一張映射表。這個映射表,可以實現虛擬內存裏面的頁,到物理內存裏面的頁的一一映射。
這個映射表,在計算機裏面,就叫做 頁表(PageTable)。

頁表這個地址轉換的辦法,會把一個內存地址分紅 頁號(Directory)和 偏移量(Offset)兩個部分。這麼說太理論了,我以一個32位的內存地址爲例,幫你理解這個概念。

一、其實,前面的高位,就是內存地址的頁號。後面的低位,就是內存地址裏面的偏移量。數組

二、作地址轉換的頁表,只須要保留虛擬內存地址的頁號和物理內存地址的頁號之間的映射關係就能夠了。服務器

三、同一個頁裏面的內存,在物理層面是連續的。以一個頁的大小是4K比特(4KiB)爲例,咱們須要20位的高位,12位的低位。
數據結構

二、內存地址轉換,的三個步驟:

總結一下,對於一個內存地址轉換,其實就是這樣三個步驟:
1. 把虛擬內存地址,切分紅頁號和偏移量的組合;
2. 從頁表裏面,查詢出虛擬頁號,對應的物理頁號;
3. 直接拿物理頁號,加上前面的偏移量,就獲得了物理內存地址。性能


三、一個頁表須要多大的空間

不知道你算出的數字是多少?32位的內存地址空間,頁表一共須要記錄2^20個到物理頁號的映射關係。這個存儲關係,就比如一個2^20大小的數組。優化

一個頁號是完整的32位的4字節(Byte),這樣一個頁表就須要4MB的空間。聽起來4MB的空間好像還不大啊,畢竟咱們如今的內存至少也有4GB,服務器上有個幾十GB的內存和很正常。
spa

不過,這個空間可不是隻佔用一份哦。咱們每個進程,都有屬於本身獨立的虛擬內存地址空間。這也就意味着,每個進程都須要這樣一個頁表。操作系統

無論咱們這個進程,是個自己只有幾KB大小的程序,仍是須要幾GB的內存空間,都須要這樣一個頁表。設計

若是你用的是Windows,你能夠打開你本身電腦上的任務管理器看看,如今你的計算機裏同時在跑多少個進程,用這樣的方式,頁表須要佔用多大的內存。

這還只是32位的內存地址空間,如今你們用的內存,多半已經超過了4GB,也已經用上了64位的計算機和操做系統。這樣的話,指針

用上面這個數組的數據結構來保存頁面,內存佔用就更大了。那麼,咱們有沒有什麼更好的解決辦法呢?你能夠先仔細思考一下。blog

四、簡單頁表存在的問題

一個頁號是完整的32位的4字節(Byte),這樣一個頁表就須要 4MB的空間。  不過,這個空間可不是隻佔用一份哦。咱們每個進程,都有屬於本身獨立的虛擬內存地址空間。這也就意味着,每個進程都須要這樣一個頁表。無論咱們這個進程,是個自己只有幾KB大小的程序,仍是須要幾GB的內存空間,

2、多級頁表

一、爲何咱們不用哈希表而用多級頁表呢?

咱們先來看一看,一個進程的內存地址空間是怎麼分配的。在整個進程的內存地址空間,一般是「兩頭實、中間空」。在程序運行的時候,內存地址從頂部往下,不斷分配佔用的棧的空間。
而堆的空間,內存地址則是從底部往上,是不斷分配佔用的。

因此,在一個實際的程序進程裏面,虛擬內存佔用的地址空間,一般是兩段連續的空間。而不是徹底散落的隨機的內存地址。而多級頁表,就特別適合這樣的內存地址分佈

二、多級頁表

多級頁表就是把內存分紅區塊來管理,將原來的映射關係改爲區塊索引和區塊內的偏移。因爲虛擬內存空間一般只用了不多一部分,

那麼多級頁表就只保存這些使用中的區塊,這樣就能夠大大地減小頁表的項數

Linux 用的正是四級頁表來管理內存頁,以下圖所示,虛擬地址被分爲 5 個部分,前 4 個表項用於選擇頁,而最後一個索引表示頁內偏移。

 

 

 

三、頁表樹

事實上,多級頁表就像一個多叉樹的數據結構,因此咱們經常稱它爲 頁表樹(Page Table Tree)。由於虛擬內存地址分佈的連續性,樹的第一層節點的指針,
不少就是空的,也就不須要有對應的子樹了。所謂不須要子樹,其實就是不須要對應的2級、3級的頁表。找到最終的物理頁號,就好像經過一個特定的訪問路徑,
走到樹最底層的葉子節點。

 

四、一個4級的多級頁佔用多少空間

以這樣的分紅4級的多級頁表來看,每一級若是都用5個比特表示。那麼每一張某1級的頁表,只須要2^5=32個條目。若是每一個條目仍是4個字節,那麼一共須要128個字節。
而一個1級索引表,對應32個4KiB的也就是16KB的大小。一個填滿的2級索引表,對應的就是32個1級索引表,也就是512KB的大小。

咱們能夠一塊兒來測算一下,一個進程若是佔用了1MB的內存空間,分紅了2個512KB的連續空間。那麼,它一共須要2個獨立的、填滿的2級索引表,也就意味着64個1級索引表,
2個獨立的3級索引表,1個4級索引表。一共須要69個索引表,每一個128字節,大概就是9KB的空間。比起4MB來講,只有差很少1/500。

五、多級頁表存在的問題

不過,多級頁表雖然節約了咱們的存儲空間,卻帶來了時間上的開銷,因此它實際上是一個「以時間換空間」的策略。本來咱們進行一次地址轉換,
只須要訪問一次內存就能找到物理頁號,算出物理內存地址。可是,用了4級頁表,咱們就須要訪問4次內存,才能找到物理頁號了。

咱們在前面兩講講過,內存訪問其實比Cache要慢不少。咱們原本只是要作一個簡單的地址轉換,反而是一會兒要多訪問好屢次內存。
對於這個時間層面的性能損失,咱們有沒有什麼更好的解決辦法呢?那請你必定要關注下一講的內容哦!

3、總結延伸

好了,這一講的內容差很少了,咱們來總結一下。

咱們從最簡單的進行虛擬頁號一一映射的簡單頁表提及,仔細講解了如今實際應用的多級頁表。多級頁表就
像是一顆樹。由於一個進程的內存地址相對集中和連續,因此採用這種頁表樹的方式,能夠大大節省頁表所
須要的空間。而由於每一個進程都須要一個獨立的頁表,這個空間的節省是很是可觀的。

在優化頁表的過程當中,咱們能夠觀察到,數組這樣的緊湊的數據結構,以及樹這樣稀疏的數據結構,在時間複雜度和空間複雜度的差別。另外,純粹理論軟件的數據結構和硬件的設計也是高度相關的。

相關文章
相關標籤/搜索