挖掘Linux操作系统堆内存释放的奥秘

转载 2013年12月02日 15:11:27

今天上午得到了一些高手指点,终于弄懂了堆内存释放的奥秘,特总结出来与大家分享!

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

  Linux进程使用内存的基本流程:  

  从图中我们可以看出,进程的堆,并不是直接建立在Linux的内核的内存分配策略上的,而是建立在glibc的堆管理策略上的(也就是glibc的动态内存分配策略上),堆的管理是由glibc进行的。所以我们调用free对malloc得到的内存进行释放的时候,并不是直接释放给操作系统,而是还给了glibc的堆管理实体,而glibc会在把实际的物理内存归还给系统的策略上做一些优化,以便优化用户任务的动态内存分配过程。

  那么glibc的堆管理器在什么时候才把物理内存归还给系统呢?

  它会从堆的最大线性地址开始,从后向前计算用户任务当前有多少空闲的堆内存(直到碰到使用中的堆内存地址为止),比如在该图中:

  它会认为有2048k的可释放内存,只有在该值大于某个特定的threshhold时(2.3.6上为64k),它才会把这些内存归还给系统。而在中间的“未使用”内存是不会归还给系统的,所以系统也不可能再利用这块物理内存页(我们假设系统没有swap区和swap文件),也就是说系统的内存会为此减少,除非在它之前的堆内存都用free进行释放以后,glibc的堆管理器才有可能(只是有可能)把该段内存归还给系统。

  由此,我们在使用malloc/free时应该小心,特别是在初始化时分配了好多内存,但是在这之后却再也不需要这么多的内存了,而这块内存又没有达到threshhold值或者在堆的最高线性地址处有某块内存没有释放,但是它前面的所有堆内存都释放了;这种情况下,用户任务将会浪费一些物理内存,这在资源比较紧张的嵌入式系统中是不可容忍的。

对Linux堆内存释放的总结

Linux用户进程是如何释放内存的 Linux进程使用内存的基本流程:     见图1 从图中我们可以看出,进程的堆,并不是直接建立在Linux的内核的内存分配策略上的,而是建立在glibc的堆...

对Linux堆内存释放的总结

http://bbs.chinaunix.net/thread-2195511-1-1.html Linux用户进程是如何释放内存的 Linux进程使用内存的基本流程:   从图中我们可以看出,进程的...

sa12***161 Linux操作系统是如何工作的?破解操作系统的奥秘

【研究内容】 l        操作系统工作的基础:存储程序计算机、堆栈(函数调用堆栈)机制和中断机制; l        在操作系统工作的基础之上,请您简述操作系统(内核)是如何工作,宏观概述结...

【实验五】Linux操作系统是如何工作的?破解操作系统的奥秘

学号:SA12***116 1.操作系统工作的基础 1.1 存储程序计算机 存储程序计算机最早是由著名数学家冯·诺伊曼等人在1946年总结并明确提出来的,因此又被称为冯·诺伊曼计算机...

Linux操作系统是如何工作的?破解操作系统的奥秘

姓名:殷晓婷         学号:SA*****195 一、操作系统工作的基础:存储程序计算机、堆栈(函数调用堆栈)机制和中断机制   根据冯诺依曼计算机体系结构,计算机的本质是存储程序计算...

Linux操作系统之奥秘

  • 2016年09月01日 15:23
  • 72.09MB
  • 下载

枯木笔记_Linux操作系统之奥秘

  • 2012年11月19日 16:48
  • 1.44MB
  • 下载

linux操作系统编程——共享内存的读写(采用信号机制进行同步互斥)

程序要求:    创建一个写端和一个读端,写端写入数据后读端才开始读,读端读完数据后,写端才可以开始写,这样的同步采用信号机制实现,并且写端与读端打开顺序不同也能实现功能; 程序如下: (1)、...

LINUX操作系统之奥秘

  • 2015年09月15日 09:04
  • 44.7MB
  • 下载

Linux操作系统之奥秘.pdf

  • 2017年04月30日 17:58
  • 1.16MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:挖掘Linux操作系统堆内存释放的奥秘
举报原因:
原因补充:

(最多只允许输入30个字)