2014-11-02 75 views
1

我想知道有多少最大內存可以分配給malloc()的進程。sbrk,malloc - 可以分配的最大內存

所以要點是:

start = sbrk(0); 
malloc(1); /* so space is given to the data segment */ 
end = sbrk(0); /* start != end at this point */ 

/* Try to allocate in chunks as much as possible. */ 
while (end == sbrk(0)) { 
    malloc(1048576); 

    if (end == sbrk(0)){ 
     maxMemory = maxMemory + 1048576; 
    } 
} 

return maxMemory; 

所以,我不明白的事情是:

如果你這樣做:

start = sbrk(0); 
malloc(1); 
end = sbrk(0); 

OK,結束=啓動

但是:

start = sbrk(0); 
malloc(1048576); 
end = sbrk(0); 

開始==端

因此,基本上,該程序中斷(SBRK(0))不與較大的值移動。所以給定的時間會持續很長一段時間,直到sbrk(0)移動並且我得到一個非常大的〜68gb的最大值。

我認爲任何malloc最初都會移動數據段,但事實並非如此。有人可以解釋爲什麼它沒有(它分配它在哪裏?)和/或我做錯了什麼?

+0

sbrk()函數僅用於malloc系列函數中。所以不應該直接在用戶函數中調用。 – user3629249 2014-11-02 22:21:04

+0

這行:malloc(1);導致.heap段的幾個字節,而不是.data段。它還會導致內存泄漏,因爲返回的分配內存指針丟失。 – user3629249 2014-11-02 22:22:33

+0

希望結束被定義爲void *希望maxmemory被定義爲(32位系統)int maxmemory = 0或(64位系統)long long int maxmemory = 0; – user3629249 2014-11-02 22:38:09

回答

2

glibc malloc implementation分配使用mmap()爲較大的塊:

通常,malloc()函數從堆中分配內存,並調整大小 根據需要堆的,使用SBRK(2)。當分配大於MMAP_THRESHOLD字節的存儲塊的塊 時,glibc malloc() 實現使用mmap(2)將存儲器分配爲私有匿名映射 。 MMAP_THRESHOLD默認爲128 kB,但使用mallopt(3)可調整爲 。使用mmap(2)執行的分配不受RLIMIT_DATA資源限制(參見getrlimit(2))影響 。

這個閾值可以通過設置M_MMAP_THRESHOLD使用mallopt()進行調整,但請注意,該庫的更新版本默認情況下動態調整這個門檻:

注:目前,glibc的默認情況下使用動態MMAP門檻。閾值的初始值是128 * 1024,但是當塊大於 而不是當前閾值並且小於或等於 時釋放DEFAULT_MMAP_THRESHOLD_MAX,則將閾值向上調整爲 以達到釋放塊的大小。當動態mmap閾值處於 效果中時,修剪堆的閾值也會動態調整爲動態mmap閾值的兩倍。如果設置了M_TRIM_THRESHOLD, M_TOP_PAD,M_MMAP_THRESHOLD或M_MMAP_MAX參數中的任何一個,則禁用mmap閾值的動態調整 。