在上一篇文章中,我們有提到下圖黃色的連續記憶體空間(main_arena)即為 Heap。
Heap 是用來動態管理程式運行過程中的記憶體分配,主要透過 malloc() 和 free() 等函數來進行分配與釋放。本篇文章將說明如何申請與釋放 Heap 空間,並簡單介紹其基本操作機制。
當使用者呼叫 malloc() 來申請 Heap 空間時,glibc 會透過一定的機制按順序分配區域。Heap 主要用來分配程式執行過程中的動態記憶體,當程式需要更多空間時,系統會使用一段連續的記憶體區域來滿足這些需求。
malloc() 是 C/C++ 程式中最常見的記憶體分配函數,它接受一個參數,該參數表示需要分配的記憶體大小。當使用者執行 malloc() 時,glibc 會檢查目前可用的空閒記憶體區塊,並從中找到一個大小合適的區塊來滿足請求。如果有大小合適的區塊,malloc() 就會將該區塊分配給使用者。當目前的 Heap 空間無法滿足請求時,malloc() 會透過 brk() 或 mmap() 系統呼叫來擴展 Heap 空間,使其包含更多可用記憶體區域。
而使用者申請並正在使用的 Heap 區塊稱為 Allocated Chunk。
當不再需要使用某段記憶體時,會呼叫 free() 來釋放空間。free() 的主要功能是將已分配的記憶體區塊歸還給系統,並使該區塊可以再次被其他動態記憶體請求所使用。
當使用者呼叫 free() 來釋放記憶體時,glibc 會將該記憶體區塊標記為不再使用(空閒),這些區塊被稱為 Free Chunk。釋放後的區塊會加入一個以鏈結串列(Linked-list)形式管理的空閒區塊集合,這個集合稱為 Bin。
Bin 是 glibc 用來管理空閒記憶體區塊的機制。當記憶體被釋放後,不同大小的 Free Chunk 會進入對應的 Bin。這些 Bin 依據區塊大小進行分類,方便後續記憶體分配。