簡體   English   中英

brk(),sbrk()和realloc()函數之間的區別

[英]Difference between brk() , sbrk() and realloc() functions

我知道函數brk(),sbrk()用於重新分配內存。但它們與realloc()函數有什么不同?。給我編碼示例。

brksbrk是系統調用(在內核中實現),而mallocfreerealloc是用戶空間中的庫函數。 因此malloc等函數在內部使用brksbrk但提供了額外的功能(有關malloc更多詳細信息,請參閱man(2)以獲取有關brkman(3)的更多詳細信息。)。

brk只通過向內核提供指向程序可能使用的最大虛擬內存位置的指針,告訴內核程序想要使用多少內存。 但是你只有大塊內存。

malloc幫助您將這個巨大的內存塊細分為更小的部分。

示例代碼在這里沒有多大意義,因為brkmalloc在不同的級別上工作。 但你可以想一想如何實現一個非常簡單(和非線程安全)的mallocfree版本以及你在那里使用brk地方:

  1. 我們的原始malloc的基本數據結構是一個鏈表。
  2. 列表中的每個列表元素包含:
    1. 塊的大小
    2. 指向下一個元素的指針
    3. 如果塊正在使用中的標志
    4. 如果它是最后一個元素的標志
    5. 具有給定大小的字節數組
  3. 在每次調用中,malloc都會遍歷列表並檢查每個塊
    1. 如果該塊被標記為“未使用”
    2. 如果list元素的size字段最多與所需大小一樣大
  4. 如果malloc找到這樣的塊,它將:
    1. 將列表元素標記為已使用
    2. 調整list元素中的size字段
    3. 如果有足夠的空間,則在元素后面添加一個list元素,指向列表中的下一個元素(如果適用)
    4. 返回指向它找到的列表元素的字節數組的指針
  5. 如果malloc找不到這樣的列表元素,它就會
    1. 調用brk來增加我們從內核獲得的可用內存
    2. 將新元素添加到列表末尾,將大小設置為所需大小
    3. 將此元素標記為使用AND並作為最后一個元素
    4. 返回指向新創建的列表條目的字節數組的指針

正如@BasileStarynkevitch在評論中所說,作為brk的替代方法,您還可以使用mmap (使用fd=-1flags=MAP_PRIVATE|MAP_ANONYMOUS )來保留由交換文件支持的單個內存塊。 有關mmap的詳細信息,請參閱man(2)

在操作系統級別(至少在Unix模型中),程序文本,初始化和未初始化數據以及動態分配數據的“堆”都有一個很大的內存區域。 (堆棧是獨立的。)您可以使用brksbrk調整該區域的大小,但不能重新排列它,它總是連續的。 絕大多數進行動態內存分配的程序需要更靈活的東西。

mallocfreerealloc是C庫函數,可以為您提供更靈活的功能。 在下面,他們通過調用brk和/或sbrk從操作系統獲取內存,但隨后他們做了額外的處理,讓你分配(a)任意數量的(b)不同大小的塊,你可以(c)單獨返回到當你完成它們並且偶然地(d)重新調整大小時。

但是當你以free將內存返回到池中時,它通常只會回到池中,以后您的程序將來自malloc的調用將從中抽取; 內存通常不會返回給操作系統。

(很抱歉沒有提供任何示例代碼;我剛才沒有時間。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM