其中在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(进程占用的物理内存)不断增加
该问题的原因如下:
第一个你虽然申请了很多空间,但是并没有用,所以并没有真的分配内存,
第二个问题,你一边分配,一边写入一些数据,系统就会实际分配内存,所以会出现中至。