硬件和控制结构
1. 分页
- 虚拟地址与页表项
1.1 地址转换
| | 注意点:
- 虚拟地址即逻辑地址
- 页表指针寄存器位于”进程控制块”中
- 由于页表长度基于进程长度而变化,因此页表不能在寄存器中保存,须在内存中且可访问
- 一般每个进程都一个页表,页表可能占据巨大的空间:某系统中,一个进程可有虚存2GB=231,页大小29
,则一个进程就需要222页
- 解决:在虚存中保存页表—页表本身也使用分页机制
|
| —- | —- |
1.2 二级页表
对一个32位机器,当虚拟空间大小4GB,页大小4KB时
- 一般分页
当页大小4k,4G/4k=220,需要220页,即220=2MB个页表项,直接放置在内存占据空间
- 二级分页
| 👉
在32位机器中,当页大小为4KB,虚拟空间4GB:
2/4k=2,分为2页,当每页都使用一个4B的页表项映射,构成一张二级页表,需要内存空间4*2=4MB |
页目录表(Directory)/一级页表/根页表
页表地址(Table)/二级页表/用户页表 | 👈
把4GB空间分为1024个可被页目录索引的页组(二级页表),每个页组长4MB.包含1024个项,每项对应大小4KB的页.
此时实存中只保存了2个一级页表项 |
| —- | —- | —- |
| 4B页表项即32b地址,符合32位机 | | |
| 2/4k=2,需要2个页目录,则1级是包含1024个项的页目录表/一级页表 | | |
1.3 倒排页表
(Inverted Page Table)
_
多级页表不足 | 页表大小与虚拟空间大小成正比 |
---|---|
倒排 | 使用散列函数将n位页号映射到散列表得到m位帧号,表中有指向倒排表的指针,倒排表中有页表项.这种结构下,散列表和倒排表各有一项对应一个实存页: - 散列指针->页表项 - 链->页表项/物理地址 |
由于多个虚拟地址可能映射到一个散列表项中,需要使用链接技术管理溢出,因此无论有多少进程,支持多少虚拟页,页表只需要实存中的一个固定部分
(类比数据结构散列表有限,但通过散列函数和二次散列等方式保证了散列值的不同)
- 称为”倒排”的原因:使用帧号而非虚拟页号索引页表
|
1.4 转换检测缓冲区(TLB)
快表(TLB:
Translation Lookaside Buffer)
虚存访问的普遍问题:会访问两次物理实存:访问页表、访问物理地址
使用TLB旨在解决该问题:
- 给定虚拟地址,处理器先检查TLB
- 若命中,则检索帧号形成物理地址(避免了二次访问)
- 未命中,使用页号检索页表,当存在位
- 已置位,直接从页表项中取出帧号形成物理地址,更新TLB
- 未置位,缺页(page fault)发生,操作系统接管,从外存中取出数据装入页,更新页表
- TLB**与cache的关系
TLB实际上是一块特殊的cache,用于保存最近使用过的页表项,从而避免再次进入内存访问
TLB从RAM中取数据—cache映射三种:直接,全关联,组关联**(参考:系统级编程 Ch12 Cache深入)1.5 页尺寸
1.6 分页与缺页率
| |
- 由a,开始页尺寸加大,缺页率升高,然后又成反比,最终,当页和进程大小一样,没有缺页出现(分段)
- 由b,当分配的页框数越充裕,缺页率越低
| —- | —- |<br /><br /> |
2. 分段
| | 基于分段的虚拟内存中,每个进程有唯一的段表
- 存在位:由于一个进程可能只有一部分段在内存中,因此段表有一位表示段是否存在
- 修改位:表明上次被装入内存到目前位置其内容是否改变
| | —- | —- |
3. 段页式
| | 段页式结构中,每个进程使用一个段表和一些页表. 段表项:包含段长和Base,无需存在位和修改位,留在页级处理
页表项:类似纯粹的分页,需要P,M位
- 程序员角度:逻辑地址=段号+段偏移
- 系统角度:段偏移即指定的页号+页偏移| | —- | —- |
操作系统策略
1. 读取策略
策略意义 | 决定某页何时取如内存 |
---|---|
方式 | - 请求分页式(Demand paging):访问到某页时才取入 - 问题:开始可能遇到大量缺页中断 - 预约分页式(Preparing):事先读取多于当前需要的页 - 问题:当大多数页没有用到时,效率低 |
2. 放置策略
策略意义 | 决定进程块驻留在实存的什么位置 |
---|---|
方式 | - 对分段系统和NUMA(nonuniform |
memory access非一致存储器访问)系统<br /> - 放置策略影响较大<br />- 对分页或段页式系统<br /> - 放置位置无影响,地址转换和内存访问对不同位置页框执行效率一致<br /> |
3. 置换策略⭐
策略意义 | 决定读取新页时应该置换出内存中哪一页 |
---|---|
方式 | - OPT:最佳策略,选择换出下次访问距当前时间间隔最长的页 - 问题:不可能实现,需要预测未来的进程 - LRU:最近最少使用,换出上次访问距今时间最长的页 - 问题:性能接近OPT,实现开销巨大 - FIFO:先进先出队列 - 问题:实现简单,但隐含替换留存时间最久的页,不一定符合局部性原理,中断多 - Clock Policy:时钟策略 - 👇时钟置换策略 ,以较小的开销实现LRU性能 |
3.1 时钟置换策略
时钟策略给每个页框关联一个”使用位”,实现了较小开销下接近LRU的性能
具体实现⭐:
- 当某页第一次被放入内存中,”使用位”置为1,且有一个指针与内存缓冲区关联.
- 外存中数据块要换入时,指针扫描缓冲区,查找使用位=0的页框
- 当遇到使用位=1的页框,置为0
- 当所有页框都为0,换出第一块
- 当所有页框都为1,将每个页框使用位置0后,回到起点块换出
- 当某页框被置换出后,指针指向该位置的下一个页框
| | 例子:
要换入页727,初始指针在页框2
① 页框2处使用位为1,置为0,指针后移
② 页框3处使用位为1,置为0,指针后移
③ 页框4处使用位为0,换出,将727置入,指针后移 | | —- | —- |
4. 驻留集管理
策略意义 | 决定给进程分配多少空间,允许其中多少页驻留在内存中 |
---|---|
分配方式 | - 固定分配策略:分配固定的页框 - 可变分配策略:根据缺页率,可动态调整页框分配 |
置换范围 | - 局部置换:只换出分配该进程内存页框中的页 - 全局置换:可换出内存所有可用页框中的页 |
组合方式 | - 固定+局部:缺页时,从该进程驻留页中选择一页换出 - 可变+局部:评估后,为进程分配不一定等大的页框,缺页时,从当前进程驻留页中换出,但系统不时重新评估,动态调整 - 可变+全局:最易于实现,所有进程页框数一样,但系统维护一个空闲页框列表,当缺页发生,空闲页框可加入进程驻留集,从而改变驻留集大小 |
5. 清除策略
策略意义 | 确定何时将已经修改的一页写回辅存 |
---|---|
方式 | - 请求式(demand |
cleaning):当一页被置换时才写回<br /> - 问题:中断解除阻塞前要经过旧页写回和新页读入两次<br />- 预约式(precleaning):将修改的多页在置换前成批写回<br /> - 问题:可能浪费资源,毕竟大部分页在写回后又会修改<br /> |
6. 加载控制
策略意义 | 影响系统并发度:驻留在内存中的进程数量 |
---|---|
影响 | - 进程太少:进程运行处于阻塞态的概率较大 - 进程太多:平均到每个进程的驻留集空间不够,频繁缺页中断,发生系统抖动 |
本章动画: http://williamstallings.com/OS-Animation/Animations.html