第十五講 基礎篇:Linux內存是怎么工作的(2020.6.8)
這一講相關的內容正好之前看csapp的時候總結了一下,可以直接貼出來作為總結了。
Linux的內存工作原理,這又是一個特別大的話題。一切向著盡量利用物理資源的方向在發展,
在沒有虛擬內存的世界里,所以的進程都能看到同一個物理內存在這種模式下如果有多個進程那么這個內存管理就很復雜了(在DSP,嵌入時系統中可能總共就一個程序這時候完全可以直接使用物理內存)。針對Unix這種多進程的系統后來就有了虛擬內存的概念。
虛擬內存 是硬件異常,硬件地址翻譯,主存,磁盤和內核軟件的完美交互,他為沒有進程提供一個很大的,一致的地址空間。
它將內存看成一個存儲在磁盤上很大的連續的空間,在主存中只保存活動區域,并根據需要在磁盤和主存之間來回傳遞數據,通過這種方式很好的使用了內存。
為每個進程提供了一致的地址空間,從而簡化了內存管理
每個進程的地址空間是獨立的,避免了進程之間在地址空間上的破壞
物理地址和虛擬地址
物理尋址(嵌入式設備/DSP設備):
虛擬尋址系統(現代處理器):
虛擬內存作為磁盤的高速緩存工具
DRAM 作為磁盤的緩存,通過虛擬內存來管理磁盤上的那個塊緩存到內存中來。
VP(virtual page):將虛擬內存分割成大小固定的塊
PP(physical page):物理頁(葉幀)
VP---->PP 關系
通過頁表(page table) 來判定一個虛擬頁是否緩存在DRAM中。如果命中就指向一個物理頁中, 如果不命中,系統必須判斷這個虛擬頁存放在磁盤的那個位置,在物理內存中選擇犧牲一個頁,將虛擬頁從磁盤復制到DRAM中,替換掉犧牲頁。
頁命中:
缺頁:
虛擬內存作為內存管理工具
虛擬內存除了作為磁盤的高速緩存之外,還作為Linux的內存管理工具,這樣Linux中的每個進程都有相同的的地址空間格式,兩個進程通過將虛擬頁面映射到相同的物理頁幀上是實現了共享內存。
虛擬內存作為內存保護的工具
地址翻譯
多級頁表:
linux 內存系統
內存分配與回收
標準庫中的malloc有兩種實現方式:
小塊內存(小于128k) 使用sbrk分配(釋放并不返還給系統,容易造成系統碎片(詳細見參考2))
大塊內存(大于128k) 使用mmap內存映射的方式分配(每次unmap之后都會返還給系統,所以每次mallo都會導致缺頁異常,內核的管理負擔增大)
系統回收內存三種方式
LRU
回收不常訪問的內存,把不常訪問的內存通過交換分區直接寫入磁盤
OOM
參考資料