[英]Difference between brk() , sbrk() and realloc() functions
我知道函數brk(),sbrk()用於重新分配內存。但它們與realloc()函數有什么不同?。給我編碼示例。
brk
和sbrk
是系統調用(在內核中實現),而malloc
, free
, realloc
是用戶空間中的庫函數。 因此malloc
等函數在內部使用brk
和sbrk
但提供了額外的功能(有關malloc
更多詳細信息,請參閱man(2)以獲取有關brk
和man(3)的更多詳細信息。)。
brk
只通過向內核提供指向程序可能使用的最大虛擬內存位置的指針,告訴內核程序想要使用多少內存。 但是你只有一大塊內存。
malloc
幫助您將這個巨大的內存塊細分為更小的部分。
示例代碼在這里沒有多大意義,因為brk
和malloc
在不同的級別上工作。 但你可以想一想如何實現一個非常簡單(和非線程安全)的malloc
和free
版本以及你在那里使用brk
地方:
brk
來增加我們從內核獲得的可用內存 正如@BasileStarynkevitch在評論中所說,作為brk
的替代方法,您還可以使用mmap
(使用fd=-1
和flags=MAP_PRIVATE|MAP_ANONYMOUS
)來保留由交換文件支持的單個內存塊。 有關mmap的詳細信息,請參閱man(2) 。
在操作系統級別(至少在Unix模型中),程序文本,初始化和未初始化數據以及動態分配數據的“堆”都有一個很大的內存區域。 (堆棧是獨立的。)您可以使用brk
和sbrk
調整該區域的大小,但不能重新排列它,它總是連續的。 絕大多數進行動態內存分配的程序需要更靈活的東西。
malloc
, free
和realloc
是C庫函數,可以為您提供更靈活的功能。 在下面,他們通過調用brk
和/或sbrk
從操作系統獲取內存,但隨后他們做了額外的處理,讓你分配(a)任意數量的(b)不同大小的塊,你可以(c)單獨返回到當你完成它們並且偶然地(d)重新調整大小時。
但是當你以free
將內存返回到池中時,它通常只會回到池中,以后您的程序將來自malloc
的調用將從中抽取; 內存通常不會返回給操作系統。
(很抱歉沒有提供任何示例代碼;我剛才沒有時間。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.