admin管理员组

文章数量:1516870

应用程序中使用的内存是虚拟内存地址,硬件设备中存放的地址是实际内存地址,操作系统通过CPU的内存管理单元(MMU)实现虚拟内存和实际内存的映射关系。操作系统管理内存主要有两种方式,为内存分段和内存分页。

内存分段

内存是由不同的分段组成的,各个段之间是相互独立的。

虚拟地址由两部分组成,分别是段选择因子和段内偏移量。

段表常用由两部分组成,分别为段基地址和段界限,段基地址是该段在物理内存中的起始地址,段界限指的是该段的实际内存大小。

通过段选择因子中的段号,查询段表中的段基地址,加上段内偏移量,获取物理地址。

内存分页

内存分页是把整个虚拟和物理内存空间切成一段固定尺寸的大小。这样一个连续并且尺寸固定的内存空间,我们叫页。在 Linux 下,每一页的大小为 4KB 。

虚拟地址由两部分组成,由页号和页内偏移量组成。

虚拟地址与物理地址通过页表映射,页表由虚拟页号和物理页号组成,虚拟页号主要对应虚拟地址中的页号,物理页号指的是实际内存中的页号。

用过虚拟地址中的页号查找页表,获取物理页号,加上页内偏移量,获取实际地址。

区别:

1. 内存划分方式

  • 分页(Paging)

    • 将物理内存和逻辑内存划分为固定大小的块

    • 物理内存的页称为页框,逻辑地址空间的页称为虚页

    • 通过页表将逻辑页号映射到物理页框号

  • 分段(Segmentation)

    • 按程序的逻辑单元划分内存,例如代码段、数据段、堆段、栈段等

    • 每个段的大小不固定,由程序的实际需求决定

    • 通过段表记录每个段的基址和界限

2. 地址空间

  • 分页

    • 一维地址空间:用户只需提供逻辑地址,由硬件自动拆分页号和页内偏移

    • 程序员无需感知分页的存在

  • 分段

    • 二维地址空间:用户需显式指定段号和段内偏移

    • 程序员可能需要关注段的划分

3. 碎片问题

  • 分页

    • 产生内部碎片:页是固定大小,若分配给进程的最后一页未填满,剩余空间被浪费

    • 无外部碎片,因为页框可灵活分配

  • 分段

    • 产生外部碎片:内存中存在大量不连续的小块空闲空间,难以利用

    • 无内部碎片,因为段按需分配

4. 透明性与用户视角

  • 分页

    • 对程序员完全透明,由操作系统和硬件自动管理

    • 用户看到的逻辑地址是连续的,物理地址可能分散

  • 分段

    • 对程序员可见,支持显式按逻辑划分内存

    • 更符合程序的自然结构

本文标签: 地址分页虚拟地址