/* * ===================================================================================== * * Filename: malloc_more.c * * Description: 编写一个小程序让它耗尽系统内存。 * 观察一下,分配了多少内存后才会出现分配失败 * 内存耗尽之后会怎么样?会不会死机? * * Version: 1.0 * Created: 2009年08月11日 16时21分41秒 * Revision: none * Compiler: gcc * * Author: KuangHaiBin (khb.hnu(AT)gmail.com) * Company: Hunan University * * ===================================================================================== */ #include <stdlib.h> #include <stdio.h> #define BYTES_MALLOCED_ONETIMES 10*1024u /*一次分配内存的字节数 */ int main ( int argc, char *argv[] ) { int count = 0; char *ptr = NULL; while(1) { ptr = malloc(BYTES_MALLOCED_ONETIMES); if ( ptr == NULL ) { printf("END!"); break; } count ++; printf("Have Malloc %d M Memory!\n",(count * BYTES_MALLOCED_ONETIMES) >>20); } return EXIT_SUCCESS; } /* ---------- end of function main ---------- */ 实验平台:ubuntu 9.04 内存512M。 实验结果: 1.一次申请1M,可以申请到3056M,且不会死机。 2.一次申请10k,可以申请到1410M,会死机。 3.一次申请1k,可以申请到480M,会死机。 不知道原因,宋老师可以帮忙解释下不:-)
赞!程序写得很规范。也很有实验精神。是这样的,其实一次申请10K或1K也不会死机,也许你会觉得机器很卡甚至死掉了,但等一会儿内核就会把这个巨耗内存的进程杀掉,系统就活过来了。
宋老师能不能帮解释一下: 1.内存是512M,一次申请1M,可以申请到3056M,这个3056一定包括虚拟内存吧? 2.为什么申请到的内存空间,和我每次申请的空间大小有关系?比如一次1M,申请到3056M,一次10K,申请到1410M,为什么不总是申请到3056M的空间? 非常感谢
自问自答: 1.通过监视器来监视资源,这3000M的资源确实包括虚拟内存。 2.事实上每次申请的空间差距不大,在我电脑上,2G内存,每次申请1M,申请到了3045M的内存,每次申请10M,申请到3064M的内存。我估计1楼的程序应该没有添加exit(0)导致假死,没看到实际效果
不错。每次申请的大小不同,运行结果也不同,这个应该很好理解吧,回去看一下本节的图示,malloc是怎么实现的。虽然实际的malloc实现比这个要复杂一些,但基本原理一样,除了申请的空间之外还会有一些额外的空间和额外的代码来维护。
如果您有建设性意见,哪怕只是纠正一个错别字,也请不吝赐教,您留下的姓名和email将会出现在本书前言的致谢中。再次感谢您的宝贵意见!