內存管理的一些基本概念:
html
地址
linux
1)邏輯地址:指由程序產生的與段相關的偏移地址部分。在C語言指針中,讀取指針變量自己值(&操做),實際上這個值就是邏輯地址,它是相對於你當前進程數據段的地址。程序員
2)線性地址:段中的偏移地址(邏輯地址),加上相應段的基地址就生成了一個線性地址。ide
3)物理地址:放在尋址總線上的地址。函數
4)虛擬地址:保護模式下段和段內偏移量組成的地址,而邏輯地址就是代碼段內偏移量,或稱進程的邏輯地址。ui
內存管理主要解決如下問題:spa
進程的地址空間隔離;.net
提升內存的使用效率;unix
程序運行時重定位問題;指針
如今的內存管理方法就是在程序和物理內存之間引入了虛擬內存這個概念。虛擬內存位於程序和物理內存之間,程序只能看到虛擬內存,不再能直接訪問物理內存。每一個進程都有本身的進程地址空間,這樣就作到了進程隔離。
既然有了虛擬內存,解決從虛擬地址映射到物理地址,主要使用分段和分頁兩種該技術。
分段(邏輯地址轉化爲線性地址):將程序所須要的內存地址空間大小的虛擬空間映射到物理地址空間,虛擬空間中的每一個字節對應於實際空間中的每一個字節。這個映射過程由軟件來設置映射的機制,實際轉換由硬件來完成。而分段機制解決了上述1和3的問題。
分頁(將線性地址轉換爲物理地址):分頁是把內存地址空間分爲若干個很小的固定大小的頁,每一頁大小由內存決定,通常頁大小爲4KB。
分段和分頁的區別:
頁是信息的物理單位,分頁是爲了實現離散分配方式,以減小內存的外零頭,提升內存利用率或者能夠說分頁僅僅是由系統管理的須要,而不是用戶管理的須要。段是信息的邏輯單位,它含有一組其意義相對完整的信息。分段的目的是爲了更好地知足用戶的須要;
頁的大小固定且由系統決定,把邏輯地址劃分爲頁號和頁內地址兩部分,由硬件實現。段的長度不固定,且決定於用戶所編寫的程序,一般由編譯系統在對源程序進行編譯時根據信息的性質來劃分。
頁式系統地址空間時一維的,即單一的線性地址空間,程序員只須要利用一個標識符,便可表示一個地址。分段的做業地址空間是二維的,程序員在標示一個地址時,既需給出段名,又須要給出段內地址。
下面是一個進程調用內存的大體過程:
首先APP1經過fork,execute,nmap等函數建立進程;
malloc或brk等函數在虛擬內存上動態分配一段空間爲APP1使用;
劃分虛擬內存以後,此時並無分配實際的物理內存。(延遲分配)
當程序真正使用這塊內存,纔會產生請頁機制發生請頁請求;
物理內存會創建對應的頁表;
參考資料:
Linux內存管理基本概念:
http://dongxicheng.org/os/linux-memory-management-basic/
linux內存管理:
http://www.cnblogs.com/autum/archive/2012/10/12/linuxmalloc.html
Linux中的內存管理: