当前位置: 首页 > 图文教程 > 操作系统 > Unix/Linux > Linux用户进程是如何释放内存的

Unix/Linux
Linux系统上把PHP编译进Apache静态内核
Linux操作系统下的多线程编程详细解析
高手进阶 Linux系统中内核定时器的应用
Linux内核初始化及启动之用户模式开始
Linux系统核心源程序文件组织结构介绍
Linux的内核软中断(softirq)执行分析
嵌入式 用户图形接口uC/GUI的简单分析
教你用APF和BFD来加强Linux的防火墙
铲除病毒攻击两大威胁 走近Linux防护
使用SSL 保护VNC应用程序
Linux与Unix二大操作系统编程的安全
为Linux服务器部署高效防毒软件
通过LoadRunner监控Linux的资源状况
Linux操作系统安全管理十大招数介绍
黑客高级技巧 Linux后门技术及实践
提高Linux操作系统安全性的十大招数
开发 Linux系统下的磁盘加密方法详解
用 coLinux 进行虚拟化
做好防范 Linux系统下的攻击软件全接触
Linux操作系统的口令安全问题详细解析

Unix/Linux 中的 Linux用户进程是如何释放内存的


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2010-01-16   浏览: 194 ::
收藏到网摘: n/a

Linux用户进程是如何释放内存的
Linux进程使用内存的基本流程:


从图中我们可以看出,进程的堆,并不是直接建立在Linux的内核的内存分配策略上的,而是建立在glibc的堆管理策略上的(也就是glibc的动态内存分配策略上),堆的管理是由glibc进行的。所以我们调用free对malloc得到的内存进行释放的时候,并不是直接释放给操作系统,而是还给了glibc的堆管理实体,而glibc会在把实际的物理内存归还给系统的策略上做一些优化,以便优化用户任务的动态内存分配过程。
那么glibc的堆管理器在什么时候才把物理内存归还给系统呢?
它会从堆的最大线性地址开始,从后向前计算用户任务当前有多少空闲的堆内存(直到碰到使用中的堆内存地址为止),比如在该图中:


它会认为有2048k的可释放内存,只有在该值大于某个特定的threshhold时(2.3.6上为64k),它才会把这些内存归还给系统。而在中间的“未使用”内存是不会归还给系统的,所以系统也不可能再利用这块物理内存页(我们假设系统没有swap区和swap文件),也就是说系统的内存会为此减少,除非在它之前的堆内存都用free进行释放以后,glibc的堆管理器才有可能(只是有可能)把该段内存归还给系统。
由此,我们在使用malloc/free时应该小心,特别是在初始化时分配了好多内存,但是在这之后却再也不需要这么多的内存了,而这块内存又没有达到threshhold值或者在堆的最高线性地址处有某块内存没有释放,但是它前面的所有堆内存都释放了;这种情况下,用户任务将会浪费一些物理内存,这在资源比较紧张的嵌入式系统中是不可容忍的。