內存管理學習筆記 :
操作系統---內存管理(上) 概念 覆蓋交換技術 連續分配管理方式
操作系統---內存管理(下) 分段存儲 段頁式存儲 虛擬內存 請求分頁管理方式
上一節 : 操作系統---內存管理(上)
大綱 :
基本分頁存儲管理
頁框和頁面
思想 : 把內存分為一個個相等的小分區, 再按照分區大小把進程拆分成一個個小部分.
-
頁框 :
-
頁面 :
注意區分頁框和頁面的概念, 頁框是針對內存的, 頁面是針對進程的
地址轉換的實現
- 特點 : 頁面離散存放, 但是頁面內部連續存放
- 訪問邏輯地址A : ( 重點 )
- 確定邏輯地址A的 " 頁號 " P
- 找到P號頁面在內存中的起始地址 ( 需要查找頁表 )
- 確定邏輯地址A的 " 頁內偏移 " W
- 邏輯地址 A的物理地址 = P號頁面在內存中的起始地址 + 頁內偏移量W
頁號和頁內偏移量
e.g.
為了方便計算頁號和頁內偏移量, 頁面大小一般設置為2的整數冪( why ? ) :
( 妙啊 )
頁表
tips : 頁表中的頁號是"隱含"的, 可以不占用存儲空間
e.g.
假設某系統物理內存大小為 4GB, 頁面大小為 4KB, 則
每個頁表項至少應該為多少字節?
- 內存塊大小=頁面大小=4KB= $ 2^{12} $B
- 4GB 的內存總共會被分為$ \frac{ 2^{32} }{ 2^{12} } = 2^{20} $個內存塊
- 內存塊號的范圍應該是 0 ~ $ 2^{20} -1 $
- 內存塊號至少要用 20 bit 來表示
- 至少要用3B來表示塊號(3*8=24bit)
(但是, 為了方便頁表的查詢, 常常會讓一個頁表項占更多的字節, 使得每個頁面恰好可以裝得下整數個頁表項)
- 如何理解 "頁號是隱含的" :
基本地址變換機構
框圖 : ( 重點 ! )
步驟總結 :
-
根據邏輯地址計算出頁號和頁內偏移量
-
判斷頁號是否越界
-
查詢頁表, 找到頁號對應的頁表項, 確定頁面存放的內存塊號
-
用內存塊號和頁內偏移量得到物理地址 ( 頁表長度*物理塊號 + 頁內偏移 = 物理地址 ( 計算機直接采用拼接物理塊號和頁內偏移的方式得到物理地址 ) )
-
訪問目標單元
( 一共需要訪問兩次內存 : 第一次用來查頁表, 第二次用於訪問目標內存單元 )
具有快表的地址變換機構
局部性原理
-
時間局部性
如果執行了程序中的某條指令, 那么不久之后這條指令很有可能再次執行; 如果某個數據被訪問過, 不久之后該數據很可能再次被訪問
( 程序中存在大量的循環 )
-
空間局部性
一旦程序訪問了某個存儲單元, 在不久之后, 其附近的存儲單元也很有可能被訪問到
( 很多數據在內存中連續存放 )
快表(TLB)
快表又成為聯想寄存器(TLB), 是一種訪問速度比內存塊很多的高速緩沖存儲器, 用來存放當前訪問的若干頁表項, 以加速地址變換的過程. 與此對應的, 內存中的頁表常稱為慢表.
步驟總結 :
快表與基本地址變換機構的比較 :
tips : TLB 和 普通 Cache 的區別——TLB 中只有頁表項的副本, 而普通 Cache 中可能會有其他各種數據的副本
兩級頁表
單級頁表存在的問題 :
- 由於頁號隱式表示, 所以要根據頁號查詢頁表需要 :
K 號頁對應的頁表項存放位置 = 頁表始址 + K * 4
要在所有的頁表項都連續存放的基礎上才能用這種方法找到頁表項
- 同時, 由局部性原理可知, 很多時候, 進程在一段時間內只需要訪問某幾個頁面就可以正常運行了, 因此沒有必要讓整個頁表都常駐內存
解決 : 把頁表再分頁並離散存儲, 然后再建立一張頁表記錄頁表各個部分的存放位置, 稱為頁目錄表, 或稱外層頁表, 或稱頂層頁表.
e.g.
關於頁表常駐內存的解決 -- ( 虛擬存儲技術 ) , 在頁表項中增加一個標志位, 用於表示該頁面是否已經調入內存
注意:
-
如果采用多級頁表機制, 各級頁表不能超過一個頁面
-
兩級頁表的訪存次數分析 :
n級頁表訪存次數為n+1次: ( 以2級頁表為例 )
- 訪問內存中的頁目錄表 ( 頂級頁表 )
- 訪問內存中的二級頁表
- 訪問目標內存單元