04 非连续内存分配机制中的页表
非连续内存分配之页表知识点目录
页表(由操作系统生成):
- 页表概述
- 转换后备缓冲区(
TLB
) - 二级/多级 页表
- 反向页表
页表寻址过程:CPU获得逻辑地址之后,获取页号,然后查询页表找到对应的帧号(页内偏移和帧内偏移是一样的),然后加上帧内偏移,就可以找到内存中的物理地址。
页表中存储有 Flags
即从左往右第二位,如果为零说明在内存中不存在对应帧,此时操作系统返回内存访问异常 ,如果存在,就读取所在的页表项对应的 Frame num
找到对应的物理帧,之后加上页内偏移就可以得到物理地址,此时就完成了虚拟地址到物理地址的映射。
假如给了一个16位的地址系统,说明虚拟内存的大小为2^16 = 64 K,而给出的物理地址的大小为32 K ,这进一步说明了虚拟内存的大小一般要大于物理内存的大小,即虚拟内存单元有可能在物理内存中找不到对应的映射存储单元。其次,用于表示二进制逻辑地址和物理地址的偏移量的位数为10位,说明页和帧的大小为2^10 = 1024 byte.
分页机制的性能问题:即访问一个内存单元需要 2
次内存访问
- 一次用于获取页表项
- 一次用于访问数据
另一个问题,操作系统建立的页表可能会非常大
- 比如一个64的计算机,它能表示的寻址空间大小为2^64 , 如果每页是1024字节,那么分成的页的大小为2^54 ,那么页表的大小就为2^54,这个空间太大,一般计算机难以满足,就算计算机能放下,如此大的页表也不能存放在CPU的
cash
(它的大小只有几兆),那么就需要放在内存中,这样会导致计算机的寻址效率变低 - 同时如果页表很大,每次进行寻址操作时也会耗费较长的时间
如何解决页表机制带来的时间和空间的问题,是接下来的学习方向:
首先解决时间访问的时间的问题:
快表Translation Look-aside Buffer( TLB
):用于缓存近期访问的页帧转换表项,存在CPU的内存管理单元中。以空间换取时间。
-
TLB
使用associative memory (关联内存)实现,具备快速访问性能 - 如果
TLB
命中,物理页号可能很快的被获取 - 如果
TLB
未命中,对应的表项被更新到TLB
中
如果页表很大,占用很大的空间,我们可以把一个页表用多级页表来表示
二级页表:(offset不变,但是吧page num
划分成两块,p1
和 p2
)p1
对应一级页表的页号, p2
对应二级页表的页号,一级页表中存的是二级页表的起始地址,二级页表存储是帧内偏移量,CPU知道一级页表的起始地址(存放在 PTBR
中),这样的机制的一个好处是,如果一级页表的中 p1
的某个映射关系不存在,那么在 p2
中我们就没有必要存储对应的映射关系,节省了空间。
多级页表:通过把页号分为K个部分,来实现多级页表,建立页表 树
,以时间换取空间。
反向页表
大的地址空间问题(逻辑地址):大地址空间(64位),前项映射表变得非常的繁琐,比如5级页表
解决问题的一个思路:不是让页表与逻辑地址空间的大小相对应,而是让页表与物理空间的大小向对应(反向页表)。
- 逻辑(虚拟)地址的空间增长速度快于地址空间
方案:页寄存器(Page
Registers
)方案
每个页和寄存器相关联,寄存器的寄存器内容包括:
-
Residence bit :
此帧是否被占用 -
Occupier:
对应的页号p -
Protection bits:
保护位
页寄存器方案的权衡
优点:
- 转换表的大小相对于物理内存来说很小
- 转换表的大小根逻辑地址空间的大小无关
弊端:
- 需要信息对调,即根据帧号可以找到页号
- 如何转换回来,即根据页号找到帧号
- 需要在反向页表中搜索想要的页号
提示:为了更好的理解知识点,博主在微信公众号中将操作系统知识进行了重新排版和插入图片。感兴趣的朋友可以扫码进行关注。