计算可由malloc()完成的最大分配后的混乱

时间:2014-02-20 22:55:26

标签: c linux malloc

我在Ubuntu上使用C运行以下代码。它计算操作系统可以通过malloc()分配的千兆字节数。

#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个来自哪里?

2 个答案:

答案 0 :(得分:2)

这是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中的说明。

答案 1 :(得分:0)

操作系统允许您分配比可用内存更多的内存。如果您实际尝试使用内存,它将会耗尽。

如果您想看到它耗尽,请尝试在每次成功memset后对内存执行malloc