连续内存分配的缺点
- 分配给程序的内存是连续的
- 无法避免的产生外碎片、内碎片
- 内存利用率较低
非连续内存分配的优点
- 一个程序的物理地址空间是非连续的
- 更好的利用和管理
- 允许分享代码与数据(共享库等)
- 支持动态加载和动态链接
非连续内存分配的缺点:
管理开销:如何建立虚拟地址与物理地址之间的转换
- 软件方案
- 硬件方案(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位,来实现多级页表,建立页表数
- 反向页表
- 反向页表,即不与逻辑地址大小相对应,相反与物理地址大小相对应
- 基于页寄存器
- 基于关联内存
- 基于哈希表
- 哈希函数——百度百科
