非连续内存分配
为什么要非连续内存分配?
- 分段
- 分页
- 页表
连续内存分配的缺点:
- 分配给一个程序的物理内存是连续的
- 内存利用率较低
- 有外碎片,内碎片的问题
非连续分配的优点:
- 一个程序的物理地址空间是非连续的
- 更好的内存利用和管理
- 允许共享代码与数据
- 支持动态加载和动态链接
非连续分配的缺点:
- 如何简历虚拟地址和物理地址的转换
- 软件方案
- 硬件方案
硬件方案
分段
- 程序的分段地址空间
- 分段寻址方案
- 一个段一个内存“块”:一个逻辑地址空间
- 一个二维的二元组(s, addr):s 一个段号,addr 一段内偏移
分页
- 分页地址空间
- 划分物理内存至固定大小的帧:大小是2的幂
- 划分逻辑地址空间至相同大小的页:大小是2的幂
- 建立方案 转换落地地址为物理地址:
- 页表
- MMU/TLB
- 帧:物理内存被分割成大小相等的帧
- 页:一个程序的逻辑地址空间被划分为大小相等的页
- 页寻址方案
- 页表保存了逻辑地址-物理地址之间的映射关系
- 页寻址机制
- 页映射到帧
- 页是连续的虚拟内存
- 帧是非连续的物理内存
- 不是所有的页都有对应的帧
页表
- 每一个运行的程序都有一个页表
属于程序运行状态,会动态变化
PTRB:页表基址寄存器
- 分页机制的性能问题:
访问一个内存单元需要2次内存访问:
一次用于获取页表项
一次用于访问数据
页表可能非常大
64位机器如果每页1024字节,那么一个页表大小会是多少?
如何处理:
缓存 TLB
缓存TLB使用associative memory 关联内存实现,具备快速访问性能
如果TLB命中,物理页号可以很快被获取
如果TLB未命中,对应的表项被更新到TLB中(跟CPU有关,可能由操作系统或者是硬件来实现)
间接访问
多级页表:通过把页号分为k个部分,来实现多级间接页表
建立页表
大地址空间问题
有大地址空间,前项映射页表变的繁琐
不是让页表与逻辑地址空间的大小相对应,而是让页表与物理空间的大小相对应
- 基于页寄存器的方案
每个帧和一个寄存器关联,寄存器包括哟
residence bit 此帧是否被使用
occupier 对应的页号p
protection bits 保护位
- 优点
- 转换表的代销相对于物理内存来说很小
- 转换表的大小和逻辑地址大小无关
- 缺点
- 需要的信息对调了,即根据帧号可找到页号
- 如何转换回来?
- 在需要的反向页表中搜索想要的页号
- 使用关联内存的方案
- 基于hash计算的查找方案