記憶體控制brk和sbrk

2021-09-10 18:49:06 字數 1170 閱讀 2085

比malloc更底層的記憶體控制,適合「記憶體空間大小不定」的場景,效率比malloc更高

函式原型

#include int brk(void *addr);

void *sbrk(intptr_t increment);

相關概念:通常將記憶體邊界稱為 program break 程式段

在program break的位置抬公升後,程式可以訪問新分配區域內的任何記憶體位址,而此時物理記憶體頁尚未分配

核心會在程序首次試圖訪問這些虛擬記憶體位址時自動分配新的物理記憶體頁

背景:brk和sbrk維護著同乙個指標

sbrk工作過程描述:

1.先判斷系統中的指標是否為null,為null,則找到乙個空閒的首位址,賦予給他,並將該位址返回,若不為null,則直接將該位址返回

2.判斷sbrk傳入的引數,是否存在,如果沒有,則對映乙個頁,在頁中分配size個位元組

3.同時將首位址+size,賦予給內部指標,通過內部指標來維護他

*具體作用*:

brk:分配空間,釋放空間,對引數中 addr 做絕對位置調整,調動指標左右移動,左移-釋放空間,右移-分配空間

即將記憶體頁的末尾移動到 addr 指標指向的位置

sbrk:以當前位置為開始,將記憶體頁的位置移動increment個偏移量

返回值:

如果成功,brk返回0,sbrk返回乙個指標

如果失敗,brk返回-1,sbrk返回乙個 (void*)-1,即也是-1

示例**

#include

#include

intisprimer

(int a)

}return0;

}int

main()

}//列印資料

pnow = phead;

// 從頭列印

while

(pnow!=

sbrk(0

))//如果不等於末尾的位址

brk(phead)

;// 將記憶體頁的邊界移到首位置,釋放空間

}

記憶體分配系統呼叫 brk和mmap

1 brk是將程序堆的最高位址指標往高位址推。2 mmap是在程序的虛擬位址空間中檔案對映區域 堆與棧中間 找一塊空閒的虛擬記憶體,通常是動態庫的對映等。這兩種方式都是分配虛擬記憶體。在malloc中的分配釋放記憶體也是通過brk和mmap這些系統呼叫實現的。malloc小於128k的記憶體時,使用...

12 記憶體控制

include int main 共享記憶體申請和使用示例 a.c include include define mapfilename text shared memory define buf size 0x1000 handle g hmapfile lptstr g lpbuff int m...

c記憶體控制

calloc 配置記憶體空間 相關函式 malloc,free,realloc,brk 表頭檔案 include 定義函式 void calloc size t nmemb,size t size 函式說明 calloc 用來配置nmemb個相鄰的記憶體單位,每一單位的大小為size,並返回指向第乙...