中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > C/C++
unix下动态分配内存时系统怎样管理
作者:未知 时间:2005-09-13 19:19 出处:ChinaUnix.net 责编:chinaitpower
              摘要:unix下动态分配内存时系统怎样管理

看了flydart的那个关于malloc的问题
我忽然想起来前些天碰到的让我迷惑的问题

大家都知道malloc是在堆上分配内存,使用完后再free掉
以供后来的程序malloc来使用。
但是我在使用中发现了一个奇怪的问题。


我的程序大致是这样的,他把一个比较大的文件读到内存中特定的
数据结构中(通常大概700M到800M之间),当然这些内存都是动态
分配的,处理完毕后再将先前分配的这些内存free掉,准备下一次
操作。

在测试中我想用vmstat和top等命令来观察内存的使用情况。

我预期的情况是用观察内存状态的命令可以很清楚的看到我的进程使用
的内存数的变化幅度是700M到800M。但是实际情况不是那么回事。

实际情况是。第一次运行,我可以清楚的看到进程使用的内存从10几M慢慢
涨到750M(FOR EXAMPLE),然后free掉这些内存后,top显示我的进程
占用的内存数量没有变化。如果第二次运行只需要比750M小的内存数量,那么在第二次运行过程中进程所占内存的数量也不会有任何变化。如果下一次运行需要比750M更大的内存,比如800M,则运行一段时间后进程占用的内存数量会涨到800M。

看起来似乎操作系统把我的进程使用的内存最大值记下了,
那么是不是意味着堆里的这块空间就是为我的进程预留的呢。

那么如果我的进程暂时没有任务在空转,这时候又有一个新的进程来
申请700多M内存,而实际的物理内存只有1g,那是不是必定有一个进程会 
换到交换区上去,还是原来记在我进程名下的内存可以分配给新来的进程。

我用的操作系统是solaris8,因为没怎么碰过其他的UNIX操作系统
不知道在其他操作系统上是不是也有类似的情况。
 

 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
欢迎交流

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有