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