【问题标题】:Malloc Memory QuestionsMalloc 内存问题
【发布时间】:2011-05-21 22:46:49
【问题描述】:

首先我注意到,当我使用 malloc 内存和 calloc 时,内存占用是不同的。我正在处理几 GB 的数据集。这个数据可以是随机的。

我希望我可以分配大量内存并将其中的任何随机数据转换为浮点数。但是,查看进程查看器中的内存占用量,显然没有占用内存(与我看到大脚印的 calloc 相比)。我运行了一个循环将数据写入内存,然后我看到内存占用量攀升。 我是否正确地说直到我初始化内存才真正声明它?

最后,在我通过了 1024*1024*128 字节(进程查看器中为 1024 MB)之后,我开始出现段错误。然而,Calloc 似乎将全部初始化为 1 GB。 为什么我在 for 循环中使用 malloc 在此数字 128MB 初始化内存时出现段错误,为什么内存占用显示为 1024MB?

如果 malloc 从内存中大量读取,然后从中读取我会得到什么(因为进程查看器在我初始化之前几乎没有显示足迹)?

最后有什么办法让我分配超过 4GB 的空间吗?我正在测试内存层次结构的性能。

#2 的代码:

    long long int i;
    long long int *test=(long long int*)malloc(1024*1024*1024);
    for (i=0;i<1024*1024*128;i++)
            test[i]=i;

    sleep(15);

【问题讨论】:

  • Linux 使用“乐观内存分配策略”。一些信息:linux.die.net/man/3/malloc
  • 直到我初始化它才真正声明内存是正确的,这是惰性评估的一个特例,它由操作系统处理。但是,第二个假设 1024*1024*128 bytes == 1Gb 是错误的。
  • @ruslisk - 我没有假设 1GB - 进程查看器显示 1GB 我在第二个关系中询问为什么它是 1GB,而内存只要求 128MB。感谢您的消息来源。这清除了一些事情。
  • 看看这个来解释你所看到的opsmonkey.blogspot.com/2007/01/linux-memory-overcommit.html。这称为内存过度使用。
  • @Joshua:发布一些代码。

标签: c linux gcc malloc


【解决方案1】:

一些注意事项:

  1. 正如 cmets 所指出的,在您使用它之前,Linux 不会真正分配您的内存。
  2. 当您使用 calloc 而不是 malloc 时,它会将您请求的所有内存清零。这相当于使用它。

【讨论】:

    【解决方案2】:

    1- 如果您在 32 位计算机上工作,则分配给它的变量不能超过 2GB。

    2- 如果您在 64 位机器上工作,您总共可以分配尽可能多的 RAM+Swap 内存,但是,为一个变量分配所有内存需要大量的后续内存块,这可能是不可用的。尝试使用链表,其中每个元素仅分配 1 MB,您可以获得更高的总内存分配。

    3- 正如您和 Sharth 所说,除非您使用内存,否则 linux 不会分配它。

    【讨论】:

    • 您不必将分配的内存分成块。虽然在 32 位系统上很难找到一个大的连续地址空间,但在 64 位上这不是问题。
    【解决方案3】:

    您的#2 因段错误而失败,因为sizeof(long long int) &gt; 8 或因为您的 malloc 返回 NULL。如果您请求 1 GB 的 RAM,这是很有可能的。

    关于 #2 的更多信息。从您的 128 MB 评论中,我了解到您可能没有意识到发生了什么。因为您将数组指针声明为long long int,所以每个数组元素的大小为 8 个字节。 1024/8 == 128 所以这就是你的循环工作的原因。反正我试过的时候就这样了。

    【讨论】:

      【解决方案4】:

      示例代码中的 for 循环实际上涉及 1GB 内存,因为它索引 128*1024*1024 long longs,每个 long long 为 8 个字节。

      【讨论】:

        猜你喜欢
        • 2020-06-22
        • 2016-05-17
        • 2019-04-28
        • 1970-01-01
        • 1970-01-01
        • 2021-01-26
        • 1970-01-01
        • 1970-01-01
        • 2014-09-06
        相关资源
        最近更新 更多