/*
* =====================================================================================
*
* 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将会出现在本书前言的致谢中。再次感谢您的宝贵意见!