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

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


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


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

(0)

相关推荐

  • Linux 释放内存

    Linux虽然是会自动释放内存的,可是有的时候却。。。 用下面得命令就可以手动释放了,其实只要第一条命令和最后一条命令就可以,不过我不叫无聊所以设置的都运行一遍 sync echo 1 > /p ...

  • Linux 进程间通讯共享内存方式

    共享内存方式:从物理内存里面拿出来一部分作为多个进程共享。 共享内存是进程间共享数据的一种最快的方法,一个进程向共享内存区域写入数据,共享这个内存的所有进程都可以立即看到其中内容。 共享内存实现步骤: ...

  • Slackware Linux init 进程

    Joe Brockmeier 研究了 Slackware Linux init 进程。他讨论了系统如何初始化服务、各种运行级别是什么,以及如何从缺省安装中添加或除去服务来定制系统。 Linux 用户正 ...

  • IIS6 w3wp.exe进程占用cpu和内存过多的解决方法

    今天有朋友问我他的服务器网站访问很卡,内存及CPU占用不能及时释放,从而导致服务器响应速度很慢,这里简单介绍下,方便需要的朋友 在IIS6下,经常出现w3wp.exe的内存及CPU占用不能及时释放,从 ...

  • win7怎么释放内存提升电脑性能

    win7怎么释放内存提升电脑性能 win7释放内存提升电脑性能的操作方法 方法一.提高硬件性能的方法 在Windows7系统中,提高硬件水平尤为重要,内存能否高速使用与别的硬件关系也是非常大的,比如当 ...

  • Linux中进程管理工具htop的安装与其命令使用教程

    Linux中进程管理工具htop的安装与其命令使用教程

  • CentOS下SWAP分区建立及释放内存详解

    方法一: 一.查看系统当前的分区情况: >free -m 二.创建用于交换分区的文件: >dd if=/dev/zero of=/whatever/swap bs=block_size ( ...

  • Linux任务调度进程crond命令的使用方法和注意事项

    一、crond简介 概念 crond的概念和crontab是不可分割的。crontab是一个命令,常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并 ...

  • 如何在Win2003中安全的释放内存(强迫系统释放全部必要资源)

    经常看到有朋友在论坛上诉苦说需要释放内存,其实如果你安装了Windows 2003的话,那么并不需要寻求那些需要注册才能长久使用的第三方内存管理软件。因为windows 2003已经自带了一个名为Em ...