>第 24 章 函数接口>本章的预备知识>malloc与free>习题

况海斌 khb.hnu@gmail.com
2009-08-11 17:15:59

/*
 * =====================================================================================
 *
 *       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,会死机。

不知道原因,宋老师可以帮忙解释下不:-)


宋劲杉 songjinshan@akaedu.org
2009-08-12 22:39:45

赞!程序写得很规范。也很有实验精神。是这样的,其实一次申请10K或1K也不会死机,也许你会觉得机器很卡甚至死掉了,但等一会儿内核就会把这个巨耗内存的进程杀掉,系统就活过来了。


ben benzhemin@gmail.com
2010-07-26 16:15:44

宋老师能不能帮解释一下:
1.内存是512M,一次申请1M,可以申请到3056M,这个3056一定包括虚拟内存吧?
2.为什么申请到的内存空间,和我每次申请的空间大小有关系?比如一次1M,申请到3056M,一次10K,申请到1410M,为什么不总是申请到3056M的空间?
非常感谢


ben benzhemin@gmail.com
2010-07-26 16:31:43

自问自答:
1.通过监视器来监视资源,这3000M的资源确实包括虚拟内存。
2.事实上每次申请的空间差距不大,在我电脑上,2G内存,每次申请1M,申请到了3045M的内存,每次申请10M,申请到3064M的内存。我估计1楼的程序应该没有添加exit(0)导致假死,没看到实际效果


宋劲杉 songjinshan@gmail.com
2010-07-27 23:46:29

不错。每次申请的大小不同,运行结果也不同,这个应该很好理解吧,回去看一下本节的图示,malloc是怎么实现的。虽然实际的malloc实现比这个要复杂一些,但基本原理一样,除了申请的空间之外还会有一些额外的空间和额外的代码来维护。


如果您有建设性意见,哪怕只是纠正一个错别字,也请不吝赐教,您留下的姓名和email将会出现在本书前言的致谢中。再次感谢您的宝贵意见!