第七章 换入/换出——用磁盘和时间来换取一个规整的虚拟内存
7.1 规整的虚拟内存
7.1.1 虚拟内存与换入/换出
正是由于虚拟内存这个概念的实现,我们才需要将物理内存中存放的内容不断换入新的虚拟内存映射和换出断开旧的虚拟内存映射。
7.1.2 请求调页
内存换入的核心就是:在缺少虚拟页的时候请求调页,操作系统实现换入就是实现请求调页。
整个过程从MMU发现虚拟页面不在页表项中时开始,会将虚拟页面从磁盘中读入一个空闲物理内存页框之中,并更新页表。
7.1.3 页面调入的具体实现
7.2 页面换出
7.2.1 基本的页面换出算法
当物理内存满了的时候,找不到空闲的物理页框,我们需要把一些不常用的换出到磁盘中,腾出空间给需要换入的页面。
由此,产生了几个基本的页面换出算法:
1. 先进先出 FIFO算法 (First-in First-out): 哪个页框谁先进来,哪个页框谁先出去。 2. 最优置换算法 OPT (Optimal Replacement): 选择未来最远的那个页面换出。 3. LRU算法
7.2.2 LRU算法的准确实现
最近最少使用算法 LRU (Last Recently Used): 选择历史上最近很长时间没被访问的页面换出
1. 基于时间戳的实现 记录每个页面的到来的时间戳,选择最小的淘汰。但是时间戳的更新维护代价太大,因为它要记录在页表项之中。 2. 基于页面栈的实现 每次访问某个页面时就将它浮动到栈顶,然后每次需要换出时,换出栈底的页面。页面栈的实现可以使用指针链表数据结构。但每次访问页面时,我们都需要维护页面栈,
7.2.3 clock算法
LRU的简化近似形成了CLOCK算法: 它有很多变形,这里介绍基础思想:
1. 用信息记录页面使用情况 2. 用硬件来维护这一信息 3. 在访问结束后更新这一信息
第二次机会置换算法 SCR (Second Chance Replacement) 基于访问位的clock算法实现
7.2.4 页框个数分配与全局置换
分配给进程物理页框过多会导致系统并发进程数量少,分配过少会导致物理内存频繁换入换出,导致系统颠簸。
系统颠簸: 内存页和磁盘之间频繁地换入/换出,引起CPU空闲等待现象。
系统颠簸的根本原因: 给进程分配的物理页框数量太少,无法覆盖当前进程执行时的"局部",导致频繁换入/换出
工作集模型(working set model) 就是用来解决物理页框分配问题: 他通过统计进程在最近一个历史窗口Δ中访问了多少页,来进行合适分配。
全局置换策略也是解决进程物理页框个数分配问题: 定期对所有页面进行clock算法扫描,将最近很少使用的页面换出到磁盘之中。