《现代操作系统》笔记-内存管理3
接上
内存管理
页置换算法
1. 随机挑选一个置换
缺点:有可能置换出频繁使用的页
2. 最佳页置换算法
缺陷: 前提是必须要知道接下来哪些页面要使用,完全理想的情况,不可能实现。但可作为衡量算法优劣的标准,结果越接近的越优秀。
3. 最近未使用算法(Not Recently Used)
页表中节点的访问位(Reference)和修改位(Modified):当被访问后,R位会被设置;当被修改后,M位会被修改。但每过一个周期,R位会被全部清空,M位不变(因为要被写会磁盘)。
R位和M位在某一时刻可能存在几种情况
a. 未访问,未修改
b. 未访问,修改 (发生在刚刷新之后)
c. 访问,未修改
d. 访问,修改
依顺序淘汰相应的页面。
NRU淘汰页的思路: 淘汰掉已经修改的但至少一个周期(20毫秒左右)未访问的页比淘汰频繁使用的页要好。
4. 先进先出页置换算法 (FIFO)
先进入的页先被淘汰。
缺点:有可能淘汰频繁使用的页
5. 第二次机会页置换算法 (Second Chance) —— FIFO改进
逐个查找所有的页,如果它已经被访问过(R位被设置),则清空R位,并重置进入内存的时间为当前,移动至队尾。直到找到一个未被访问过的页。(如果都被访问过,则退化为FIFO算法,第1个被淘汰)
6. 时钟页面置换算法(Clock) —— Second Chance改进
将页面像时钟一样排成环形,指针开始时指向最“老”的页面,之后同第二次机会算法一致。优化了“第二次机会”中的反复移动页面。
7. 最近最少使用算法 (Least Recently Used)
现象:过去频繁使用的页在未来也会被频繁使用。
要维护一个链表,最近最多使用的页在最前面,最近最少使用的页在最后面,缺页时淘汰最后面的。
缺点: 每次访问页面都要更新链表,代价太高。即使硬件实现也较为复杂。
8. 软件模拟LRU
(1)实现最不频繁使用NFU(Not Frequently Used)
每次时钟中断后,将R位的值添加到计数器,淘汰计数最小的页(与LRU相比没有“最近”的概念)。
缺点:在多通道编译器(multipass compiler)中,在某个通道会频繁使用一部分内存,在另一通道会使用另一部分。在刚刚执行另一通道时,新调入的内存会因使用较少而马上被淘汰。由于在该通道执行,又要马上调入(因为没有“最近”的概念)。
(2)改进——加入老化(aging)
在向计数器添加R位的值时,先右移一位,将新值添加到最左侧(相当于为最近使用的页添加了权重)。
缺点:
a. 都有相同的周期未使用时,不能明确哪个是最后被使用。—— 因为不是每次访问内存都更新页状态
b. 计数器的位数有限,只能监测最近短时间的数据。例如计数器是8位,那么前9次访问过的页和前1000次访问的页表现相同。
9. 工作集页面置换算法 (Working Set)
之前的页面置换算法均为请求调页(demand paging),它们总是在需要时才加载。程序执行时对内存的访问是局部性的,因此恢复进程时可以预先调页(prepaging)。
程序每执行几个指令发生的缺页异常被称为颠簸(thrashing)。
工作集概念:最近k个最常使用的页。随着k的增大,工作集的容量的增加先快后慢,无限趋近一个值。因为程序不能取得比它的地址空间更大的内存,而且很少有程序会用尽地址空间(这是假设程序所需内存一直增加的最坏情况下)。
缺点:每次内存访问都要遍历维护的页状态表,将所有页面左移,在右侧添加最近访问的页面,删除重复的页并排序(维护程序集),开销太大,从未使用。
改进: 将最近k个改为最近 t 时间内访问的页
一个进程从它开始执行到当前所实际使用的CPU时间总数被称为当前实际运行时间(current virtual time)。在要淘汰页面时,对时间进行比较:
a. 已经访问过的页,将R位清空,将最后使用时间设置为当前实际运行时间
b. 在 t 时间外的且未访问的页,淘汰
c. 在 t 时间内但未访问的页页,记录下时间。在未找到其它合适页的情况下,淘汰时间最久远的
d. 在最近的一次时钟周期内都被访问了,则随机淘汰。倾向于淘汰未被修改的页。
10. 工作集时钟页面置换算法(WS Clock)
将页状态表像时钟一样环形排列,淘汰算法与工作集页面置换算法相同。实现简单,性能较好,被广泛使用。
理论上,所有的页面都有可能被调度到磁盘I/O,写回磁盘。但为了降低磁盘阻塞,需要限制最大n个页面可以被写回。一旦达到了n,被修改的页就不能被写回磁盘。
指针走过一轮后可能出现的情况:
a. 至少有一次写操作被调度
待写操作完成后,淘汰第一个已经被写回的页面即可(此处的第一个页面不一定是第一个找到页面,因为写回指令可能被重排序)。
b. 没有调度过写操作
所有的页面都在工作集中,因此没有调度过一次写操作。随机置换一个未被修改的页面(扫描中需要记录干净的页面)。如果没有干净页面,则选定当前页并写回磁盘后置换。