C 记忆问题

C 记忆问题,c,linux,gcc,malloc,C,Linux,Gcc,Malloc,首先,我注意到当我使用malloc内存和calloc时,内存占用是不同的。我正在处理几GB的数据集。这个数据可以是随机的 我希望我可以malloc大量内存并读取其中的任意随机数据,并将其转换为浮点。但是,在process viewer中查看内存占用情况时,内存显然没有被占用(与calloc相比,我看到了一个很大的脚印)。我运行了一个循环,将数据写入内存,然后我看到内存占用率上升我所说的在初始化内存之前不会实际声明内存,对吗? 最后,在我传递了1024*1024*128字节(ProcessView

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

我希望我可以malloc大量内存并读取其中的任意随机数据,并将其转换为浮点。但是,在process viewer中查看内存占用情况时,内存显然没有被占用(与calloc相比,我看到了一个很大的脚印)。我运行了一个循环,将数据写入内存,然后我看到内存占用率上升我所说的在初始化内存之前不会实际声明内存,对吗?

最后,在我传递了1024*1024*128字节(ProcessViewer中为1024MB)之后,我开始出现SEGFULTS。然而,Calloc似乎初始化了最大为1GB的全部容量在使用malloc以128MB的数字初始化for循环中的内存时,为什么会出现SEGFULTS?为什么内存占用显示1024MB?

如果malloc从内存中读取大量数据,然后从内存中读取数据,我会得到什么(因为在初始化之前,process viewer几乎不显示任何内存占用)?

最后,我有没有办法分配超过4GB的内存?我正在测试内存层次结构性能

#2的代码:

long-long-int-i;
long-long-int*test=(long-long-int*)malloc(1024*1024*1024);
对于(i=0;i一些注释:

  • 正如评论所指出的,Linux在您使用它之前实际上不会分配内存
  • 当您使用calloc而不是malloc时,它会将您请求的所有内存归零。这相当于使用它
  • 您的#2因segfault而失败,原因可能是
    sizeof(long-long-int)>8
    ,也可能是因为您的malloc返回了NULL。如果您请求的是1GB的RAM,这是非常可能的


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

    1-如果您在32位机器上工作,则不能有一个分配了超过2GB的变量

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


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

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

    linux使用“乐观内存分配策略”。一些信息:我直到我初始化它是正确的,它才真正被声明,这是一种特殊的惰性计算,由操作系统处理。但是,第二个假设,1024*1024*128字节==1Gb是错误的。@ruslisk-我没有假设1Gb-process viewer显示1Gb,我在第二个关系中问过为什么当内存仅声明128MB时它是1Gb。比ks的源代码。这澄清了一些问题。看看这个来解释你所看到的。这叫做内存过量。@Joshua:发一些代码。你不必把分配的内存分成块。虽然在32位系统上很难找到一个大的连续地址空间,但在64位上这不是问题。
        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);