| liupch 回复于:2003-04-11 10:38:29
|
原因是这样的,你使用vmstat看到的free的内存是自由的内存,意思就是说处在free状态的内存,现在还没有被任何进程使用过。
假设你有一个进程A,申请了100M内存,那么这100M内存处于busy状态,也就是被占用状态,然后再Free它,但是你的程序并没有退出,这个时候,这100M内存处于cache状态,因为里面的数据有可能还会被用到。当你的程序退出后,这100M内存才真正处于free状态.
这是UNIX的优化内存管理机制。
|
| unicorns 回复于:2003-04-11 11:41:00
|
THANKS
那么就象我前面所说的
在这种优化内存管理机制下
如果我的进程没有退出,但是已经把占用的内存free掉了
这个时候来了一个新的进程来申请内存,这个时候会出现什么情况呢
十分感谢!
|
| shanhan 回复于:2003-04-11 11:43:11
|
谢谢高手们!
|
| liupch 回复于:2003-04-11 15:06:00
|
如果进程A申请了100M内存,使用后free掉,但是进程A并不退出,那么这100M的状态是cache。这是后进程B再申请内存,系统的申请顺序是,首先查找属于Free状态的内存,即完全干净,没被任何进程使用过的内存。如果free的内存不够被分配,则查找处于cache状态的内存。也就是曾经被进程申请,而现在又是放掉的,而且申请这些内存的进程还没有退出。如果cache状态的内存也不够分配,则查找inactive队列里面的内存。inactive状态的内存是已经被某一进程申请,但是该进程暂时没有对该内存进行操作。这是后系统会把inactive状态内存中的数据先写在swap(也就是文件系统中)里,然后临时借给正在申请内存的进程B用。这时候进程B在操作这些借来内存,因为这些内存本来就是进程A 的,在进程B还为使用完之前,进程A也要使用了,系统就会把当前内存中的数据写入swap,然后再从swap中把刚才写入的进程A的数据重新调入到内存。这就是内存页面的换出和换入(page out/page in)。
所以一个系统是否繁忙,不能光看free状态的内存多少,而要看page out/page in的数值。如果页面交换的数值很高,说明系统当前内存是用非常紧张,系统需要临时借用其他进程的内存使用。
|
| unicorns 回复于:2003-04-11 17:15:06
|
十分感谢!
实际上我也做了一些实验来看
但是我查看内存状况的时候
无法知道进程所用的内存当前是在物理内存中还是在交换区中
liupch有没有什么好的办法来测试一下吗
|
| yuxq 回复于:2003-04-17 13:52:36
|
你可以看一下操作系统对内存的管理机制
|
| Elite 回复于:2003-04-17 22:36:33
|
能推荐几本书吗?
|
| superhoo 回复于:2003-04-18 08:44:02
|
liupch 兄,对内核比较了解啊,有时间交流交流啊:)
|
| liupch 回复于:2003-04-18 09:41:10
|
[quote:f0035259d8="superhoo"]liupch 兄,对内核比较了解啊,有时间交流交流啊:)[/quote:f0035259d8]
好好,大家共同探讨,共同进步
我的QQ:2237433
欢迎交流
|