目录
什么是页面置换算法?
在进程运行的过程当中,进程所要访问的页面不再内存中,我们就需要把这个不存在的页面调入内存,但内存已经没有空闲空间了,这时候就要求系统从内存中调出一个页面,将其移入磁盘的对换区中。将哪个页面调出来,就要通过算法来确定。我们把选择换出页面的算法就叫做页面置换算法。
一个好的页面置换算法应具有较低的页面置换概率。
页面置换算法的理论目标:
- 将那些以后不再会访问的页面换出
- 把那些在较长时间内不会被访问的页面换出
缺页中断次数和页面置换次数
啥子是缺页?
缺页就是要访问的页面并不在物理内存中。
啥子是中断?
中断是指计算机在执行程序的过程中,当出现异常情况或特殊请求时,计算机停止现行程序的运行,转向对这些异常情况或特殊请求的处理,处理结束后再返回现行程序的间断处,继续执行原程序。
啥子是缺页中断?
缺页中断访问的页面已经映射到了虚拟存储空间中,但是物理内存已满,这时候CPU的内存存储单元就会发出中断。
缺页中断次数
缺页中断次数=进程的物理块数+页面置换次数
最佳置换算法OPT和先进先出置换算法FIFO
最佳置换算法是一种理论上的算法,目前该算法还无法实现,但我们可以用最佳置换算法OPT去评价其他算法。
最佳置换算法OPT
算法思想
选择的被淘汰页面是以后用不使用的,或者是在未来最长一段时间内不再被访问的页面。
算法优点
能够获得最低的缺页率
算法缺点
现在的技术无法保证某个页面能够在未来的最长时间内不被访问,所以这个算法只是理论上的,无法实践。
例题
假定系统给某进程分配了三个物理块,页面号引用串为"7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1"
步骤 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
页面号 | 7 | 0 | 1 | 2 | 0 | 3 | 0 | 4 | 2 | 3 | 0 | 3 | 2 | 1 | 2 | 0 | 1 | 7 | 0 | 1 |
物理块1 | 7 | 7 | 7 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 7 | 7 | 7 |
物理块2 | 0 | 0 | 0 | 0 | 0 | 0 | 4 | 4 | 4 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
物理块3 | 1 | 1 | 1 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
步骤1:装入页面号为7的页面
步骤2:装入页面号为0的页面
步骤3:装入页面号为1的页面
步骤4:装入页面号为2的页面,内存不够,需要置换页面,页面号7在步骤18是用到。页面号0在步骤5用到,页面1在步骤14用到,根据最佳置换算法,选择未来时间内最久不会被用到的页面,所以把页面号为7的页面调出,置换成页面号为2的页面,其余物理块内的页面不变
步骤5:要装入页面号为0的页面,内存中存在页面号为0的页面,所以无需处理
步骤6:页面号2出现在步骤9,页面号0出现在步骤7,页面1出现在步骤14,所以调出页面1,置换从页面号3
步骤7:调入的页面0存在在内存中,无需处理
步骤8:装入页面4,内存满,需要置换,页面2在步骤9,页面3在步骤10,页面0在步骤11,所以调出页面0,置换成页面4
步骤9:页面2在内存中,不置换
步骤10:页面3在内存中,不置换
步骤11:装入页面0,不再内存,需要置换;页面2出现在步骤13,页面4在后面不会出现,页面3出现在步骤12,所以调出页面4,置换为页面0
步骤12:存在,不置换
步骤13:存在,不置换
步骤14:页面2出现在步骤15,页面0出现在步骤16,页面3不出现,调出页面3,置换成页面1
步骤15:存在,不置换
步骤16:存在,不置换
步骤17:存在,不置换
步骤18:页面2不出现,页面1出现在步骤20,页面0出现在步骤19,调出页面2,置换成页面7
步骤19:存在,不置换
步骤20:存在,不置换
页面置换次数:6次;分别是步骤4、6、8、11、14、18
缺页次数:9;分别是步骤1、2、3(插入新页面3次)+页面置换6次
先进先出页面置换算法FIFO
思想
先进先出算法总是淘汰最先进入内存的页面,就是淘汰掉在内存中驻留时间最久的页面。
出发点是近期调入的页面被再次访问的概率要大于早期调入页面的概率实现简单
优点
实现较为简单
缺点
性能较差:先进先出算法所依据的条件是各个页面调入内存的时间,但是页面调入的先后顺序并不能保证页面使用频率和时间长短。
算法与实际进程的运行规律并不适应
例题
假定系统给某进程分配了三个物理块,页面号引用串为"7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1"
步骤 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
页面号 | 7 | 0 | 1 | 2 | 0 | 3 | 0 | 4 | 2 | 3 | 0 | 3 | 2 | 1 | 2 | 0 | 1 | 7 | 0 | 1 |
物理块1 | 7 | 7 | 7 | 2 | 2 | 2 | 2 | 4 | 4 | 4 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 7 | 7 | 7 |
物理块2 | 0 | 0 | 0 | 0 | 3 | 3 | 3 | 2 | 2 | 2 | 2 | 2 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | |
物理块3 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 3 | 3 | 3 | 3 | 3 | 2 | 2 | 2 | 2 | 2 | 1 |
替换指针指向当前存在时间最长的页面
步骤1:装入页面号为7的页面,替换指针指向页面7
步骤2:装入页面号为0的页面,替换指针指向页面7
步骤3:装入页面号为1的页面,替换指针指向页面7
步骤4:装入页面号为2的页面,内存不够,需要置换页面,页面7、0、1中最早进入内存的页面是页面7,调出页面7,装入页面2,即页面7被页面2置换,替换指针指向页面0
步骤5:要装入页面号为0的页面,内存中存在页面0,无动作,替换指针指向页面0
步骤6:要装入页面号为3的页面,内存不够,需要置换页面,页面2、0、1中最早进入内存的页面是页面0,调出页面0,装入页面3,即页面0被页面3置换,替换指针指向页面1
步骤7:要装入页面号为0的页面,内存不够,需要置换页面,页面2、3、1中最早进入内存的页面是页面1,调出页面1,装入页面0,即页面1被页面0置换,替换指针指向页面2
步骤8:要装入页面号为4的页面,内存不够,需要置换页面,页面2、3、0中最早进入内存的页面是页面2,调出页面2,装入页面4,即页面2被页面4置换,替换指针指向页面3
步骤9:要装入页面号为2的页面,内存不够,需要置换页面,页面4、3、0中最早进入内存的页面是页面3,调出页面3,装入页面2,即页面3被页面2置换,替换指针指向页面0
步骤10:要装入页面号为3的页面,内存不够,需要置换页面,页面4、2、0中最早进入内存的页面是页面0,调出页面0,装入页面3,即页面0被页面3置换,替换指针指向页面4
步骤11:要装入页面号为0的页面,内存不够,需要置换页面,页面4、2、3中最早进入内存的页面是页面4,调出页面4,装入页面0,即页面4被页面0置换,替换指针指向页面2
步骤12:要装入页面号为3的页面,内存中存在页面3,无动作,替换指针指向页面2
步骤13:要装入页面号为2的页面,内存中存在页面2,无动作,替换指针指向页面2
步骤14:要装入页面号为1的页面,内存不够,需要置换页面,页面0、2、3中最早进入内存的页面是页面2,调出页面2,装入页面1,即页面2被页面1置换,替换指针指向页面3
步骤15:要装入页面号为2的页面,内存不够,需要置换页面,页面0、1、3中最早进入内存的页面是页面3,调出页面3,装入页面2,即页面3被页面2置换,替换指针指向页面0
步骤16:要装入页面号为0的页面,内存中存在页面0,无动作,替换指针指向页面0
步骤17:要装入页面号为1的页面,内存中存在页面1,无动作,替换指针指向页面0
步骤18:要装入页面号为7的页面,内存不够,需要置换页面,页面0、1、2中最早进入内存的页面是页面0,调出页面0,装入页面7,即页面0被页面7置换,替换指针指向页面1
步骤19:要装入页面号为0的页面,内存不够,需要置换页面,页面7、1、2中最早进入内存的页面是页面1,调出页面1,装入页面0,即页面1被页面0置换,替换指针指向页面2
步骤20:要装入页面号为1的页面,内存不够,需要置换页面,页面7、0、2中最早进入内存的页面是页面2,调出页面2,装入页面1,即页面2被页面1置换,替换指针指向页面7
页面置换次数:12次;分别是步骤4、6、7、8、9、10、11、14、15、18、19、20
缺页次数:15;分别是步骤1、2、3(插入新页面3次)+页面置换12次
FIFO算法,找替换指针(淘汰页面)的小窍门:看哪个页面连续出现的次数最长,连续出现次数最长的页面就是在内存中存在最久的页面,即淘汰页面。
LRU置换算法
思想
LRU算法 least recently used
最近最少使用页面置换算法
思想:每次选择内存中离当前时刻最久未使用过的页面淘汰
依据的原理是局部性原理
优点
不会出现belady现象
性能较好,接近OPT算法
缺点
1. 算法效率不高:
需要对整个页表频繁的维护
LRU算法会经常用到比较,当页面数较多是,会消耗大量时间在比较上
2. 实现要依托较多的硬件支持,实现所需成本较高
例题
页面走向“4、3、2、1、4、3、5、4、3、2、1、5”,主存容量=3,采用LRU算法进行页面淘汰
步骤 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | |
页面 | 4 | 3 | 2 | 1 | 4 | 3 | 5 | 4 | 3 | 2 | 1 | 5 | |
栈顶 | 物理块1 | 2 | 1 | 4 | 3 | 5 | 4 | 3 | 2 | 1 | 5 | ||
物理块2 | 3 | 3 | 2 | 1 | 4 | 3 | 5 | 4 | 3 | 2 | 1 | ||
栈底 | 物理块3 | 4 | 4 | 4 | 3 | 2 | 1 | 4 | 3 | 5 | 4 | 3 | 2 |
步骤1:装入页面4
步骤2:装入页面3
步骤3:装入页面2
步骤4:装入页面1,内存容量不足,依据LRU算法,内存中有三个页面2、3、4;当前最久未使用的页面是页面4,所以将页面4置换成页面1;最久未使用页面变为页面3
步骤5:装入页面4,内存容量不足,依据LRU算法,内存中有三个页面1、2、3;最久未使用的页面是页面3,所以将页面3置换成页面4;最久未使用页面变为页面2
步骤6:装入页面3,内存容量不足,依据LRU算法,内存中有三个页面4、1、2;最久未使用的页面是页面2,所以将页面2置换成页面3;最久未使用页面变为页面1
步骤7:装入页面5,内存容量不足,依据LRU算法,内存中有三个页面3、4、1;最久未使用的页面是页面1,所以将页面1置换成页面5;最久未使用页面变成页面4
步骤8:装入页面4,内存中存在页面4,当前最久未使用的页面是页面4,装入页面4后,最久未使用页面变成页面3
步骤9:装入页面3,内存中存在页面3,当前最久未使用的页面是页面3,装入页面3后,最久未使用页面变成页面5
步骤10:装入页面2,内存容量不足,依据LRU算法,内存中有三个页面3、4、5;最久未使用的页面是页面5,所以将页面5置换成页面2;最久未使用页面变成页面4
步骤11:装入页面1,内存容量不足,依据LRU算法,内存中有三个页面2、3、4;最久未使用的页面是页面4,所以将页面4置换成页面1;最久未使用页面变成页面3
步骤12:装入页面5,内存容量不足,依据LRU算法,内存中有三个页面1、2、3;最久未使用的页面是页面3,所以将页面3置换成页面5;最久未使用页面变成页面2
做题经验:页面斜着看是连续的,可以做题的时候依据该规律检查正确与否
Clock置换算法
简单的Clock置换算法
思想
当页面被访问时,页面的访问位置1;
置换算法在选择页面淘汰时,首先会检查页面的访问位,若访问位为0直接换出,若访问位为1,则给该页的访问位重新置1,再给该页面一次存在的机会;
之后按照FIFO页面置换算法去检查下个页面,是否需要淘汰
如果检查到最后一个页面,最后一个页面的访问位是1,则将该页面访问位置0,再返回到队首检查第一个页面,以此往复。
改进型Clock置换算法
思想
改进型时钟算法就是在简单的时钟算法基础上加上了置换代价
除了访问位还多了一个修改位
有访问位A和修改位M可以组成四周类型的页面
1类:(A=0,M=0)表示该页面最近未被访问也没有被修改,是最佳淘汰页
2类:(A=0,M=1)表示该页面最近未被访问,但是被修改过了,并不是很好的淘汰页
3类:(A=1,M=0)表示该页面最近被访问过,但是没被修改过,该页面有可能再被访问
4类:(A=1,M=1)表示该页面最近被访问过且被修改过,该页面很有可能被再次访问