【问题标题】:Why can I allocate arrays that are larger than my RAM?为什么我可以分配比我的 RAM 更大的数组?
【发布时间】:2018-04-25 10:41:42
【问题描述】:

我在malloc 通话中遇到了一个奇怪的问题。我正在开发一个使用巨大数组(以 GB 为单位的大小)的程序,并且在尝试使用 malloc 为数组分配内存时,我发现 malloc 是成功的,即使我分配的大小大于我的 RAM(即 64GB)。

见下面的代码:

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


#define Sixteen_G  16000000000

int main() {
    int *c = (int *)malloc(sizeof(int)*Sixteen_G);
    int *d = (int *)malloc(sizeof(int)*Sixteen_G);
    int *e = (int *)malloc(sizeof(int)*Sixteen_G);
    int *f = (int *)malloc(sizeof(int)*Sixteen_G);
    int *g = (int *)malloc(sizeof(int)*Sixteen_G);
    if(c == NULL)
            printf("c Allocation failed\n");
    if(d == NULL)
            printf("d Allocation failed\n");
    if(e == NULL)
            printf("e Allocation failed\n");
    if(f == NULL)
            printf("e Allocation failed\n");
    if(g == NULL)
            printf("e Allocation failed\n");
    else
            printf("All arrays allocated\n");
    return 0;
}

上述代码的输出是:

All arrays allocated

同样对大小为&gt;= 17GBmalloc 的单个调用失败,但对16GB 的多个调用正在通过。

当我的系统 RAM 大小只有 64GB 时,有人可以解释为什么 malloc 能够分配这么多内存,以及 malloc 在单次/多次调用中究竟是如何工作的

【问题讨论】:

  • else 只属于if(g == NULL) 支票,不属于其他支票。
  • 如果你告诉我们那是什么系统,有人可能会和你讨论你系统上特定的malloc 实现是如何做这些事情的。 C 语言规范本身并不涉及这个问题。
  • 至于你的问题,你说你的 RAM 大小是 64 GiB,但是是 physical 内存大小,还是 virtual 内存大小?
  • 我知道,但是打印可以没有别的
  • 此外,只要您不使用您分配的页面,某些系统(如 Windows IIRC)实际上允许您分配 更多 的可用虚拟内存。如果您开始写入页面并且无法换入,那么您将开始看到失败。

标签: c arrays memory memory-management


【解决方案1】:

您可能想要禁用memory overcommitment

(我真的不喜欢这个功能)

请参阅this 问题。

你应该编码和test against malloc failure

阅读有关virtual address space 的更多信息。另见this

【讨论】:

  • 感谢您的回答,我找到了一个关于 Linux 上过度使用的精彩页面。只是想在这里提一下,对于可能面临同样问题的其他人。 etalabs.net/overcommit.html
猜你喜欢
  • 2014-12-26
  • 2014-12-16
  • 2020-10-30
  • 2015-12-18
  • 2018-03-29
  • 2011-03-31
  • 2018-08-20
  • 2016-08-05
相关资源
最近更新 更多