Malloc记忆问题

时间:2010-12-08 00:18:34

标签: c linux gcc malloc

首先,我注意到当malloc内存与calloc时,内存占用量不同。我正在使用几GB的数据集。这些数据是随机的。

我预计我可以只对大量内存进行malloc并读取其中的任何随机数据。然而,在进程查看器中查看内存占用量时,内存显然没有被声明(与我看到大脚印的calloc相比)。我运行循环将数据写入内存,然后我看到内存占用量上升。 我是否正确地说,在我初始化之前,实际上没有声明内存?

最后,当我通过1024 * 1024 * 128字节(进程查看器中为1024 MB)后,我开始获得段错误。然而,Calloc似乎初始化最大1 GB的全部数量。 为什么在使用大于128MB的malloc在for循环中初始化内存时会出现段错误?为什么内存占用量显示为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);

4 个答案:

答案 0 :(得分:7)

一些注意事项:

  1. 正如评论所指出的那样,在您使用它之前,Linux实际上并没有分配您的内存。
  2. 当您使用calloc而不是malloc时,它会将您请求的所有内存清零。这相当于使用它。

答案 1 :(得分:3)

1-如果您正在使用32位计算机,则不能为其分配超过2GB的变量。

2-如果您正在使用64位计算机,则可以分配RAM + Swap内存,但是,为一个变量分配所有内容需要一个可能无法使用的大量内存。尝试使用链表,其中每个元素仅分配1 MB,您可以实现更高的内存分配。

3-正如你和Sharth所说,除非你使用你的记忆,否则linux不会分配它。

答案 2 :(得分:1)

您的#2因为sizeof(long long int) > 8或因为您的malloc返回NULL而导致段错误失败。如果您要求1 GB的RAM,这是非常可能的。

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

答案 3 :(得分:1)

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