3.13 页面淘汰算法

在这里插入图片描述

页面置换是什么

页面置换算法广泛引用于分层的存储体系中。

之前讲cache已经提到过,cache数量有限,所以当cache的块都被占用了,要调用新的块进来的时候,就涉及页面的置换问题。在内存这一个体系,同样也面临这样的问题。

比方说页式存储中,一个程序有100个页,但是内存可以分配给它的页是非常有限的,比如说只有三个页。这时候就不可避免在程序运行过程中,我们要把一些不用的页调出来,把要用到的页调进去。这要依据一定的算法来进行识别哪些页淘汰是比较好的,这就涉及到页面的置换(淘汰)算法。

页面置换算法有哪些

页面置换算法具有典型代表性的有这么几种。

最优算法

理论层面上的算法。
它是在整个事情发生之后,也就是我们已经知道访问的页面序列是怎样的,根据页面序列分析算出什么时间点淘汰什么页面能够取得最高的效率性能。
根据不同的实际场景,最优算法肯定能得出不同的解决方案,没有普遍的规律。
在实际访问中往往没办法了解整体的页面序列,比如涉及到分支,那就会根据条件进行判断,我们就不知道下一个页面应该访问哪一个,整个完整序列是排不出来的。
所以最优算法在实际是无法直接应用的。
它的应用场景是把最优的写出来,再和其他的算法方案进行对比。看其他方案和最优相比差距有多大

随机算法

随机淘汰一个,性能不稳定。考试一般不会考。

先进先出算法

要淘汰页面的时候,就看哪些页面是最先进入到内存的,那就先淘汰什么。

先进先出有可能造成“抖动”

“抖动”:我分配给你更多的资源,我希望你把这个事情做得更加好一些。结果不但没有出现正面的效果,反而让效率降低了。

在置换算法的表现是:
我在内存里给你分配3个页面,原本页面的缺页假设是9次。然后我给你分配4个页面,资源多了。这时候你的缺页达到了11个甚至14个(具体可以看下方例子)。造成结果更坏了。这就会导致该不该增加资源分析起来更加复杂。

最近最少使用

根据局部性原理,刚刚被访问过的页面很可能马上就会被访问到。所以不会被淘汰。

不会“抖动”,也就是分配的资源越多,表现的越好。

先进先出的“抖动”现象

在这里插入图片描述

其中列是要访问的程序页

在这里插入图片描述

其中行是内存的页

在这里插入图片描述

步骤解读

先看上面3页内存的情况

  1. 首先访问第一个编号为4的程序页,这时候内存没有这个程序页,那么就会调入到内存,并且产生一次缺页(内存里没有)
  2. 编号为3的同理,产生一次缺页。
  3. 编号为2的同理,产生一次缺页。
  4. 访问到编号为1的时候,这时候内存里存储着4,3,2这3个页。由于4号页最新进入内存,于是被淘汰了。编号为1的就可以被调入到内存。由于此次内存是没有1号的页,所以还是缺页。
  5. 访问到编号为4的时候,同理淘汰3号页,调入4号页,并且还是缺页。
  6. 以此类推,缺页次数达到9次。

同样的读取状态,看下4页内存的情况,缺页次数会达到10次,也就是造成了“抖动”的现象。

练习题

在这里插入图片描述

分析
  1. 前面5,0,1对于两种算法是一样的。因为大家都会产生缺页(内存里没有),而且不涉及淘汰的问题。
  2. 到达2号页时,由于内存已经存了【5,0,1】且没有存储2,所以就要淘汰了。那么先进先出(FIFO)就会淘汰最先进入的5,最近最少(LRU)就会淘汰最远使用的5。
  3. 到达0号页时,内存此时存的是【0,1,2】。处于命中状态。
  4. 到达3号页时,内存此时存的是【0,1,2】。由于没有3号,因此要淘汰一个页。那么先进先出(FIFO)就会淘汰最先进入的0,最近最少(LRU)就会淘汰最远使用的1。

为什么最远使用的是1呢?

因为内存此时存的是【0,1,2】,其中0是刚刚访问过的,属于最近的,不能被淘汰。那么接下来就按顺序就剩【1,2】,那么最远的就是1。

  1. 后面的均同理。此处我整理访问的状况
访问的页FIFO:淘汰前的存储FIFO的淘汰FIFO缺页累计LRU:淘汰前的存储LRU的淘汰LRU缺页累计
5【】无需淘汰1【】无需淘汰1
0【5】无需淘汰2【5】无需淘汰2
1【5,0】无需淘汰3【5,0】无需淘汰3
2【5,0,1】54【5,0,1】54
0【0,1,2】命中了4【0,1,2】命中了4
3【0,1,2】05【0,1,2】15
0【1,2,3】16【0,2,3】命中了5
4【2,3,0】27【0,2,3】26
2【3,0,4】38【0,3,4】37
3【0,4,2】09【0,4,2】48
0【4,2,3】410【0,4,2】命中了8
3【2,3,0】命中了10【0,4,2】49
2【2,3,0】命中了10【0,2,3】命中了9
1【2,3,0】211【0,2,3】010
2【3,0,1】312【2,3,1】命中了10
0【0,1,2】命中了12【2,3,1】311
1【0,1,2】命中了12【2,1,0】命中了11
5【0,1,2】013【2,1,0】212
0【1,2,5】114【1,0,5】命中了12
1【2,5,0】215【1,0,5】命中了12
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
页面置换算法课设 private void FIFO_button1_Click(object sender, EventArgs e) { if (page.Length == 0 || strsize.Length == 0) MessageBox.Show("输入得页面序列或物理块数不能为空", "提示", MessageBoxButtons.OK); else { //初始化数据,并访问第一个页面 int i, j, u, losecount, changecount = 0; for (i = 0; i < size; i++) { X[i].Num = -1; X[i].Timer = 0; } X[0].Num = page[0]; X[0].Timer = 1; FIFO_label.Text = "FIFO\n" + (X[0].Num - 48).ToString() + "\n"; losecount = 1; //循环,按照页面序列,选择淘汰页面并进行置换 for (i = 1; i < page.Length; i++) { u = 0;//进程的内存中是否存在要访问的页面的标记 //若内存中存在要访问的页面,则设置u=1,并退出循环 for (j = 0; j < size; j++) { if (X[j].Num == page[i]) { u = 1; break; } } //若内存中不存在要访问的页面,且内存中无空闲的空间则进行下列置换 if (u != 1 && X[size - 1].Num != -1) { j = GetMaxTime();//选择呆的时间最长的页面进行置换 X[j].Num = page[i]; X[j].Timer = 0; changecount++; losecount++; } //若内存中不存在要访问的页面,且内存中有空闲的空间则进行下列置换 if (u != 1 && X[size - 1].Num == -1) { for (j = 0; j < size; j++) { if (X[j].Num == -1) { X[j].Num = page[i]; losecount++; break; } } } //对内存中不为空的页面的时间加1 for (j = 0; j < size; j++) { if (X[j].Num != -1) X[j].Timer++; } //输出数据 for (j = 0; j < size; j++) { if (X[j].Num != -1) FIFO_label.Text += (X[j].Num - 48).ToString(); else FIFO_label.Text += " "; } FIFO_label.Text += "\n"; } FIFOlosepage = (float)losecount / (float)(page.Length);//缺页率 FIFO_label.Text += "访问次数是:" + page.Length + "\n页面置换次数:" + changecount + "\n缺页中断次数:" + losecount + "\n缺页率是:" + FIFOlosepage; } } (3)LRU置换算法 private void LRU_button1_Click(object sender, EventArgs e) { if (page.Length == 0 || strsize.Length == 0) MessageBox.Show("输入得页面序列或物理块数不能为空", "提示", MessageBoxButtons.OK); else { //初始化数据,并访问第一个页面,并输出访问结果 int i, j, u, losecount, changecount = 0; for (i = 0; i < size; i++) { X[i].Num = -1; X[i].Timer = 0; } X[0].Num = page[0]; X[0].Timer = 1; losecount = 1; LRU_label.Text = "LRU\n" + (X[0].Num - 48).ToString() + "\n"; //循环,按照页面序列依次访问页面,并输出访问结果 for (i = 1; i < page.Length; i++) { u = 0; //如果内存中存在要访问的页面,则置Timer为0,u为1 for (j = 0; j < size; j++) {

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值