物理内存指的是计算机中实际存在的硬件内存。物理内存是计算机用于存储运行中程序和数据的实际内存资源,操作系统和应用程序最终都必须使用物理内存来执行;

虚拟内存是操作系统提供的一种内存管理技术,它使得应用程序认为自己有连续的、独立的内存空间,而实际上,这个虚拟内存可能部分存储在物理内存上,部分存储在 磁盘(如硬盘的交换分区或页面文件) 中。

虚拟内存使用的是逻辑地址,它与实际的物理内存地址不同,必须经过地址转换才能映射到物理内存。

映射:操作系统将虚拟内存划分为多个页(分页),并通过页表映射到物理内存;如果物理内存不够,会基于页面置换算法将暂时不用的页面置换到磁盘的交换区。

分页 vs 分段

分页

分段

切割标准

切的是虚拟地址空间(按固定大小机械切分),同时物理内存也被切成等大的帧——两边单位一致

切的是程序的逻辑地址空间(代码/数据/堆/栈各有名字和边界)

在纯段式系统里,它就是进程的虚拟地址空间;但物理内存那边并不跟着切段,而是给每个段动态分配一段可变长的连续区域——这正是分段产生外部碎片的原因

定位方式

按"大小"切地址空间(一维)

分页时地址写成"页号 + 偏移",看着像两个字段,

但它们能拼回一个连续整数:

地址 = 页号 × 页大小 + 偏移

分段是按"语义"切地址空间(二维)

分段时,段号不是地址空间的延续:

  • 段 0(代码)、段 1(数据)、段 2(堆栈)在物理内存里不相邻、长度各不相同;
  • 每个段内部都从 0 开始偏移——所以"偏移 5"到底是哪个段的第 5 个字节?不知道段号就完全无法定位。

于是地址必须写成 (段号, 段内偏移) 两个独立坐标,且物理地址要靠段表先查出基址再相加

大小

页等大

段可变

可见性

透明

(页可能被打散、换出——程序毫无察觉)

可见

(段是真实存在的结构单元,谁都能看见)

利用情况

内部碎片

外部碎片

定位:

碎片

页表

访问分页系统中内存数据需要两次的内存访问 :一次是从内存中访问页表,从中找到指定的物理页号,加上页内偏移得到实际物理地址,第二次就是根据第一次得到的物理地址访问内存取出数据。

多级页表

多级页表(Multilevel Page Table)是一种内存管理技术,用于在虚拟内存系统中高效地管理和转换虚拟地址到物理地址。它通过分层结构减少页表所需的内存开销,以解决单级页表在大地址空间中的效率问题。

快表——TLBTranslation Lookaside Buffer,翻译后备缓冲区)

页表放在内存里,多级页表一次翻译最多要额外访存 4 次,而加入快表的设计后,一次访存的完整流程为:

  1. CPU 发出虚拟地址,MMU 拆出 VPN,先查 TLB;
  1. 命中(≈99%):直接拿到 PFN,拼上偏移得到物理地址,1 次访存搞定;
  1. 未命中(≈1%):硬件发起 Page Walk,逐级查四级页表(最多 4 次额外访存),查到的表项回填 TLB,下次就命中了;
  1. 若页表项有效位为 0,才进一步触发缺页中断去找磁盘。

缺页中断

当一个程序访问的页(页面)不在物理内存中时,就会发生缺页中断。操作系统需要从磁盘上的交换区(或页面文件)中将缺失的页调入内存。

页面置换算法

页面置换算法的目标是最小化缺页中断的次数,常见的页面置换算法有最佳⻚⾯置换算法(OPT)、先进先出置换算法(FIFO)、最近最久未使⽤的置换算法(LRU)和时钟页面置换算法等。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐