參考:小林coding
虛擬內存存在的目的?
為了能夠同時運行多個進程同時進程之間互不干擾
虛擬地址通過MMU找到物理地址
物理內存怎么映射的?
物理內存的映射方法主要有兩種,內存分段和內存分頁
內存分段
把程序的不同區,分段映射
會存在問題:內存碎片、內存交換效率低
內存碎片很好理解,解決辦法是:
先寫入硬盤,再讀回內存,位置都是緊貼在一起
內存交換效率低
每次內存交換都要交換一個程序的段,會導致交換效率低
內存分頁
Linux下一個頁大小是4KB
頁表存儲在內存中,MMU將虛擬內存轉成物理內存地址
流程:
- 進程訪問的虛擬地址在頁表內查不到,此時會出現缺頁異常
- 進入系統內核空間分配物理內存,更新進程頁表
內存不夠的情況:
- 會把最近沒有使用的頁內存釋放,寫入硬盤(換出)
- 需要時再加載回來(換入)
內存分頁映射
如果只用一個頁表,那么在進程增多時,頁表的大小會特別大
多級頁表
多級頁表的一級頁表可以覆蓋整個內存空間
如果某個一級頁表項沒有被用到,二級頁表就不會被創建
需要時才會創建。
64位操作系統的頁表分級:
全局頁目錄項PGD
上層頁目錄項PUD
中間頁目錄項PMD
頁表項PTE
TLB
頁表cache
把最常訪問的頁表存儲到訪問速度更快的cache
稱為頁表緩存,快表
CPU 在尋址時,會先查 TLB,如果沒找到,才會繼續查常規的?表。
段頁式內存管理
先劃成段,再從段里劃成頁
Linux內存管理
linux使用頁式內存管理
虛擬內存地址分為內核空間和用戶空間
所有進程的虛擬地址中的內核空間地址指向同一物理內存空間
用戶空間
分為:
- 程序文件段,.text
- 已初始化數據段,.data
- 未初始化數據段,.bss
- 堆段
- 文件映射段
- 棧段