最佳置换算法
最佳置换算法是由Belady于1966年提出的一种理论上的算法。其所选择的被淘汰页面,将是以后永不使用的,或许是在最长(未来)时间内不再被访问的页面。采用最佳置换算法,通常可保证获得最低的缺页率。
缺点:由于人们目前还无法预知一个进程在内存的若干个页面中,哪一个页面是未来最长时间内不再被访问的,因而该算法是无法实现的,但可以利用该算法去评价其它算法。
举例:
假定系统为某进程分配了三个物理块,并考虑有以下的页面号引用串:
7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1
先进先出(FIFO)页面置换算法
这是最早出现的置换算法。该算法总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰。该算法实现简单,只需把一个进程已调入内存的页面,按先后次序链接成一个队列,并设置一个指针,称为替换指针,使它总是指向最老的页面。
举例:
假定系统为某进程分配了三个物理块,并考虑有以下的页面号引用串:
7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1
最近最久未使用置换算法(LRU置换算法)
LRU 置换算法是选择最近最久未使用的页面予以淘汰。该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间t,当须淘汰一个页面时,选择现有页面中其t 值最大的,即最近最久未使用的页面予以淘汰。
举例:
假定系统为某进程分配了三个物理块,并考虑有以下的页面号引用串:
最少使用置换算法(LFU置换算法)
采用LFU算法时, 应为内存中的每个页面设置一个移位寄存器,用来记录该页面被访问的频率,该置换算法选择在最近时期使用最少的页面作为淘汰页。
简单Clock置换算法
当采用简单Clock算法时,只需为每页设置一位访问位,再将内存中的所有页面都通过链接指针链接成一个循环队列。当某页被访问时,其访问位被置1。置换算法在选择一页淘汰时,只需检查页的访问位。如果是0,就选择该页换出;若为1,则重新将它置0,暂不换出,而给该页第二次驻留内存的机会,再按照FIFO 算法检查下一个页面。当检查到队列中的最后一个页面时,若其访问位仍为1,则再返回到队首去检查第一个页面。
举例:
一个作业的物理块数为3,此作业的页面走向为:3, 4, 2, 6, 4, 3, 7, 4, 3, 6, 3, 4, 8, 4, 6
内存及控制信息 | 输入串 | 指针移动情况及帧替换信息 | 是否缺页? | ||
内存 | 访问位 | 指针 | 3 | 内存中没有3,需要找到一个帧放入3, | √ |
| 0 | ← | |||
| 0 |
| |||
| 0 |
| |||
内存 | 访问位 | 指针 | 4 | 内存中没有4,需要找到一个帧放入4, | √ |
3 | 1 |
| |||
| 0 | ← | |||
| 0 |
| |||
内存 | 访问位 | 指针 | 2 | 内存中没有2,需要找到一个帧放入2, | √ |
3 | 1 |
| |||
4 | 1 |
| |||
| 0 | ← | |||
内存 | 访问位 | 指针 | 6 | 内存中没有6,需要找到一个帧放入6, | √ |
3 | 1 | ← | |||
4 | 1 |
| |||
2 | 1 |
| |||
内存 | 访问位 | 指针 | 指针所指的位置的访问位仍为1, | ||
3 | 0 |
| |||
4 | 1 | ← | |||
2 | 1 |
| |||
内存 | 访问位 | 指针 | 指针所指的位置的访问位仍为1, | ||
3 | 0 |
| |||
4 | 0 |
| |||
2 | 1 | ← | |||
内存 | 访问位 | 指针 | 指针所指的位置恰好有访问位为0的, | ||
3 | 0 | ← | |||
4 | 0 |
| |||
2 | 0 |
| |||
内存 | 访问位 | 指针 | 4 | 内存中有4,于是4所在帧的访问位变为1, | × |
6 | 1 |
| |||
4 | 0 | ← | |||
2 | 0 |
| |||
内存 | 访问位 | 指针 | 3 | 内存中没有3,需要找到一个帧放入3, | √ |
6 | 1 |
| |||
4 | 1 |
| |||
2 | 0 | ← | |||
内存 | 访问位 | 指针 | 7 | 内存中没有7,需要找到一个帧放入7, | √ |
6 | 1 | ← | |||
4 | 1 |
| |||
3 | 1 |
| |||
内存 | 访问位 | 指针 | 指针所指的位置的访问位仍为1, | ||
6 | 0 |
| |||
4 | 1 | ← | |||
3 | 1 |
| |||
内存 | 访问位 | 指针 | 指针所指的位置的访问位仍为1, | ||
6 | 0 |
| |||
4 | 0 |
| |||
3 | 1 | ← | |||
内存 | 访问位 | 指针 | 指针所指的位置恰好有访问位为0的, | ||
6 | 0 | ← | |||
4 | 0 |
| |||
3 | 0 |
| |||
内存 | 访问位 | 指针 | 4 | 内存中有4,于是4所在帧的访问位变为1, | × |
7 | 1 |
| |||
4 | 0 | ← | |||
3 | 0 |
| |||
内存 | 访问位 | 指针 | 3 | 内存中有3,于是3所在帧的访问位变为1, | × |
7 | 1 |
| |||
4 | 1 |
| |||
3 | 0 | ← | |||
内存 | 访问位 | 指针 | 6 | 内存中没有6,需要找到一个帧放入6, | √ |
7 | 1 | ← | |||
4 | 1 |
| |||
3 | 1 |
| |||
内存 | 访问位 | 指针 | 指针所指的位置的访问位仍为1, | ||
7 | 0 |
| |||
4 | 1 | ← | |||
3 | 1 |
| |||
内存 | 访问位 | 指针 | 指针所指的位置的访问位仍为1, | ||
7 | 0 |
| |||
4 | 0 |
| |||
3 | 1 | ← | |||
内存 | 访问位 | 指针 | 指针所指的位置恰好有访问位为0的, | ||
7 | 0 | ← | |||
4 | 0 |
| |||
3 | 0 |
| |||
内存 | 访问位 | 指针 | 3 | 内存中有3,于是3所在帧的访问位变为1, | × |
6 | 1 |
| |||
4 | 0 | ← | |||
3 | 0 |
| |||
内存 | 访问位 | 指针 | 4 | 内存中有4,于是4所在帧的访问位变为1, | × |
6 | 1 | ← | |||
4 | 0 |
| |||
3 | 1 |
| |||
内存 | 访问位 | 指针 | 8 | 内存中没有8,需要找到一个帧放入8, | √ |
6 | 1 |
| |||
4 | 1 |
| |||
3 | 1 | ← | |||
内存 | 访问位 | 指针 | 指针所指的位置的访问位仍为1, | ||
6 | 1 | ← | |||
4 | 1 |
| |||
3 | 0 |
| |||
内存 | 访问位 | 指针 | 指针所指的位置的访问位仍为1, | ||
6 | 0 |
| |||
4 | 1 | ← | |||
3 | 0 |
| |||
内存 | 访问位 | 指针 | 指针所指的位置恰好有访问位为0的, | ||
6 | 0 |
| |||
4 | 0 |
| |||
3 | 0 | ← | |||
内存 | 访问位 | 指针 | 4 | 内存中有4,于是4所在帧的访问位变为1, | × |
6 | 0 | ← | |||
4 | 0 |
| |||
8 | 1 |
| |||
内存 | 访问位 | 指针 | 6 | 内存中有6,于是6所在帧的访问位变为1, | × |
6 | 0 |
| |||
4 | 1 |
| |||
8 | 1 | ← | |||
内存 | 访问位 | 指针 | 结束 | 完成 | 缺页8次 |
6 | 1 |
| |||
4 | 1 | ← | |||
8 | 1 |