頁表的再學習

济南小老虎發表於2024-05-26

頁表的再學習


背景

昨天研究了一下 不使用大頁記憶體可能會導致當機的場景
但是一些資料自己還是沒有太弄明白
所以早上在小區走路的時候又看了下 頁表和頁的關係
感覺多少理解了一些. 所以想著在嘗試總結一下.

關於頁的來源

現代作業系統基本上都是段頁式的記憶體管理
段主要是區分用途, 比如程式碼段,資料段,堆區,棧區等. 
頁主要是進行虛擬地址與實體地址的對映和管理

段式管理在進行OOM分析,安全分析時很關鍵
頁式管理在進行效能分析,調優時很關鍵

作業系統的記憶體管理的核心其實就是如何更少更快的進行記憶體管理.
現代作業系統預設的記憶體頁大小一般是 4K位元組 4096位元組
這一個其實與硬碟的block大小是類似的
頁大小時作業系統管理記憶體的一個最小單元
但是並不是分配記憶體的最小單元, 還可以分配更小的記憶體容量. 

記憶體大小與頁表大小

一般情況下記憶體頁面的大小是 4KB 
32位作業系統用來定位這個頁面應該就需要 32個bit 也就是 4位元組進行位置確定. 
然後透過記憶體偏移量進行具體記憶體地址的定址.
64位的作業系統應該就需要 64個bit 也就是8個位元組進行位置確定

這樣的話 如果是 1G記憶體, 那麼需要 2的30次方 除以 2的 12次方 也就是 2的18次方個頁表專案
2的18次方個頁表專案也就是 256K個頁表
32位系統就需要 2的2次方 乘以 2的 18次方 也就是 2的20次方位元組的 總頁表
也就是 1MB 
64位系統翻倍 是2MB
說明 2的2次方是 4位元組 2的3次方是 8位元組 根據自己轉換最容易計算記憶體大小

對應的如果是一個 600GB的堆區. 
如果使用 4KB的頁大小, 那麼需要 600*2MB = 1.2GB的頁表大小

如果使用 大頁記憶體 使用2MB的大小
那麼頁表的大小會降低 2的9次方的大小
如果600GB的大頁記憶體區域,也就是需要 2MB左右的大小頁表大小

關於大頁的效能最佳化

1. 像是剛才計算的
    大頁記憶體會減少記憶體頁表專案, 查詢頁時的速度會更快
    因為需要檢索的記憶體減少了, 速度會快, 並且管理成本會低.

2. 減少頁表專案大小
    可以減少總的記憶體使用, 避免記憶體不足,產生swap導致卡頓
    因為頁表專案每個程序是獨立的資源, 會導致記憶體使用量激增.
    因為程序需要隔離, 不同的程序針對相同實體記憶體地址的虛擬頁表專案應該是不同的
    一方面防止有人根據自己的頁表專案去猜測別人的頁表專案
    另一方面也是為了隔離性提高效能. 

3. 減少TLB的miss    
    頁表專案使用TLB 進行快速查詢, TLB大小有限,能夠對映越多的記憶體頁
    他的效能會也好, 減少TLBmiss 是提高資料庫效能的重要方式和方法

相關文章