置换算法

当出现缺页异常时,需调入新页面而内存已满时,置换算法选择被置换的物理页面。要在该过程中,尽可能减少页面的调入调出次数。把可能就需要将未来不再访问或短期内不在访问的页面调出。
评价方法:模拟页面置换算法,记录产生缺页的次数。更少的缺页,更好的 性能。

最优页面置换算法

基本思路:置换在未来最长时间内不会被访问的页面。

实现:缺页时,计算内存中每个逻辑页面的下一次访问时间。选择未来最长时间不访问的页面。

特征:

- 缺页最少,理想情况。

- 实际系统中无法实现

- 无法预知每个页面在下一次访问前的等待时间

- 作为置换算法的性能评价依据。

举个例子:

操作系统页面置换算法用python代码 操作系统 页面置换算法_逻辑页

先进先出置换算法

思路:选择在内存驻留时间最长的页面进行置换
实现:维护一个记录所有位于内存中的逻辑页面链表
链表元素按主流内存的时间排序,链首最长,链表最短
出现缺页时,选择链首页面进行置换,新页面加到链尾。
特征:

  • 实现简单
  • 性能较差,有可能调出的页面是经常访问的
  • 进程分配物理页面数增加时,缺页不一定减少
  • 很少单独使用

操作系统页面置换算法用python代码 操作系统 页面置换算法_链表_02

最近最久未使用算法

思路:选择最长时间没有被引用的页面进行置换。如果页面长时间未被访问,则它们在将来可能会长时间不会访问。

实现:缺页时,计算内存中每个逻辑页面的上一次访问时间。

选择上一次使用到当前最长的页面。

特征:最优置换算法的一种近似。

操作系统页面置换算法用python代码 操作系统 页面置换算法_操作系统页面置换算法用python代码_03

时钟置换算法

思路:仅对页面的访问情况进行大致统计。
对数据结构进行修改:
在页表项中增加访问位,描述页面在过去一段时间的访问情况。
各页面组织成环形链表。
指针指向最先调入的页面。
特征:时钟算法是LRU和FIFO的折中。

操作系统页面置换算法用python代码 操作系统 页面置换算法_逻辑页_04

改进的clock算法:
减少修改页的缺页处理开销。
算法:在页面中增加的修改位,并在访问时进行相应修改。缺页时,修改页面标志位,以跳过有修改的页面。

最不常用算法

思路:缺页时,置换访问次数最少的页面。
实现:每个页面设置一个访问计数。
访问页面时,访问计数加1。
缺页时,置换计数最小的页面。

特征:
- 开销大。
- 开始时频繁使用,但以后不使用的页面很难置换。

抖动

抖动:

  • 进程物理页面太少,不能包含工作集。
  • 造成大量缺页,频繁置换。
  • 进程运行速度变慢。

产生抖动的原因:
随着驻留内存的进程数目增加,分配给每个进程的物理页面数不断减少,缺页率不断上升。