Linux[C] 求教《Linux程序设计》中一个malloc内存分配的问题

其中在http://bbs.chinaunix.net/thread-1698950-1-1.html链接中提到如下疑问:

------》在第7章里面,有两个介绍linux内存管理的例子,把我搞的很糊涂。
    第一个例子:每次调用 malloc(1024 * 1024) 分配1M的内存,并往刚分配的内存中写入一些数据。循环512次,总共分配了512M的内存。该程序运行的机器内存大小在256M左右。书中介绍程序运行非常良好,而且整个程序运行时间也非常的快。
    第二个例子:在同样的机器上,每次调用 malloc(1024) 分配1K的内存,同样也往刚分配好的内存中写入一些数据。一直不停的执行分配操作。程序运行后,显示分配了378M的内存后,就被操作系统给终止了。并且运行这个程序花费的时间还不少,当分配的内存大小接近机器物理内存容量的时候,运行速度就明显慢了下来,而且能听到很明显的硬盘操作。对于这个现象,书中没有站在内存管理的角度上讨论,而是介绍了swap空间。

 ------》我的理解是:内存管理是基于页的,x86系统上页的大小是4K。
      第一个例子中,每次调用malloc分配1M的内存,实际分配了256个物理页(最多增加一点保存管理信息的空间,这里就忽略不急,就当分配了256个页)。那么分配512M,实际就只分配了 512 × 256 = 131072 个页面。
      第二个例子中,每次调用malloc分配1K的内存,其小于一个4K页面的大小,但是系统也会分配一个页面给它,这就造成了3K空间的浪费。程序运行分配了378M的内存就被终止了,实际已经分配了 378 × 1024 = 387072 个页面。
      可以看出,第二个例子分配的页面近3倍于第一个例子,因此造成了无剩余空间供分配,系统终止了其运行。


------》而按照作者的解释有人解释如下:

    第一个你虽然申请了很多空间,但是并没有用,所以并没有真的分配内存,
    第二个问题,你一边分配,一边写入一些数据,系统就会实际分配内存,所以会出现中至。


为此做了如下测试:

1. 使用 作者的程序编译出memory2和memory3的可执行程序;

2. 使用shell指令 分别运行 ./memory2  和 ./memory3(在程序上做一些改动,增加sleep)

3. 使用ps aux |grep memory*以及 top -p pid 程序查找出来该进程的运行情况

最后结论是:

memory2进程中的参数VIRT(进程占用的虚拟内存)随着malloc的进行不断增加
memory3进程中的参数除了 VIRT(进程占用的虚拟内存)不断增加,还有参数RES(进程占用的物理内存)不断增加

该问题的原因如下:

第一个你虽然申请了很多空间,但是并没有用,所以并没有真的分配内存,
第二个问题,你一边分配,一边写入一些数据,系统就会实际分配内存,所以会出现中至。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值