连续内存分配的缺点

  • 分配给程序的内存是连续的
  • 无法避免的产生外碎片、内碎片
  • 内存利用率较低

非连续内存分配的优点

  • 一个程序的物理地址空间是非连续的
  • 更好的利用和管理
  • 允许分享代码与数据(共享库等)
  • 支持动态加载和动态链接

非连续内存分配的缺点:

管理开销:如何建立虚拟地址与物理地址之间的转换

  • 软件方案
  • 硬件方案(CPU中MMU等)
  • 两种硬件方案
    • 分段
    • 分页

分段

  • 更好的分离和共享(根据应用程序的分段特点)
  • 将段(堆、栈、数据、依赖库等)分散到多个物理地址空间
  • 需要映射关系,将一段逻辑地址映射到非连续的物理地址
  • 分段寻址机制
    • 段号+段偏移量
    • 段寄存器+地址寄存器实现方案(x86)
    • 单地址实现方案
    • 操作系统设置段表

分页

  • 分页地址空间
    • 划分物理内存至固定大小的帧(大小是2的幂,eg 512、4096)
    • 划分逻辑内存至固定大小的帧
    • 建立方案:转化逻辑地址为物理地址(pages to frames)
      • 页表
      • MMU/TLB(转换后备缓冲区)
    • 物理内存被分割大小相等的帧
    • 一个内存物理地址是一个二元组(f, o)
      • f ——帧号(F位,共有2^F个帧)
      • o——帧内偏移(S位,每帧有2^S字节)
      • 物理地址 = 2^S * f + o
    • 页号+页偏移量
    • 一个内存逻辑地址是一个二元组(f, o)
      • p——页号(P位,共有2^P个帧)
      • o——帧内偏移(S位,每帧有2^S字节)
      • 物理地址 = 2^S * p+ o
  • 分页寻址机制
    • 页表保存了逻辑地址—物理地址之间的映射关系
    • 操作系统设置页表
    • 不是所有的页都有对应的帧

页表

  • 页表项
    • 每个运行的程序都有一个页表
    • PTBR:页表机制寄存器
    • 页表项的内容
      • Flages:dirty bit、resident bit、clock/reference bit
      • f 帧号
  • 分页机制的性能问题
    • 所需时间和空间越小越好
    • 解决方法
      • 缓存(TLB)
      • 间接访问(多级页表)
  • TLB(Translation Look-aside Buffer)
  • 缓存近期访问的页帧转换表项
    • TLB使用关联内存实现,具备快速访问性能
    • 如果TLB访问命中,则根据TLB表项直接访问物理地址,物理页号可以很快获取
    • 如果TLB访问未命中,则将内存中的表项加载到TLB中
  • 二级/多级页表
    • 减少页表空间占用
    • 逻辑地址表示P1+P2+偏移量
    • 先查找一级再去查找二级,知道最后找到物理帧号
    • 将页号分为K位,来实现多级页表,建立页表数
  • 反向页表
    • 反向页表,即不与逻辑地址大小相对应,相反与物理地址大小相对应
    • 基于页寄存器
    • 基于关联内存
    • 基于哈希表
    • 哈希函数——百度百科