@yanglt7
2018-05-06T11:54:21.000000Z
字数 1538
阅读 991
第4章:非连续内存分配
操作系统
4.1 非连续内存分配:分段
(一)为什么需要非连续内存分配
- 连续内存分配的缺点
- 分配给一个程序的物理内存是连续的
- 内存利用率较低
- 有外碎片、内碎片的问题
- 非连续内存分配的优点
- 一个程序的物理地址空间是非连续的
- 更好的内存利用和管理
- 允许共享代码和数据(共享库等)
- 支持动态加载和动态链接
- 非连续分配:缺点
- 两种硬件方案
分段
4.2 非连续内存分配:分页
(一)分页
- 分页地址空间
- 页寻址方案
- 划分物理内存至固定大小的帧(frames),大小是2的幂,512,4196……
- 划分逻辑地址空间至相同大小的页,大小是2的幂,512,4196……
- 建立方案,转换逻辑地址为物理地址(page to frames)
帧(Frame)
- 物理内存被分割为大小相等的帧
- 一个内存物理地址是一个二元组(f, o)
- f:帧号(F位,共有2^F个帧)
- o:帧内偏移(S位,每帧有2^S个字节)
- 物理地址:2^S * f + o
例
- 16bit 的地址空间,9bit(512bytes)大小的页帧,物理地址=(3,6)
- 物理地址:2^9*3+6=512*3+6=1536+6=1542
页(page)
- 一个程序的逻辑地址空间被划分为大小相等的页
- 页内偏移大小 = 帧内偏移的大小
- 页号大小 帧号大小 (页表)
- 一个逻辑地址是一个二元组(p,o)
- p:页号(P位,2^P个页)
- o:页内偏移(S位,每页有2^S个字节)
- 虚拟地址:2^S * p + o
页寻址机制
- 页映射到帧
- 页是连续的虚拟内存
- 帧是非连续的物理内存
- 不是所有的页都有对应的帧
4.3 非连续内存分配:页表 - 概述、TLB
- 页表概述
- 转换后备缓冲区(TLB)
- 二级/多级 页表
- 反向页表
(一)分页机制的性能问题
- 问题:访问一个内存单元需要2次内存访问
- 页表可能非常大
(二)Translation Look-aside Buffer (TLB) 快表
- 缓存近期访问的页帧转换表项
- TLB使用associate memory(关联内存)实现,具备快速访问性能
- 如果TLB命中,物理页号可以很快被获取
- 如果TLB未命中,对应的表项被更新到TLB中
4.4 非连续内存分配:页表 - 二级/多级 页表
多级页表
- 通过把页号分为k个部分,来实现多级间接页表
- 建立页表“树”,以时间换空间
4.5 非连续内存分配:页表 - 反向页表
(一)大地址空间
- 有大地址空间(64bits),前向映射表变得繁琐
- 不是让页表与逻辑地址空间的大小相对应,而是让页表与物理地址空间的大小相对应
基于寄存器(Page Registers)的方案
- 每个帧和一个寄存器关联,寄存器内容包括:
- Residence bit:此帧号是否已被占用
- Occupier:对应的页号P
- Protection bits:保护位
- 页寄存器:一个例子
- 物理内存大小:4096*4096=4kB*4kB=16MB
- 页面大小:4096Bytes
- 页帧数:4096=4k
- 页寄存器使用的空间(假设8 Bytes/register):8*4096=32kBytes
- 页寄存器带来的额外开销:32K/16M = 0.2%(大约)
- 虚拟内存的大小:任意
- 页寄存器方案的权衡
- 利:
- 转换表的大小相对于物理内存来说很小
- 转换表的大小跟逻辑地址空间的大小无关
- 弊:
- 需要的信息对调了,即根据帧号找到页号
- 如何转换回来?即根据页号找到帧号
- 需要在反向页表中搜索想要的页号
基于关联内存(associate memory)的方案
基于哈希(hash)查找的方案