内容系听课复习所做笔记,图例多来自课程截图
操作系统需要提供两大功能:
- 请求调页:缺失页面调入内存
- 页面置换:暂时不用的换出外存
页表机制
原先的页式管理使用的页表并不能满足新的需求,因此需要为页表增加新的页表项目,其考量主要有如下几个方面:
- 需要在请求调页时能够判断某个页面是否已经调入内存(即状态位)
- 需要在请求调页时,若没调入就得知道在哪调入(即外存地址)
- 需要在请求调页时能够根据某个指标决定调出哪个页面(即访问字段)
- 调出页面时如果该页面没被修改过就应当不浪费时间写入外存(即修改位)
因此页表应当变为如下样子:
内存块号 | 状态位 | 访问字段 | 修改位 | 外存地址 |
---|---|---|---|---|
无 | 0 | 0 | 0 | x |
b | 1 | 10 | 0 | y |
c | 1 | 6 | 1 | z |
状态位:0是没调入,1是已调入
访问字段:可记录最近访问几次或者上次访问时间
缺页中断机构
缺页中断是内中断
当欲访问的页面不在内存时,就会产生一个缺页中断,然后由操作系统的缺页中断处理程序处理。
此时检查是否有空闲的物理页面:如果无,进行1;如果有,进行3
- 按某种页面置换算法选择一个页面被替换
- 如果该页面被修改过,需重新写回外存(覆盖旧数据)
- 把需要的页面调入内存,同时更新主存页表和快表(如果有)
一条指令执行期间可能产生多次缺页中断
如把逻辑地址A的数据复制到B,它们属于不同的页面,且都不在内存中
地址变换机构
快表保存的页面必须在内存中,若换出则应当删除快表的备份
只有执行写指令后才需要修改“修改位”(有快表一般只修改快表,只有该快表项删除时才修改慢表,以减少访存次数)
缺页中断是要保留CPU现场的(和普通的中断处理一样)
换入/换出都涉及启动慢速的I/O操作,越频繁开销越大
完整的缺页流程
- 查快表,且未命中
- 查慢表,发现没调入内存
- 调页,修改慢表,也需要将表项复制到快表
- 查快表,命中
- 访存