Linux虚拟内存和进程虚拟地址空间简述
后臺開發經常會問此類問題,雖說難度不大,但是知道和不知道還是有區別的。以下的內容總結自《深入理解Linux內核》第一章,僅僅是簡述,沒有深入研究,畢竟內存管理這一塊內容超級多,感興趣的同學可以去啃啃這本書。
所有新近的Unix系統都提供了一種有用的抽象,叫虛擬內存(virtual memory)。虛擬內存作為一種邏輯層,處于應用程序的內存請求與硬件內存管理單元(Memory Management Unit, MMU)之間。虛擬內存有很多用途和優點:
- 若干個進程可以并發地執行。
- 應用程序所需內存大小大于可用物理內存時也可以運行。
- 程序只有部分代碼裝入內存時進程也可以執行它。
- 允許每個進程訪問可用物理內存的子集。
- 進程可以共享庫函數或程序的一個單獨內存映像。
- 程序是可重定位的,也就是說,可以把程序放在物理內存的任何地方。
- 程序員可以編寫與機器無關的代碼,因為他們不必關心物理內存的組織結構。
虛擬內存子系統的主要成分是虛擬地址空間(virutal address space)的概念。進程所用的一組內存地址不同于物理內存地址。當進程使用一個虛擬地址時,內核和MMU協同定位其在內存中的實際物理位置。
現在的CPU包含了能自動把虛擬地址轉換成物理地址的硬件電路。為了達到這個目標,把可用RAM劃分成4KB或8KB的頁框(page frame),并且引入一組頁表來指定虛擬地址和物理地址之間的對應關系。這些電路使得內存分配變得簡單,因為一塊連續的虛擬地址請求可以通過分配一組非連續的物理地址頁框而得到滿足。
2.? ? ? ? 進程虛擬地址空間處理
進程的虛擬地址空間包括了進程可以引用的所有虛擬內存地址。內核通常用一組內存區描述符(mm_struct)描述進程虛擬地址空間。例如,當進程通過exec()類系統調用開始某個程序的執行時,內核分配給進程的虛擬地址空間由以下幾個內存區組成:
- 程序的可執行代碼。
- 程序的初始化數據。
- 程序的未初始化數據。
- 初始程序棧(即用戶態棧)
- 所需共享庫的可執行代碼和數據(此部分并不實際拷貝,僅僅時映射)
- 堆(由程序動態請求的內存)
所有現代Unix操作系統都采用了所謂請求調頁(demand paging)的內存分配策略。有了請求調頁,進程可以在它的頁還沒有在內存時就開始執行。當進程訪問一個不存在的頁時,MMU產生一個異常:異常處理程序找到受影響的內存區,分配一個空閑的頁,并用適當的數據把它初始化。同理,當進程通過malloc或者brk系統調用動態的請求內存時,內核僅僅修改進程的堆內存區的大小。只有試圖引用進程的虛擬內存地址而產生異常時,才給進程分配頁框。
參考目錄:
1. 《深入理解Linux內核》
2. 《Linux設備驅動程序》???????
=============================================================================================
Linux應用程序、內核、驅動、后臺開發交流討論群(745510310),感興趣的同學可以加群討論、交流、資料查找等,前進的道路上,你不是一個人奧^_^。
?
?
總結
以上是生活随笔為你收集整理的Linux虚拟内存和进程虚拟地址空间简述的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 发生保险事故谁不能索赔
- 下一篇: 花呗还款后额度没恢复