前面讲到,我们需要将一些页面加载到内存,此时刚好内存上没有可用的物理内存编号,这个时候就需要将一些页面置换到磁盘让出位置。
置换的基本策略:
置换最近不可能访问的页
根据局部性原理,基于过去的行为来预测将来的行为。
策略设计太简单,实行起来可能会很低效,如果过于精密和复杂,软硬件开销也会更大,一般需要折中。
页框锁定:
一些页框是绝对不允许被置换出去的,否则会出错或者影响效率,如:
- 操作系统核心代码
- 关键数据结构
- 正在进行IO操作缓冲区等
我们需要将这些页面锁定,不让操作系统对这些页面进行置换或者延迟进行置换,避免发生不确定的事情。
最佳页面置换算法:难以实现
置换以后不再需要或者最远的将来才会用到的页面。
先进先出
最先进内存的页面,最先被置换出去
第二次机会
先进先出的改进版
先按照先进先出选一个页面,检查访问位,如果为0,就置换出去,否则不置换,并将标志位置0,这就是第二次机会。
时钟算法
根据指针指向确定哪个被置换,比遍历链表能快一些。
最近未使用
选择最近一段时间没有为使用过的一页并置换,通过检测一些标志位实现。
最近最少使用
选择最后一次访问时间距离当前时间最长的一页进行置换。需要记录时间戳,消耗空间,但是最接近最佳页面置换算法。
最不经常使用
选择访问次数最少的页面转换,实现时可以使用计数器
老化算法
改进LRU
工作集
TBD
工作集时钟
TBD
页面抖动现象:
由于内存中进程越来越多,分配给每个进程页面数不断的减少,缺页率自然而然上升。导致产生大量的缺页异常,一些页面被频繁的换出换入,使得进程的运行速度明显拖慢。
根本原因:硬件资源太少
资源一般我们比较难改变,这就需要设计一种比较优的置换算法,也需要我们的程序员写出局部性优的代码来。