`

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

阅读更多

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


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

那么glibc的堆管理器在什么时候才把物理内存归还给系统呢?
它会从堆的最大线性地址开始,从后向前计算用户任务当前有多少空闲的堆内存(直到碰到使用中的堆内存地址为止),比如在该图中,
    见图2
它会认为有2048k的可释放内存,只有在该值大于某个特定的threshhold时(2.3.6上为64k),它才会把这些内存归还给系统。而在中间的 “未使用”内存是不会归还给系统的,所以系统也不可能再利用这块物理内存页(我们假设系统没有swap区和swap文件),也就是说系统的内存会为此减少,除非在它之前的堆内存都用free进行释放以后,glibc的堆管理器才有可能(只是有可能)把该段内存归还给系统。

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


谢谢!

图片附件: [图1] 绘图1.gif (2005-12-27 17:59, 25.98 K)



图片附件: [图2] 绘图2.gif (2005-12-27 17:59, 3.66 K)

分享到:
评论

相关推荐

    Linux中进程创建和内存空间申请

    Linux中进程创建和内存空间申请: 除进程0外,所有进程都是由一个已有进程在用户态下完成创建的。 进程0创建进程1前,要将进程0由内核态转变为用户态,方法是调用move_to_user_mode函数 硬件对5个push压栈的数据分别...

    linux用户进程内存映射

    详解mmap、malloc在内核态的实现,原理是什么,有详细的描述和加的内核源码注释,可完全理解用户进程申请内存是怎么一回事

    用于测量和限制 Linux 中黑盒进程的 CPU 时间和内存消耗的 脚本_Perl_代码_相关文件_下载

    该timeout脚本是一个资源监控程序,用于限制Linux下黑盒进程的时间和内存消耗。它运行您在命令行中指定的命令并监视其内存和时间消耗,如果超出限制则中断进程,并通过预设消息通知用户。 这个脚本的杀手锏(实际上...

    Linux系统下的内存映射原理

    对于提供了MMU(存储管理器,辅助操作系统进行内存管理,提供虚实地址转换等硬件支持)的处理器而言,Linux提供了复杂的存储管理系统,使得进程所能访问的内存达到4GB。  进程的4GB内存空间被人为的分为两个部分--...

    嵌入式LINUX内存使用与性能优化

    《嵌入式Linux内存使用与性能优化》所讲述的内存使用,不是Linux内核的内存管理,而是在用户层观察进程是如何使用内存的。, 关于系统性能优化,《嵌入式Linux内存使用与性能优化》不同于同类书侧重于编程语法或者...

    linux 内存管理(虚拟地址到物理地址)

    Linux操作系统采用虚拟内存管理技术,使得每个进程都有各自互不干涉的进程地址空间。该空间是块大小为4G的线性虚拟空间,用户所看到和接触到的都是该虚拟地址,无法看到实际的物理内存地址。利用这种虚拟地址不但能...

    如何理解Linux中进程,线程等概念

    线程是进程的一条执行路径,它包含独立的堆栈和CPU寄存器状态,每个线程共享其所 附属的进程的所有的资源,包括打开的文件、页表(因此也就共享整个用户态地址空间)、信号标识及动态分配的内存等等。线程和进程的...

    Linux操作系统的内存使用方法详细解析

    Linux内核在用户申请内存的时 候,只是给它分配了一个线性区(也就是虚存),并没有分配实际物理内存;只有当用户使用这块内存的时候,内核才会分配具体的物理页面给用户,这时候才占用 宝贵的物理内存。内核释放...

    linux-process-management.zip_linux进程管理

    Linux 进程管理剖析。在本文中,了解 Linux 进程的生命周期,探索用户进程创建、内存管理、调度和销毁的内核内幕。

    Linux下的内存管理

    本书共分三篇23章,分别介绍了Linux的基本知识、文本编辑工具、用户账号与组管理、文件与目录系统、用户界面——shell、多任务与进程、启动程序与关机、扩充系统、网络应用与设置、Linux系统的视窗环境———X ...

    非常宝贵的LINUX学习笔记

    【linux学习笔记-1】使用GDB调试简单的用户程序 【linux学习笔记-2】父子进程共享文件描述符 【linux学习笔记-3】文件操作(stat,chmod,umask) 【linux学习笔记-4】进程...【linux学习笔记--19】POSIX IPC——共享内存

    Linux内存IO

    Linux内存IO的培训PPT。 课程内容 Linux内存管理基础 I/O内存的访问 ...掌握内核和用户空间内存分配函数的使用 掌握I/O内存的访问方法和步骤 第一章:内核地址空间 第二章:进程地址空间 第三章:I/O内存的访问

    疯狂内核之——Linux虚拟内存

    1.4 Linux内存布局 21 1.5 内核空间和用户空间 23 1.5.1 初始化临时内核页表 24 1.5.2 永久内核页表的初始化 32 1.5.3 第一次进入用户空间 41 1.5.4 内核映射机制实例 44 1.6 固定映射的线性地址 48 1.7 高端内存...

    基于Linux的同步共享内存的研究与实现

    共享内存是L inux 中通信效率最高的通信机制, 需要与其他通信机制结合来同步进程。本文将信号量与共享内存结合, 利用信号量对共享内存的读ö写进行监控。然后将其作为通信方式, 结合CöFo rtran 编程技术、X- W ...

    解决Linux下php-fpm进程过多导致内存耗尽问题

    可以看到我的服务器内存是2G的,但是目前可用内存只剩下70M,内存使用率高达92%,很有可能是内存使用率过高导致数据库服务挂断。 继续看详细情况,使用 top 指令: 然后再看指令输出结果中详细列出的进程情况,重点...

    linux源代码分析:Linux操作系统源代码详细

    内容介绍: Linux 拥有现代操作...源代码充分揭示了Linux作为操作系统内核是如何完成保证系统正常运行、协调多个并发进程、管理内存等工作 现实中能让人自由获取系统源代码并不多通过本书学习将大大有助于读者编写自己新

    linux操作系统大全

    我精心收集的十分详细的linux教程! linux操作系统分析 1.linux简介 2.常用命令 3.网络功能 4.系统管理 5.外壳编程 ...26.linux系统用户安全 27.X WINDOWS 基本知识 28.实用程序和工具 29.定制X WINDOWS系统

    linux进程间通信

    进程间通信就是在不同进程之间传播或交换信息,那么不同进程之间存在着什么双方都可以访问的介质呢?进程的用户空间是互相独立的,一般而言是不能互相访问的,唯一的例外是共享内存区

    操作系统课设 linux 下编程模拟多进程共享临界资源

    1、两个进程模拟需要进入临界区的用户进程,当需要进入临界区时,显示:“进程x请求进入临界区…”,同时向管理进程提出申请;申请返回,表示进入了临界区。在临界区中等待一段随机时间,并显示:“进程x正在临界区...

    Linux学习笔记Linux学习资料Linux教程

    【linux学习笔记--19】POSIX IPC——共享内存.doc 【linux学习笔记-10】Linux进程相关系统调用(三).doc 【linux学习笔记-11】守护进程daemon.doc 【linux学习笔记-12】守护进程的日志实现.doc 【linux学习笔记-13...

Global site tag (gtag.js) - Google Analytics