Linux內存管理 二

內存的分配與回收

在程序中申請堆上的內存使用 malloc函數,在系統調用中可以調用 brk() 函數 和 mmap()函數

當申請的內存小於128kb(默認值) 的時候會調用brk()函數在heap上開闢內存,

當申請內存大於等於128kb(默認值) 的時候會調用mmap()函數在mmap映射區開闢內存

內存的回收調用free()函數 或 unmap()函數來釋放內存

函數的聲明:

int brk(void* end_data_segment)
void *mmap(void *start, size_t length, int port, int flags, int fd, off_t offset);
void *sbrk(intptr_t increment);

sbrk函數的功能和brk的功能類似。 sbrk的參數 increment 是紀錄需要增加(負數爲減少)的空間大小,返回的值是增加或減少後的數據段結束地址,這個函數的內部調用了brk函數。
 

在堆頂有一個指針 _edata 通過移動指針在heap段開闢內存,_edata指針向高地址推,brk分配的內存需要等到高地址內存釋放以後才能釋放,當最高地址空閒的內存超過128k的時候,內存會緊縮。也就是釋放虛擬地址空間的空閒內存。  當free的內存塊沒有超過128kb的時候,對應的虛擬地址空間內存和物理內存都沒有釋放,這塊內存是可以重用的,當再來一個合適大小的內存請求,可能剛被釋放的內存會通過malloc返回回去。

 

調用mmap分配的內存是在堆和棧中間分配一塊虛擬的地址內存(初始化爲0),mmap分配的內存可以單獨釋放,虛擬地址內存和物理內存會一起釋放。

 

當調用了malloc函數分配了內存,只會分配虛擬地址空間的內存,並不會分配對應的真實的物理內存,程序第一次訪問內存的時,會發生缺頁中斷,內核分配對應的物理內存,虛擬地址空間會和物理內存建立映射關係即虛擬地址映射,

如果malloc了一塊內存,程序從來都沒有訪問過這塊虛擬地址內存,那麼malloc這塊虛擬地址內存對應的物理內存是不會被分配的。

 

 

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