当内存中的页面满了之后,需要的数据又在磁盘虚拟内存中,可以使用页面置换算法将需要的页置换到物理内存中。下面先介绍几种局部页面置换算法,其针对一个进程而言的页面置换。
一、局部页面置换算法
1、最优页面置换算法
功能:当缺页中断发生时,需要调入新的页面而内存已满时,选择内存中哪个物理页面被置换。
目标:尽可能地减少页面的换进换出次数(即缺页中断的次数)。具体地说,将未来不再使用或者短期不再使用的页面置换出去。
页面锁定(frame locking):用于描述必须常驻内存的操作系统的关键部分或时间关键的应用程序。即那些必不可少的数据。
基本思路:当一个缺页中断发生时,对于保存在内存中的每一个逻辑页面,计算它的下一次访问之前还需要等待多长时间,从等待时间中选取最长的那个页面将其置换。
注意:该算法只是一种理想的情况,在实际时无法实现,因为操作系统是无法知道每个页面需要等待的时间。但是该算法可以作为页面置换算法的一个标杆,用以衡量其他页面置换算法的性能。
下图是一个页面置换算法的简单例子,假设物理内存中有4个页帧,表的第二行为某个进程调用页面的轨迹,开始的时候可以将abcd四个页存放到物理内存中,第1,2,3,4次调用时都在这4个页面范围内,第5次调用页面e,所以需要将物理内存中的abcd页进行时间的排序,按照下次调用时的时间长度,发现d最久,所以将d和e进行置换。
2、 先进先出算法(first in first out)
基本思路:选择在内存中驻留时间最长的页面进行置换。系统维护一个链表,记录在内存中的所有逻辑页,链首的位置驻留时间最长,链尾的位置驻留时间最短,当发生缺页中断时将链首的页面进行置换,将新加入的页面添加到链尾。
特点:性能较差,调出的页面可能是经常需要访问的页面,同时可能会发生Belady现象(后面介绍)。
下面是一个简单的例子,如何实现该算法:假设物理内存中只能包含4个页帧,开始时物理内存中预存abcd四个页面,在1、2、3、4时刻时进程用到的页面都在abcd的范围内所以不会产生缺页中断。
当第5时刻时,需要e页面,由于物理内存中不存在所以会产生缺页中断,需要进行页面置换,根据FIFO算法的规则选择驻留时间最长的页面a与e进行置换
后面再b不会产生缺页中断,然后a产生缺页中断,将物理页中的b置换,依次下去