文章目录
- 一. 分页存储概念
- 二. 地址转换
- 1)为什么页面大小为2的次幂?
- 三. 页表
- 1)页表项长度、页号"隐含"
- 四. 局部性原理与快表
- 五. 二级页表
- 1)单级页表存在的问题
- 2)两级页表
- 3)如何解决单级页表的问题
一. 分页存储概念
- 内存分成等大区域(页框),页框号从0开始
- 进程也分成和页框等大的区域(页),页号也从0开始
- 页框不能太大,可能产生过大内部碎片(进程的最后一个页面不一定撑满页框)
- 进程页面 - 内存页框一一对应。
二. 地址转换
- 找逻辑地址对应页号
- 找页号对应内存的起始地址①
- 计算逻辑地址在页面内的偏移量②
- 物理地址 = 页面起始① + 页内偏移量②
1)为什么页面大小为2的次幂?
- 方便计算
- 偏移量最大值 - 对应一个页面持有内存单元个数(k 位 - 2k2^k2k个)
- 页号 - 对应一个进程最多允许持有页面个数(m 位 - 2m2^m2m个)
三. 页表
- 记录每个页面在内存中的位置
- 页表项 = 页号 + 块号(由块号获取内存地址)
1)页表项长度、页号"隐含"
- 因为页表项按序连续存于内存,且页号长度相同,因此页号无需明确表示。
- 延申:理论上 3B 就够,但是为了方便页表的查询,常常会让一个页表项占有更多字节,使得每个页面恰好装得下整数个页表项(也就没有内存碎片,比如此处 4KB % 3B = 1B 的内存碎片,但是 4KB % 4B = 0B)
四. 局部性原理与快表
- 时间局部性:指令一段时间内可能多次执行(由于程序存在循环)
- 空间局部性:存储单元附近的存储单元可能被访问(由于很多数据在内存中连续存放)
- 快表:高速缓冲寄存器,比内存块。用来存放当前访问的若干页表项,达到加速地址变换的效果。
- 慢表:内存中的页表
- 快表使用:
- 快表:命中率高、一次访问内存。满则置换
- 慢表:两次访存
五. 二级页表
1)单级页表存在的问题
- 单级页表太大,又由局部性原理知道一段时间内只需访问几个页面即可,没必要让整个页表常驻内存
- 解决方法:对页表分组,分组与内存块等大。可以离散存放页表分组了,也因此,需要再给离散的页表建一个页表——顶层页表。
2)两级页表
- 32位、页 4KB、页表项 4B 的情况下,可知页表需要占用 2^10 = 1024 个页框。
- 那么,我们可以使用离散的1024个页框,然后用一个顶级页表来记录这些页框的块号
- 也就可以推出:一级页号用 10B,二级页号用 10B(二级页表的排法)
3)如何解决单级页表的问题
- 需要记录某一页表是否在内存中
- 两级页表不够,就用更多级
- 多级页表的访存次数 = N级页表用 N + 1 次(没有快表的情况)