二級頁表如何節省記憶體

2021-07-01 20:24:28 字數 776 閱讀 6937

《深入理解linux核心》:如果使用簡單的一級頁表,如果程序使用全部4g線性位址空間,那麼將需要高達2^20表項(總共位址線是32位,每頁大小為4kb,則頁偏移量需要低12位,高20位當作頁表位址)來儲存表示每個程序的頁表,若每項4b,則需要4mb的ram來儲存頁表。即使乙個程序並不使用內的所有位址。

書上提出:使用這種二級模式能夠減少每個程序頁表所需ram數量。開始一直沒想通,為什麼節省了呢?從你最終要儲存的表項來看,無論如何你儲存的表項是不會少的,而且多級頁表還會增加儲存開銷。

其實是這樣的,二級表只是從程序的角度來看,為程序節省了頁表項(其實所有的頁表儲存空間增大了)。二級模式通過只為程序實際使用的那些虛擬記憶體區請求頁表來減少頁表,就是程序未使用的頁暫時可以不用為其建立頁表,因為如果使用一級頁表的話,你就必須為所有的4g範圍內分配頁表,不能細分。每個活動程序必須有乙個分配給它的頁目錄,不過沒必要馬上為程序的所有頁表都分配ram,只有在程序實際需要乙個頁表時才給該頁表分配ram,這樣就提高了效率。

(1)0x00000000~0xbfffffff的線性位址,無論使用者態和核心態的程序都可以定址;

(2)0xc0000000~

0xffffffff的線性位址,只有核心態的程序可以定址。

栗子: 

比如對於4g的空間,4k頁

那需要2^20 == 1m個頁標項(無論用不用都需要,系統不知道哪個位址是否會被訪問)

1m * 4b== 4mb

每個程序都需要4mb的頁表

而如果2級

只需要乙個頁目錄 + 1個頁表(比如只使用4mb的情況)就足夠了

當建立大量例項如何節省記憶體

當程式需要建立大量的例項時,那麼程式就會占用大量的記憶體,我們想要節省記憶體的話該怎麼做呢?在類中使用 slots 屬性 class date slots year month day def init self,year,month,day self.year year self.month mo...

python如何為建立大量例項節省記憶體

python如何為建立大量例項節省記憶體,具體內容如下 案例 某網路遊戲中,定義了玩家類player id,name,status,每有乙個 玩家,在伺服器程式內有乙個player的例項,當 人數很多時,將產生大量例項 百萬級別 需求 如何降低這些大量例項的記憶體開銷?如何做?首先要明白,pytho...

Linux使用者程序記憶體分配及二級頁表PTE的二三事

我們在用偵錯程式看linux使用者程序 時,發現了一件很有意思的事情,在一段記憶體空間中,有一整頁 4k 都是data abort,如下 第一頁4011c000資料正常 4011cfec 0xe28dd014 add r13,r13,0x14 4011cff0 0xe8bd40f0 ldmfd r1...