LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 874|回复: 3

关于free报告的内存使用状况,高人请来解惑

[复制链接]
发表于 2006-7-26 20:24:43 | 显示全部楼层 |阅读模式
free 报告的内存使用状况,其中各个值的含义我一直很迷惑。也不知道机器到底使用了多少内存。版上也老冒出这样的帖子,都没办法解除我的疑惑。

纯粹好奇,前些天写个小程序用 malloc 申请了一大块内存空间,约等于物理内存+交换空间的值。运行后在另外一个控制台开 free -s1 看看,结果没什么变化(呵呵,见笑)。后来用 memset 往这块内存空间中填充数据,一直到填满。这次有变化了,free -s1 中内存的使用量急速上升了。程序结束的时候(还没有 free 掉的时候),free 报告的 buffer 以及 cache 值都降低了。-buffer/+cache 后的已使用内存差不多是等于物理内存了,还剩下约一兆的未使
用的。同时交换空间也差不多快填满了。

free() 掉以后一切回复原始了,buffer / cache 都比以前还用的少。交换空间中还是有数据。
程序中消耗内存的主要都是堆资源,那么是不是说观察机器现在使用到的内存大小基本上只需要观察 -buffer/+cache 一项的值就可以了呢?

我的机器开机的时候往往 -buffer/+cache 一项在 2 兆左右。使用一段时间这个值会上升。是不是也是类似我这个程序一样?刚开始并没有使用到所有程序申请的堆资源,随着使用也会逐渐上升,极限则是程序当初设计时需要的最大内存?如果是这样我觉得我就比较清楚了。看 -buffer/+cache 就是当前使用的内存量了。

有些朋友问过“如何整理”内存的问题。我挑了个 cache+buffer 将近占掉物理内存一大半的时候 malloc() 了一块约物理内存大小的内存空间,然后再 free() 掉,再看 free 命令的报告,buffer 以及 cache 值都降低到了很小的值,跟刚开机时候差不多。这是不是看起来也象一个拙劣的“整理内存”,呵呵。这么“整理”过后的直接影响就是,把放入后台的 Emacs 重新放入前台的时候有明显——对我而言——的停顿感。另外的控制台中也可以看到 Linux 把交换空间中的数据重新调入 cache 和 buffer。这么说可能有点逻辑混乱,因为我实际看到的情况是交换空间使用值降低,而 cache / buffer 数字增加。说它重新调入内存其实说白了也就是我*猜*的。

我这个小小的尝试告诉我的是,看起来使用量很大的 cache 值根本不需要担心。而且还用的越多越好 :-) 有对这个话题比较清楚的朋友是不是可以说说?更多的,我想知道 buffer / cache 中放的都是哪些东西。我没有看过 Linux 内存管理的源码,也不可能去看。如果有对其内存管理方式比较了解的兄台,不妨指教一下小弟 :-D
另外,我想知道在 Windows 环境中这么做也是类似的结果么?我的机器上都没有 Windows ,也不可能为了试验这个再装个 Windows 。硬盘上也分不出空间来了 :-)

最后在搭车问个也许不相关的问题 tcsh 的 limit 命令 (bash 中应该是 ulimit 吧)中显示的 stacksize 是指限制的栈区大小么???

见笑见笑 :-)
 楼主| 发表于 2006-7-26 20:33:40 | 显示全部楼层
补充,如果我现在的观念没有错误的话,看来比较老的机器交换空间的大小还是比较重要。好机器的话交换空间凑合一下也就可以了吧
回复 支持 反对

使用道具 举报

发表于 2006-7-30 21:15:23 | 显示全部楼层
网上专门讲Linux内存管理的文章,具体来说:内核把暂时不用的内存都作cache了,(cache和buffer是有区别的)所以再大的内存在linux下也是几乎没有太多的空闲部分的。
还有极端的做法,把内存区域作为一个文件系统mount起来用。比如用gentoo的时候就会遇到许多编译任务,把文件放入ram中编译将极大的加快速度。但是你虽然mount了,在没有具体使用时free看不到什么变化。如果要知道具体的机制,还是看看源码。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-8-11 15:31:58 | 显示全部楼层
腾了点地方装了个 Windows,重复上面的步骤,速度慢得根本无法忍受.用了几分钟才完,free掉的时候又是几分钟. 哎,也不知道是我机器对Windows来说太烂了还是什么问题.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表