堆與記憶體管理

2021-10-06 17:03:30 字數 977 閱讀 5868

當程式對堆的操作比較頻繁的時候,使用系統呼叫的方式向核心索要空間的代價太大。比較好的做法是向作業系統申請一塊適當大小的額堆空間,然後又程式自己管理這塊空間,所以管理空間分配的往往時程式的執行庫。執行庫相當於零售商,從核心批發了較大的堆空間,然後零售給程式使用。

linux下的程序堆管理提供了兩種堆空間分配方式,即兩個系統呼叫:brk()系統呼叫和mmap()系統呼叫。

brk():

int brk(void* end_data_segment)
brk()的作用是設定程序資料段的結束位址,它可以擴大或者縮小資料段(.data 和.bss合在一起統一稱為資料段)。擴大出的空間可以被程式當作堆空間使用。

mmap():

void* mmap(

void *start, //需要申請空間的起始位址

size_t length, //長度

int prot, //空間許可權(r?w?x?)

int flags, //對映型別(檔案對映還是匿名空間)

int fd, //檔案描述符

off_t offset); //檔案偏移

mmap()它向核心申請一段虛擬位址空間,這段空間也可以對映到某個檔案(設計的初衷),當它不將位址空間對映到某個檔案的時候,這段空間叫做「匿名空間」,匿名空間可以拿來做為堆空間使用。

glibc 中malloc使用以上兩種系統呼叫為程式分配堆空間。小於128kb的請求來說,malloc會從現有的堆空間裡按照堆分配演算法為其分配一塊空間並且返回;對於大於128kb的請求來說,他會使用嗎mmap()函式為它分配一塊匿名空間,然後在這個匿名空間中為使用者分配空間。

q&a:

q:呼叫malloc會不會最後呼叫到系統呼叫或者api?

a:取決於當前程序預先申請的大小夠不夠為請求分配,如果夠的話,並不會涉及系統呼叫。如果不夠則需要通過系統呼叫從作業系統獲取空間。

堆記憶體管理

堆記憶體是 段當中的其中一段,特點就是大,但不能與識別符號建立聯絡,只能與指標配合使用 c語言沒有提供管理堆記憶體的語句,而是標準庫提供了一套管理記憶體的函式 功能 從堆記憶體中分配記憶體 引數 size 所申請的位元組數,一般使用 sizeof 計算 返回值 所申請的記憶體的首位址 注意 1 如果...

記憶體管理解析 1 記憶體對映與堆記憶體管理

目錄 一.預備知識 1.虛擬記憶體位址和物理記憶體位址 2.頁與位址構成 3.記憶體頁與磁碟頁 二.linux程序級記憶體管理 1.記憶體排布 2.heap 記憶體模型 3.堆記憶體管理實現原理 為了簡單,現代作業系統在處理記憶體位址時,普遍採用虛擬記憶體位址技術。即在匯程式設計序 或機器語言 層面...

堆記憶體的管理

1.1 對於堆的管理,核心提供了兩個系統呼叫brk和mmap。brk 用於更改堆頂位址,mmap則為程序分配虛擬位址空間。1.2 當程序向glibc申請記憶體時,如果申請的記憶體的數量大於閥值的時候,glibc會採用mmap為程序分配一塊虛擬位址空間,而不是採用brk來擴充套件棧頂的指標。1.2.1...