【问题标题】:Confusion after counting maximum allocation that can be done by malloc()在计算 malloc() 可以完成的最大分配后感到困惑
【发布时间】:2014-02-20 22:55:25
【问题描述】:

我有以下在 Ubuntu 上以 C 语言运行的代码。它计算操作系统可以通过 malloc() 分配多少 GB。

#include <sys/types.h>
#include <sys/syscall.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main(){
    int count = 0;
    char* a;

    while (1){
        a = (char*)malloc(1024*1024*1024);
        if (a==NULL) break;
        count++;
    }

    printf("%d\n", count);

    return 0;
}

令人惊讶的是,在我的机器上运行时,它打印了超过 100,000 个。我觉得这太不合理了。我的 RAM 是 8GB,我的硬盘大约是 500 GB,这 100,000 是从哪里来的?

【问题讨论】:

标签: c linux malloc


【解决方案1】:

这是memory overcommit

[...]在默认的内存管理策略下,malloc() 基本上总是成功的,而 kenrel 假设您真的不会使用您刚刚请求的所有内存。 malloc() 将继续成功,但直到您真正尝试使用您分配的内存,内核才会“真正”分配它。 [...]

如果我们查看 Linux man page for malloc ,它会说(强调我的):

默认情况下,Linux 遵循乐观的内存分配策略。这意味着当 malloc() 返回非 NULL 时 并不能保证内存真的可用。 如果发现系统内存不足,一个或多个进程将被杀死OOM 杀手。

和:

更多信息请参见proc(5)中/proc/sys/vm/overcommit_memory和/proc/sys/vm/oom_adj的描述,以及Linux内核源文件Documentation/vm/overcommit-accounting。

【讨论】:

    【解决方案2】:

    操作系统允许您分配比它可用的更多的内存。如果你真的尝试使用内存,它就会用完。

    如果您想看到它用完,请尝试,例如,在每个成功的 malloc 之后在内存上执行 memset

    【讨论】:

    • 使用 echo 2 &gt; /proc/sys/vm/overcommit_memory 作为 root 禁用此功能,直到下次重新启动。
    猜你喜欢
    • 1970-01-01
    • 2013-02-17
    • 1970-01-01
    • 1970-01-01
    • 2016-10-10
    • 2012-10-31
    • 1970-01-01
    • 1970-01-01
    • 2012-09-18
    相关资源
    最近更新 更多