什么是页面置换算法?
在程序执行过程中,当访问的信息不在内存时,由操作系统负责把所需要的信息从外存调入内存,然后继续执行程序。但是有时候内存空间不够,我们这时候就需要把内存中暂时不需要的信息调出内存,换到磁盘对换区。但是具体应该换出哪个页面,就需要用到页面置换算法来确定。
页面的换入、换出需要磁盘I\O,会有较大的开销,因此好的页面置换算法应该追求更少的缺页率。
什么是缺页?
要访问的页面并不在物理内存中。
最佳置换算法(OPT)
每次选择淘汰的页面是以后永不使用 or 在最长时间内不再访问的页面。
假定系统为某进程分配了三个物理块,并考虑有以下的页面号引用串:
7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1
进程运行时,先将 7,0,1 三个页面装入内存。以后,当进程要访问页面 2 时,将会产生缺页中断。这时 OS 根据最佳置换算法,将选择页面 7 淘汰。这是因为页面 0 将作为第 5 个被访问的页面,页面 1 是第 14 个被访问的页面,而页面 7 则要在第 18 次页面访问时才需调入。下次访问页面 0 时,因它已在内存而不必产生缺页中断。当进程访问页面 3时,又将引起页面 1 被淘汰;因为,它在现有的 1,2,0 三个页面中,将是以后最晚才被访问的。下图给出了采用最佳置换算法时的置换图。由图可看出,采用最佳置换算法发生了 6 次页面置换。
注意
缺页时未必发生了页面置换,如果还有可用的空闲内存块,就不用进行页面置换。
算法优点:该算法保证了可以获得最低缺页率。
算法缺点:理想化的,但无法预知未来页面的使用情况,因此目前无法实现,但通常用来评价其他算法。
先进先出页面置换算法(FIFO)
每次选择淘汰的是最先进入内存的页面,也就是在内存中驻留时间最久的页面
假设系统为某进程分配了三个内存块,并考虑到有以下页面号引用串: 3,2,1,0,3,2,4,3,2,1,0,4
当进程第一次访问页面0 时,将把第 3 页换出,因为它是最先被调入内存的;在又访问页面 3 时,又将把第 2 页换出, 因为它在现有的 2, 1, 0 三个页面中是驻留时间最久的页面。 由下图可以看出,利用 FIFO 算法时进行了 6 次页面置换,9次缺页中断。
算法优点:实现简单
算法缺点:性能较差,先进先出算法所依据的条件是各个页面调入内存的时间,但是页面调入的先后顺序并不能保证页面使用频率和时间长短。
算法与实际进程的运行规律并不适应。Belady异常,会产生所分配的物理块数增大,页故障数不减反增的现象。只有FIFO会有,LRU和OPT不会有。
最近最久未使用算法(LRU)
依据的原理是局部性原理。
每个页面对应的页表项中,用访问字段记录该页面从上次被访问以来所经历的时间t。当需要淘汰一个页面时,选择现有页面中t值最大的,即最近最久未使用的页面。该算法的实现需要专门的
假设系统为某进程分配了四个内存块,并考虑到有以下页面号引用串: 1,8,1,7,8,2,7,2,1,8,3,8,2,1,3,1,7,1,3,7
当进程第一次访问页面2时,把内存块填满,接下来依次访问7、1、8,由于内存块中有这三个页面,不产生缺页中断。接下来第一次访问页面3时,产生缺页中断,根据LRU页面置换算法,内存中现有的页面,按照距离上次被访问时间从小到大排序,依次是8、1、2、7,所以将页面7换出。
算法优点:不会出现belady现象。性能较好,接近OPT算法
算法缺点:
1. 算法效率不高:
需要对整个页表频繁的维护
LRU算法会经常用到比较,当页面数比较多的时候,会消耗大量时间在比较上
2. 实现要依托较多的硬件支持,实现所需成本较高
时钟置换算法(CLOCK)
LRU性能接近OPT,但开销大。在此基础上,试图用比较小的开销接近LRU算法的性能。
时钟置换算法是一种性能和开销较均衡的算法,又称CLOCK算法,或最近未用算法(NRU)
为每个页面设置一个访问位(访问位为1,表示最近访问过;访问位为0,表示最近没访问过),再将内存中的页面都通过链接指针链接成一个循环队列。当某页被访问时,其访问位置为1。当需要淘汰一个页面时,只需检查页的访问位。如果是0,就选择该页换出;如果是1,则将它置为0,暂不换出,继续检查下一个页面,若第一轮扫描中所有页面都是1,则将这些页面的访问位依次置为0后,再进行第二轮扫描,第二轮扫描中一定会有访问位为0的页面。
简单的CLOCK算法选择一个淘汰页面最多会经过两轮扫描
改进的时钟置换算法
简单时钟置换算法仅考虑到一个页面最近是否被访问过。如果被淘汰的页面没有被修改过,就不需要执行I/O操作写回外存。只有被淘汰的页面被修改过时,才需要写回外存。
除了一个页面最近有没有被访问过之外,OS还应考虑页面有没有被修改过。在其他条件都相同时,应优先淘汰没有修改过的页面,避免I/O操作。这就是改进的时钟置换算法的思想。修改位=0,表示页面没有被修改过;修改位=1,表示页面被修改过。
改进型CLOCK置换算法选择一个淘汰页面最多会进行四轮扫描。
时钟置换算法(改进VS简单)
改进型比简单型的优点就是减少磁盘的I\O操作次数,但为了找到可置换的页,可能要进行好多轮扫描,即算法本身的开销会有所增加。
抖动
在页面置换算法的过程中,一种最糟糕的情形是刚刚换出的页面又要换入内存,刚刚换入内存的页面又要换出,这种频繁的页面调度成为抖动或者颠簸。
原因:系统中同时运行的进程太多,分配给每个进程的物理块太少,不能满足进程正常运行的基本要求,致使每个进程在运行的过程中频繁的缺页。
工作集
进程在某段时间间隔内,要访问的页面集合。基于局部性原理,可以用最近访问过的页面集合来确定工作集。
如:
一般来说,分配给进程的物理块数(即驻留集大小)要大于工作集