malloc可以分配的最大内存
我试图弄清楚我的机器(1GB内存160GB高清Windows平台)可以最大限度地使用malloc。
我读了malloc可以分配的最大内存限于物理内存(在堆上)。
另外,当一个程序超过内存消耗到一定程度,计算机停止工作,因为其他应用程序没有得到足够的内存,他们需要。
所以要确认一下,我用C写了一个小程序:
int main(){ int *p; while(1){ p=(int *)malloc(4); if(!p)break; } }
我希望有一段时间,内存分配将失败,循环会中断,但我的电脑挂起,因为它是一个无限循环。
我等了大约一个小时,最后我不得不强行closures我的电脑。
一些问题:
- malloc是否也从HD分配内存?
- 上述行为的原因是什么?
- 为什么在任何时候都没有循环rest?
- 为什么没有分配失败?
我读了
malloc
可以分配的最大内存限于物理内存(在堆上)。
错误:大多数计算机/操作系统支持虚拟内存,由磁盘空间支持。
一些问题:
malloc
也从硬盘分配内存?
malloc
要求的操作系统,这反过来可能会使用一些磁盘空间。
上述行为的原因是什么? 为什么循环不休?
为什么没有分配失败?
你一次只要求太less:循环最终会打破(在你的机器慢慢爬行之后,由于虚拟与物理内存的大量过剩以及随之而来的超频磁盘访问,这个问题被称为“颠簸” “),但在此之前它已经耗尽了你的耐心。 尝试获得例如一次一兆字节。
当一个程序超过内存消耗到一定的水平,计算机停止工作,因为其他应用程序没有得到足够的内存,他们需要。
完全停止是不太可能的,但是当通常需要几微秒的操作结束时(例如)几十毫秒时,这四个数量级当然可以使得感觉就像计算机已经基本停止了,以及通常一分钟可能需要一个星期。
我知道这个线程是旧的,但是对于任何愿意自己尝试的人来说,都可以使用这个代码
#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来防止“懒惰评估”。 从这个线程采取的想法: Malloc内存问题
这段代码很快填满了我的RAM(4Gb),然后在大约2分钟内我的20Gb交换分区才死了。 64位Linux当然。
malloc
做自己的内存pipe理,自己pipe理小内存块,但最终它使用Win32 堆函数来分配内存。 你可以把malloc
想象成一个“内存分销商”。
Windows内存子系统包括物理内存(RAM)和虚拟内存(HD)。 当物理内存稀less时,可以将某些页面从物理内存复制到硬盘上的虚拟内存中。 Windows透明地做到这一点。
默认情况下,虚拟内存已启用,并将占用HD上的可用空间。 因此,您的testing将继续运行,直到它为进程分配了全部的虚拟内存量(32位窗口上的2GB)或填充硬盘。
尝试这个
main() { int Mb = 0; while ( malloc(1<<20)) ++Mb; printf("Allocated %d Mb total\n", Mb); }
包含stdlib和stdio。
这种提取物来自深层的秘密 。
我实际上并不知道为什么失败,但有一点需要注意的是`malloc(4)“实际上可能不会给你4个字节,所以这种技术并不是一个真正准确的方法来查找你的最大堆大小。
我在这里发现了这个问题。
例如,当你声明4个字节的内存时,你的内存之前的空间可能包含整数4,作为内核指示你请求了多less内存。
按照C90标准,可以保证至less可以获得一个大小为32 KB的对象,这可能是静态,dynamic或自动内存。 C99保证至less64千字节。 对于任何更高的限制,请参阅您的编译器的文档。
此外,malloc的参数是一个size_t,该types的范围是[0,SIZE_MAX],所以您可以请求的最大值是SIZE_MAX,该值根据实现而不同,并在<limits.h>
定义。
当你第一次为* p分配任何大小的时候,每当你下一次把这个内存放到未被引用的地方。 这意味着
您的程序一次只能分配4个字节的内存
。 那么你怎么能使用整个RAM,这就是为什么SWAP设备(HDD上的临时空间)没有讨论的原因。 我知道一个内存pipe理algorithm,当没有一个程序引用内存块时,该块有资格为程序内存请求分配。 这就是为什么你只是忙于RAM Driver ,这就是为什么它不能给服务其他程序的机会。 这也是一个悬而未决的参考问题。
答:您最多可以分配您的RAM大小的内存。 因为没有程序可以访问交换设备。
我希望你所有的问题都能得到满意的答复。