物理内存 虚拟内存
物理内存指的是计算机中实际存在的硬件内存。物理内存是计算机用于存储运行中程序和数据的实际内存资源,操作系统和应用程序最终都必须使用物理内存来执行;
虚拟内存是操作系统提供的一种内存管理技术,它使得应用程序认为自己有连续的、独立的内存空间,而实际上,这个虚拟内存可能部分存储在物理内存上,部分存储在 磁盘(如硬盘的交换分区或页面文件) 中。
虚拟内存使用的是逻辑地址,它与实际的物理内存地址不同,必须经过地址转换才能映射到物理内存。
映射:操作系统将虚拟内存划分为多个页(分页),并通过页表映射到物理内存;如果物理内存不够,会基于页面置换算法将暂时不用的页面置换到磁盘的交换区。
分页 vs 分段
|
分页 |
分段 | ||
|
切割标准 |
切的是虚拟地址空间(按固定大小机械切分),同时物理内存也被切成等大的帧——两边单位一致 |
切的是程序的逻辑地址空间(代码/数据/堆/栈各有名字和边界) 在纯段式系统里,它就是进程的虚拟地址空间;但物理内存那边并不跟着切段,而是给每个段动态分配一段可变长的连续区域——这正是分段产生外部碎片的原因 | |
|
定位方式 |
按"大小"切地址空间(一维) 分页时地址写成"页号 + 偏移",看着像两个字段, 但它们能拼回一个连续整数:
|
分段是按"语义"切地址空间(二维) 分段时,段号不是地址空间的延续:
于是地址必须写成 (段号, 段内偏移) 两个独立坐标,且物理地址要靠段表先查出基址再相加 | |
|
大小 |
页等大 |
段可变 | |
|
可见性 |
透明 (页可能被打散、换出——程序毫无察觉) |
可见 (段是真实存在的结构单元,谁都能看见) | |
|
利用情况 |
内部碎片 |
外部碎片 |
定位:

碎片

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

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

快表——TLB(Translation Lookaside Buffer,翻译后备缓冲区)
页表放在内存里,多级页表一次翻译最多要额外访存 4 次,而加入快表的设计后,一次访存的完整流程为:
- CPU 发出虚拟地址,MMU 拆出 VPN,先查 TLB;
- 命中(≈99%):直接拿到 PFN,拼上偏移得到物理地址,1 次访存搞定;
- 未命中(≈1%):硬件发起 Page Walk,逐级查四级页表(最多 4 次额外访存),查到的表项回填 TLB,下次就命中了;
- 若页表项有效位为 0,才进一步触发缺页中断去找磁盘。

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

页面置换算法的目标是最小化缺页中断的次数,常见的页面置换算法有最佳⻚⾯置换算法(OPT)、先进先出置换算法(FIFO)、最近最久未使⽤的置换算法(LRU)和时钟页面置换算法等。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)