Linux記憶體管理 二

2021-09-24 04:28:56 字數 988 閱讀 3021

記憶體的分配與**

在程式中申請堆上的記憶體使用 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這塊虛擬位址記憶體對應的物理記憶體是不會被分配的。

Linux記憶體管理之二 記憶體節點和記憶體分割槽

uma和numa uma uniform memory access 即一致性記憶體訪問。這種情況下,cpu訪問記憶體的任何位置,代價都是一樣的。numa non uniform memory access 即非一致性記憶體訪問。這種情況下,cpu訪問不同位置的記憶體,代價是不一樣的。在多cpu情況...

記憶體管理二

發現兩篇記憶體池的博文,博文位址如下,寫的很好,能避免記憶體碎片和記憶體洩露問題,比我這個玩具 要好很多,大家可以看看 在我們做專案的時候,經常會分配了記憶體,然後卻忘了釋放,造成記憶體洩漏的問題。以下 可以實現在 退出的時候自動釋放之前申請但未釋放的記憶體。其原理是 用乙個雙向鍊錶維護申請的記憶體...

二 記憶體管理

1 前言 redis記憶體分配庫支援jemalloc linux預設 tcmalloc libc 非linux預設 編譯方式參考makefile。三種記憶體分配方式的比較待以後總結 2 adlist.h adlist.c 基本資料結構是帶頭結點的雙向鍊錶 非迴圈 呼叫依賴zmalloc.h zmal...