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中的用户级内存管理,包括Linux/Unix地址空间的结构、内存分配机制以及编程实践。 首先...
在Linux操作系统中,进程创建和内存空间申请是两个核心概念,它们构成了系统运行的基础。本文将深入探讨这两个主题,特别是进程0如何创建新的进程以及内存管理的机制。 首先,让我们聚焦于进程创建。在Linux中,...
Linux 用户进程内存映射 Linux 操作系统中,对用户进程的内存管理是通过 mmap 和 malloc 两个系统调用来实现的。本文将详细介绍 mmap 和 malloc 在内核态的实现原理和机制,并对相关知识点进行详细解释。 mmap 和 ...
"查看LINUX进程内存占用情况" 在 Linux 系统中,了解进程的内存占用情况非常重要,以便于系统管理员和开发者更好地管理和优化系统性能。下面将介绍三个常用的命令来查看 Linux 进程的内存占用情况。 一、top 命令 ...
查看 LINUX 进程内存占用情况 Linux 操作系统中查看进程内存占用情况是系统管理员和开发人员日常任务中非常重要的一部分。通过查看进程内存占用情况,可以了解系统中进程的资源占用状况,故障排查和性能优化。下面...
共享内存是一种高效直接的数据交换方式,而命令解释器则允许用户通过命令行接口执行系统指令。 **共享内存** 是一种允许不同进程访问同一块物理内存区域的技术。这种方式的优点在于其高速性,因为数据不需要通过...
内核信号是由操作系统内核生成的,而用户信号是由用户进程生成的。 在实验中,我们使用 signal 函数来捕获信号,并使用 kill 函数来发送信号。signal 函数可以设置信号处理函数,而 kill 函数可以向目标进程发送...
### Linux进程内存使用详解 #### 一、内存基础概念 在深入探讨Linux进程的内存使用之前,我们需要了解几个基本的概念: 1. **虚拟内存**:指的是由操作系统提供的一个抽象概念,使得每个进程都有一个独立的地址...
总之,理解和掌握Linux内存管理机制,以及如何诊断和优化高内存占用程序,对于任何Linux用户和管理员来说都是必不可少的技能。通过以上方法,我们可以有效地应对和解决这类问题,确保系统的高效运行。
用户进程本身的程序和数据(可执行映象)映射到用户空间中。系统对这个进程进行控制和管理的信息,如进程控制块等,也映射到进程空间。 进程上下文和系统上下文是 Linux 进程管理中的重要概念。把系统提供给进程的...
Linux支持虚拟内存(Virtual Memory),虚拟内存是指使用磁盘作为RAM的扩展,内核会将暂时不用的内存块的内容写到硬盘上,以便释放出内存空间供其他进程使用。当需要用到原始的内容时,它们被重新读入内存。 Linux...
当你输入`ps aux | less`时,你会看到一个详细的列表,其中包括进程ID(PID)、所属用户、CPU和内存使用率、虚拟内存大小、进程状态、运行时间、进程所占端口等信息。这里的`a`表示显示所有进程,`u`以用户友好的...
首先,Linux内存管理采用虚拟内存技术,将每个进程的地址空间划分为多个区域,如堆、栈、代码段、数据段等。每个进程看到的是独立的虚拟地址空间,而实际的物理内存则被操作系统动态地映射和管理。这种方式使得进程...
### Linux内存清理与释放命令详解 #### 概述 Linux作为一种高效的服务器操作系统,在资源管理上有着卓越的表现。尤其是在内存管理方面,Linux系统倾向于利用空闲内存作为缓存,以提高文件系统的读写性能。然而,在...
为了解决这个问题,Linux操作系统提出了虚拟内存的概念,使得每个进程用于3GB的独立用户内存空间和共享的1GB内核内存空间。这样进程运行的速度必然很快了。 虚拟内存的实现机制中,交换空间(swap space)是一个...
### Linux 查看与终止进程详解 #### 一、引言 在Linux环境下,了解如何查看与终止进程是一项基本且重要的技能。本文将详细介绍如何利用`ps`命令来查看当前正在运行的进程信息,并使用`kill`命令来终止指定的进程。 ...
- `# ps`:显示当前用户进程。 - `# ps -aux`:显示所有进程的信息。 `ps` 命令输出的列解释: - **USER**:进程的启动用户。 - **PID**:进程号(进程的唯一标识符)。 - **%CPU**:占用 CPU 的百分比。 - **%MEM*...
进程有很多属性,包括进程 ID(PID),父进程和父进程的 ID(PPID),启动进程的用户 ID(UID)和所归属的组(GID),进程状态,进程执行的优先级,进程所连接的终端名,进程资源占用等。 1.3 父进程和子进程 父...
在Windows系统中,可以使用`GetProcessMemoryInfo`函数,该函数属于`Psapi`库,它能够返回关于进程内存使用情况的详细信息,包括私有字节数、共享字节数、页面文件大小等。而在Linux系统中,`/proc`文件系统提供了...
Linux系统提供了一些机制来实现进程间的通信和同步,例如管道、信号、共享内存等。这些机制可以实现进程间的数据交换和同步。 5. 实验结果和总结 通过实验,文章展示了多进程在Linux系统下的设计和实现,并对实验...