linux学习笔记 (10) 进程的内存管理
内存管理

核心元素与逻辑
物理内存:
- 图中上方从 0 到 23 编号的区域是物理内存的分块(物理页 / 页框),不同颜色标注了被使用的情况,比如 “内核使用” 区域是操作系统内核占用的内存,其他带数字(如 0、1、2 等)的块是用户进程使用的物理页。
逻辑页(用户进程的地址空间分块):
- 图中下方左侧橙色的 “0、1、2、3” 和右侧绿色的 “0、1、2、3、4、5”,分别代表两个用户进程的逻辑地址空间分块(逻辑页)。进程的逻辑地址是连续的,但实际在物理内存中可能不连续。
页表(映射关键):
- 每个进程都有一个页表,用来记录 “逻辑页号” 与 “物理页号(物理内存块编号)” 的对应关系。
- 以左侧进程为例,页表中 “逻辑页 0” 对应 “物理页 4”、“逻辑页 1” 对应 “物理页 10” 等,这意味着:当进程访问 “逻辑页 0” 的内容时,实际会被映射到物理内存的 “页 4” 中去读取 / 写入数据。
- 右侧进程的页表同理,“逻辑页 0” 对应 “物理页 7”、“逻辑页 1” 对应 “物理页 14” 等,实现了自身逻辑地址到物理地址的转换。
分页管理的作用
- 内存离散分配:进程的逻辑页可以分散存放在物理内存的不连续页框中,提高内存利用率(避免大段连续空闲内存才能加载进程的限制)。
- 地址转换:通过页表,CPU 能把程序中的逻辑地址(“逻辑页号 + 页内偏移”)自动转换为物理地址(“物理页号 + 页内偏移”),让进程 “以为” 自己在访问连续的内存,实则由页表完成底层的离散映射。
虚拟内存
结合了 页表 + 地址转换硬件(MMU) + 换页策略(Page Replacement) + 磁盘交换区(Swap/Pagefile)。
- 虚拟地址空间:程序看到的连续内存范围。
- 页表:记录每个虚拟页的状态(在物理内存 / 磁盘 / 未分配)。
- MMU(内存管理单元):硬件,负责在访问内存时自动做地址转换。
- 交换区(Swap/Pagefile):硬盘上的区域,存放暂时不用的页。
- 操作系统的换页策略:决定什么时候把页换入 / 换出。
它将主存看成是一个存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,根据需要在磁盘和主存之间来回传送数据,使得能够运行比内存大的多的进程。
它为每个进程提供了一致的地址空间,从而简化了存储器管理
它保护每个进程的地址空间不被其他进程破坏
进程与虚拟内存的关系
1. 为每个进程提供统一的、独立的地址空间
- 没有虚拟内存:所有进程和操作系统都直接读写物理内存。进程A的错误写入可能覆盖进程B或操作系统的重要数据,导致崩溃。
- 有虚拟内存:每个进程都认为自己独享整个CPU地址空间(例如,在32位系统上,每个进程都认为自己拥有从0x00000000到0xFFFFFFFF的4GB连续内存)。
- 实现方式:操作系统和内存管理单元(MMU)通过页表将每个进程的虚拟地址映射到物理内存的物理地址。
- 好处:
- 进程隔离:进程无法直接访问其他进程或内核的数据,安全性、稳定性极大提升。
- 简化编程:程序员无需关心程序具体被加载到物理内存的哪个位置,链接器和加载器的工作变得非常简单。
2. 允许高效共享内存
- 共享库(如DLL, .so文件):多个进程可以将自己的虚拟内存页映射到同一份物理内存中的共享库代码。节省大量内存。
- 进程间通信(IPC):可以通过共享内存的方式,让两个进程的虚拟地址空间映射到同一块物理内存,从而实现高速数据交换。
3. 使得内存分配(Heap)更加灵活和安全
- 进程中使用malloc或new申请堆内存时,分配的是虚拟地址。
- 只有在实际读写该内存时,操作系统才会通过缺页中断为其分配真正的物理页帧(按需分配)。
- 进程的堆空间可以远大于物理内存,因为不常用的内存页可以被交换到磁盘上。
4. 工作流程示意
进程A执行指令 -> 访问虚拟地址0x4000 -> CPUMMU查询进程A的页表 -> 映射到物理地址0x12345000进程B执行指令 -> 访问虚拟地址0x4000 -> CPUMMU查询进程B的页表 -> 映射到物理地址0x54321000
- 相同的虚拟地址,通过不同的页表,映射到完全不同的物理地址。这就是实现隔离的核心机制。
虚拟内存是操作系统为了实现进程的“隔离性”和“独立性”而采用的核心底层机制。没有虚拟内存,现代意义上的多进程操作系统就无法安全、稳定地运行。