本次笔记内容: 6.1 最优页面置换算法 6.2 先进先出算法 6.3 最近最久未使用算法 6.4 时钟页面置换算法 6.5 二次机会法 6.6 最不常用法 6.7 Belady现象、LRU、FIFO、Clock的比较 6.8 局部页替换算法的问题、工作集模型 6.9 两个全局置换算法 6.10 抖动问题
尽可能减少页面的换进换出的次数(即缺页中断的次数)。因为读取磁盘比读取内存慢几个数量级。
同时,操作系统常用的数据段要一直保留在内存中。
页面锁定(Frame locking):用于描述必须常驻内存的操作系统的关键部分或时间关键(time critical)的应用进程。实现方法是:在页表中添加锁定标志位(lock bit)。
如上图,只保留进程对 页号 的访问轨迹,查看你产生缺页中断的次数。越少的缺页数量,越好的性能。
提出愿景:预知将来程序会访问哪些页面,由此决定替换谁。
基本思路:一个缺页中断发生时,对于保存在内存当中的一个逻辑页面,计算在它的下一次访问之前,还需等待多长时间,从中选择等待时间最长的那个,作为被置换页面。
这只是一种理想情况, 在实际系统中无法实现。 因为操作系统无法预知每一个页面要等待多长时间以后才会再次被访问。
可以把本算法作为一个评价标准(在模拟器上运行,第二遍运行时采用这最优算法)。
最优置换算法例子如上。
基本思路:选择在内存中驻留时间最长的页面并淘汰之。具体来说,系统维护着一个链表,记录了所有位于内存当中的逻辑页面。从链表的排列顺序来看,链首页面的驻留时间最长,链尾页面的驻留时间最短。
性能较差,调出页面可能是经常要访问的页面,并且有 Belady现象 ,FIFO算法很少单独使用。
例如上,产生了更多的缺页中断。
LRU算法例如上。
系统维护一个页面链表,最近刚刚使用过的页面作为首节点,最久未使用的作为尾结点。每一次访问内存时,找到相应的页面,把它从链表中摘下来,在移动到链表之首。每次缺页中断发生时,淘汰链表末尾的页面。
设置一个活动页面“栈”,当访问某页时,将此页号压入栈顶,然后,考察栈内是否与此页面相同的页号,若有则抽出。当需要淘汰一个页面时,总是选择栈底的页面,它就是最久未使用的。
每次访问都需要查找一般堆栈。 此算法代价很大。
如果用堆栈实现LRU,如上图。
Clock页面置换算法,LRU的近似,对FIFO的一种改进。
基本思路:需要用到页表项当中的访问位,当一个页面被装入内存时,把该位初始化为0。然后如果这个页面被访问(读/写),则把该位置为1;
把各个页面组织形成环形链表(类似钟表面),把指针指向最老的页面(最先进来);
当发生一个缺页中断时,考察指针所指向的最老页面,若它的访问位(used bit)为0,立即淘汰;若访问位为1,则把该位置为0,然后指针往下移动一格。如此下去,指导找到被淘汰的页面,然后把指针移动到它的下一格。
如图所示。
例如上,缺页发生时,指针指为0者,被替换,并且指针指向下一位。实际工作环境中,此算法与LRU效果差不多。
上图为算法机制。
页在被输入内存前,是存在于磁盘中的。
如果程序只是对页进行读,则释放时只需删除该页就好(因为磁盘中已经存在此页),不需再写入磁盘;而程序对页进行写操作后,在内存中释放该页,则需要把此页写入磁盘中。因此,为了避免对磁盘中已有页面的重复写入,同时避免改变的页面过于频繁地进出内存,增加一个脏位(dirty bit)进行判断。上图为二次机会法的例子。
如上图,物理页3页,访问12次时三次没有产生缺页中断。
如上图,物理页4页,同样的访问序列时,只有两次没有产生缺页中断,性能反而变差了。
为什么LRU页面置换算法不会出现Belady现象?此处不详细解释,因为LRU算法符合栈算法的特点。
《操作系统概念》中某节对于这种现象做了详细解释。
对于上图,以起始时间为t2的工作集效果更好。
当局部性好时,工作集大小趋于稳定。
工作集是进程在运行过程中固有的性质,而常驻集取决于系统分配给进程的物理页面数目,以及所采用的页面置换算法;
如果一个进程的整个工作集都在内存当中,即常驻集包含工作集,那么进程将很顺利地运行,而不会造成太多的缺页中断(直到工作集发生剧烈变动,从而过渡到另一个状态);
当进程常驻集的大小达到某个数目之后,再给它分配更多的物理页面,缺页率也不会明显下降。 即,常驻集是当前运行的程序,需要访问的页,哪些在内存中; 工作集是程序在运行过程中,需要访问的页是哪些。
我们希望工作集都在常驻集中;如果不在则缺页中断。
下图所示的时间窗页面置换。开始时,时刻为1时,工作集为[e,d,a,c]。
随着时间滑动,未发生中断时也会释放划出的页面。
如果常驻集大小可变,启发出:缺页率的页面置换算法。
可变分配策略:常驻集大小可变。例如:每个进程在刚开始运行的时候,先根据程序大小给它分配一定数目的物理页面,然后在进程运行过程中,再动态地调整常驻集的大小。 可采用全局页面置换的方式,当发生一个缺页中断时,被置换的页面可以是在其他进程当中,各个并发进程竞争地使用物理页面。优缺点:性能较好,但是增加了系统开销。具体实现:可以使用缺页率算法(PFF,page fault frequency)来动态调整常驻集的大小。如果缺页率过高,则增加工作集,来分配更多物理内存; 如果缺页率过低,则减少工作集,来减少该进程的物理内存分配。
具体算法如下。
对于4时刻,4-1=3,大于2,则需要从工作集中去除1、2、3、4时刻没有访问过的页面,即a、e。
此类算法在采取多个运行的程序,有优势。
如果分配给一个进程的物理页面太少,不能包含整个工作集,即常驻集属于工作集,那么进程将会造成很多的缺页中断,需要频繁地在内存与外存之间替换页面,从而使进程的运行速度变得很慢,称为“抖动”。
产生抖动的原因:随着驻留内存的进程数目增加,分配给每个进程的物理页面数不断减小,缺页率不断上升。所以OS要选择一个适当的进程数目和进程需要的帧数,以便在并发水平和缺页率之间达到一个平衡。
随着程序越来越多,机器会越来越迟钝。程序多,缺页多,操作系统频繁进行I/O操作,机器没有空闲执行程序。
因此,可寻找一个平衡点,利用率为平衡状态。
