首页 文章

malloc可以分配的最大内存

提问于
浏览
40

我试图在我的机器(1 Gb RAM 160 Gb HD Windows平台)上计算出最大程度上可以使用多少内存 .

我读到malloc可以分配的最大内存仅限于物理内存(堆上) .

此外,当程序超过内存消耗到某个级别时,计算机将停止工作,因为其他应用程序无法获得所需的足够内存 .

所以要确认一下,我在C写了一个小程序:

int main(){  
    int *p;
    while(1){
        p=(int *)malloc(4);
        if(!p)break;
    }   
}

我希望有一段时间内存分配失败并且循环会中断,但是我的计算机挂起,因为它是一个无限循环 .

我等了大约一个小时,最后我不得不强行关闭电脑 .

一些问题:

  • malloc是否也从HD分配内存?

  • 上述行为的原因是什么?

  • 为什么在任何时候都没有循环中断?

  • 为什么没有分配失败?

7 回答

  • -1

    第一次将任何大小分配给* p时,每次下次将该内存保留为未引用时 . 这意味着

    您的程序一次只分配4个字节的内存

    . 那么你怎么能使用整个RAM,这就是 SWAP device( temporary space on HDD) 没有讨论的原因 . 我知道一种内存管理算法,当没有一个程序引用内存块时,该块有资格为程序内存请求分配 . 这就是为什么你只是忙着 RAM Driver 并且's why it can't给予机会服务其他程序 . 这也是一个悬空参考问题 .

    Ans:您最多可以分配RAM大小的内存 . 因为没有程序可以访问交换设备 .

    我希望你的所有问题都得到满意的答案 .

  • 23

    我读到malloc可以分配的最大内存仅限于物理内存(堆上) .

    错误:大多数计算机/操作系统支持虚拟内存,由磁盘空间支持 .

    一些问题:malloc是否也从HDD分配内存?

    malloc 询问操作系统,反过来可能会使用一些磁盘空间 .

    上述行为的原因是什么?为什么循环在任何时候都没有中断?为什么没有分配失败?

    你刚才要求的次数太少:最终循环会中断(在你的机器由于虚拟物理内存和物理内存的大量过剩而导致爬行速度变慢,以及随之而来的超级频繁磁盘访问,这个问题被称为“颠簸” “)但在此之前它已经耗尽了你的耐心 . 尝试获取例如一次一兆字节 .

    当程序超过内存消耗到某个级别时,计算机将停止工作,因为其他应用程序无法获得足够的内存 .

    总停止不太可能,但是当通常需要几微秒的操作最终花费(例如)几十毫秒时,这四个数量级当然可以使感觉好像计算机基本停止了,通常需要什么一分钟可能需要一个星期 .

  • 3

    我知道这个帖子已经老了,但是对于任何愿意自己试一试的人来说,请使用此代码剪断

    #include <stdlib.h>
    
    int main() {
    int *p;
    while(1) {
        int inc=1024*1024*sizeof(char);
        p=(int*) calloc(1,inc);
        if(!p) break;
        }
    }
    

    $ gcc memtest.c
    $ ./a.out
    

    在运行时,此代码填充RAM,直到被内核杀死 . 使用calloc而不是malloc来阻止"lazy evaluation" . 从这个主题采取的想法:Malloc Memory Questions

    这段代码迅速填满了我的RAM(4Gb),然后在大约2分钟内我的20Gb交换分区才死亡 . 当然是64位Linux .

  • 5

    malloc 做自己的内存管理,自己管理小内存块,但最终它使用Win32 Heap functions来分配内存 . 您可以将 malloc 视为"memory reseller" .

    Windows内存子系统包括物理内存(RAM)和虚拟内存(HD) . 当物理内存变得稀缺时,某些页面可以从物理内存复制到硬盘驱动器上的虚拟内存 . Windows透明地执行此操作 .

    默认情况下,虚拟内存已启用,并将消耗HD上的可用空间 . 因此,您的测试将继续运行,直到它为该进程分配了全部虚拟内存(32位窗口上为2GB)或填满了硬盘 .

  • 46

    试试这个

    #include <stdlib.h>
    #include <stdio.h>
    
    main() {
        int Mb = 0;
        while (malloc(1<<20)) ++Mb;
        printf("Allocated %d Mb total\n", Mb);
    }
    

    包括stdlib和stdio .
    此摘录取自 deep c secrets .

  • 2

    我实际上并不知道为什么会失败,但需要注意的一点是`malloc(4)“实际上可能不会给你4个字节,所以这种技术并不是找到最大堆大小的准确方法 .

    我从我的问题here中找到了这个 .

    例如,当你声明4个字节的内存时,直接在你的内存之前的空间可以包含整数4,作为内核的指示你要求的内存量 .

  • 6

    根据C90标准,您可以保证至少可以获得一个32 kBytes的对象,这可能是静态,动态或自动内存 . C99保证至少64 kBytes . 有关任何更高的限制,请参阅编译器的文档 .

    此外,malloc的参数是size_t,该类型的范围是[0,SIZE_MAX],因此您可以请求的最大值是SIZE_MAX,该值在实现时会有所不同,并在 <limits.h> 中定义 .

相关问题