簡體   English   中英

為什么malloc沒有“用完”計算機上的內存?

[英]Why is malloc not “using up” the memory on my computer?

因此,我有一個分配256 MB內存的程序,在用戶按下ENTER鍵后,它將釋放內存並終止。

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    char *p, s[2];

    p = malloc(256 * 1024 * 1024);
    if ( p == NULL) 
        exit(1);

    printf("Allocated"); 
    fgets(s, 2, stdin);
    free(p);
    return 0;
}

我多次運行了該程序並將它們分別作為背景,直到不再有足夠的內存可以分配。 但是,那永遠不會發生。 我運行了linux top命令,即使多次運行該程序,可用內存也不會減少多達256 MB。

但是,另一方面,如果我使用calloc而不是malloc則存在巨大的差異:

p = calloc(256 * 1024 * 1024, 1);

現在,如果我運行該程序並使其后台運行,然后重復執行,則每次運行它時,可用內存都會減少256 MB。 為什么是這樣? 為什么malloc不會導致可用的空閑內存改變,而calloc會改變?

malloc() 使用內存。 它分配它。

分配內存后,通過分配一些數據來使用它。

size_t Size = 256 * 1024 * 1024;
p = malloc(Size);
if (p != NULL) {
  memset(p, 123, Size);
}

某些平台實現malloc()的方式是,在訪問該字節(或更可能是字節組或字節的“頁”中的某個字節)之前,不會發生內存的物理消耗。

calloc()可能會也可能不會真正使用內存。 系統可以大量內存映射到相同的物理歸零內存,至少直到數據變得有趣為止。 請參見為什么malloc + memset比calloc慢?

內存可能沒有真正可用,尤其是在示例中您沒有使用p做任何事情,只是檢查它是否為NULL 來自man malloc

默認情況下,Linux遵循樂觀的內存分配策略。 這意味着,當malloc()返回非NULL ,不能保證內存確實可用。 萬一發現系統內存不足,OOM殺手將殺死一個或多個進程。 有關詳細信息,請參閱的描述/proc/sys/vm/overcommit_memory/proc/sys/vm/oom_adjproc(5)和Linux內核源文件文檔/vm/overcommit-accounting

您的系統†上的calloc實際上是通過清除內存來觸摸內存的,在許多系統上,直到分配進程觸摸到該內存后,才真正分配(因此“用完”)內存。 因此,僅當您使用好malloc它才“使用”內存。

† 看評論

暫無
暫無

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

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