Linux的內存管理機制

內存管理的一些基本概念:

地址


1)邏輯地址:指由程序產生的與段相關的偏移地址部分。在C語言指針中,讀取指針變量本身值(&操作),實際上這個值就是邏輯地址,它是相對於你當前進程數據段的地址。

2)線性地址:段中的偏移地址(邏輯地址),加上相應段的基地址就生成了一個線性地址。

3)物理地址:放在尋址總線上的地址。

4)虛擬地址:保護模式下段和段內偏移量組成的地址,而邏輯地址就是代碼段內偏移量,或稱進程的邏輯地址。



內存管理主要解決以下問題:


  1. 進程的地址空間隔離;

  2. 提高內存的使用效率;

  3. 程序運行時重定位問題;


現在的內存管理方法就是在程序和物理內存之間引入了虛擬內存這個概念。虛擬內存位於程序和物理內存之間,程序只能看到虛擬內存,再也不能直接訪問物理內存。每個進程都有自己的進程地址空間,這樣就做到了進程隔離。


既然有了虛擬內存,解決從虛擬地址映射到物理地址,主要使用分段和分頁兩種該技術。


  1. 分段(邏輯地址轉化爲線性地址):將程序所需要的內存地址空間大小的虛擬空間映射到物理地址空間,虛擬空間中的每個字節對應於實際空間中的每個字節。這個映射過程由軟件來設置映射的機制,實際轉換由硬件來完成。而分段機制解決了上述1和3的問題。

  2. 分頁(將線性地址轉換爲物理地址):分頁是把內存地址空間分爲若干個很小的固定大小的頁,每一頁大小由內存決定,一般頁大小爲4KB。




分段和分頁的區別:


  1. 頁是信息的物理單位,分頁是爲了實現離散分配方式,以減少內存的外零頭,提高內存利用率或者可以說分頁僅僅是由系統管理的需要,而不是用戶管理的需要。段是信息的邏輯單位,它含有一組其意義相對完整的信息。分段的目的是爲了更好地滿足用戶的需要;

  2. 頁的大小固定且由系統決定,把邏輯地址劃分爲頁號和頁內地址兩部分,由硬件實現。段的長度不固定,且決定於用戶所編寫的程序,通常由編譯系統在對源程序進行編譯時根據信息的性質來劃分。

  3. 頁式系統地址空間時一維的,即單一的線性地址空間,程序員只需要利用一個標識符,即可表示一個地址。分段的作業地址空間是二維的,程序員在標示一個地址時,既需給出段名,又需要給出段內地址。


下面是一個進程調用內存的大致過程:


  1. 首先APP1通過fork,execute,nmap等函數創建進程;

  2. malloc或brk等函數在虛擬內存上動態分配一段空間爲APP1使用;

  3. 劃分虛擬內存之後,此時並沒有分配實際的物理內存。(延遲分配)

  4. 當程序真正使用這塊內存,纔會產生請頁機制發生請頁請求;

  5. 物理內存會建立對應的頁表;

wKiom1WdJN2zN-uQAAJuN8RA0u8371.jpg





參考資料:

Linux內存管理基本概念:

http://dongxicheng.org/os/linux-memory-management-basic/ 

linux內存管理:

http://www.cnblogs.com/autum/archive/2012/10/12/linuxmalloc.html

Linux中的內存管理:

http://blog.chinaunix.net/uid-26611383-id-3761754.html 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章