三种页面置换算法(详解)

地址映射过程中,若在页面中发现所要访问的页面不在内存中,则产生缺页中断。当发生缺页中断时,如果操作系统内存中没有空闲页面,则操作系统必须在内存选择一个页面将其移出内存,以便为即将调入的页面让出空间。而用来选择淘汰哪一页的规则叫做页面置换算法
一、先进先出(FIFO)
1)原理:把内存中驻留时间最久的页面置换算法予以淘汰
2)举例:
在分页中,采用FIFO页面置换算法,序列 4,3,2,1,4,5,4,3,2,1,5,当物理块为3时,计算缺页次数和缺页率?
算法执行如下操作步骤:

  • 程序运行时,先将4,3,2三个页面装入内存。
  • 之后,当进程要访问页面1的时候,将会产生缺页中断此时根据先进先出置换算法,因为页面4是最先进入内存的,所以将页面4换出;同理4 3 5分别替换3,2,1.
  • 当进程4要访问时,因为它已存在在内存所以不必产生缺页中断; 当页面2要访问时,又引起缺页中断淘汰4;
  • 依次类推直到最后一个页面访问完。图为采用先进先出置换算法的置换图。由图可得,采用先进先出置换算法发生了9次缺页中断。先进先出的页面置换比最佳置换算法的页面置换正好多了一倍;

在这里插入图片描述
当数字不在框中,横着找最长的连续数字(划掉),将新的数字填入
当数字在框中,则不做改变,即空白列
缺页次数=总列数-空白列数=9
缺页率=缺页数/总列数=75%
(3)特点
优点:先进先出算法实现简单,是最直观的一个算法
缺点:先进先出的性能最差,因为与通常页面的使用规则不符合,所以实际应用少
二、最近最久未使用(LRU)
(1)原理:选择最近且最久未被使用的页面进行淘汰
(2)举例:
在分页中,采用LRU页面置换算法,序列 7,0,1,2,0,3,0,4,2,3,0,3,2,0,1,7,0,1当物理块为3时,计算缺页次数和缺页率?

  • 程序运行时,先将7,0,1三个页面装入内存。
  • 之后,当进程要访问页面2的时候,将会产生缺页中断。此时根据最近最久未使用置换算法,因为页面7是最近最久未被使用的的,所以将页面7淘汰;
  • 当进程0要访问时,因为它已存在在内存所以不必产生缺页中断;
  • 在进程要访问页面3的时候,因为页面1是最近最久未被使用的,所以将页面1淘汰;
  • 依次类推直到最后一个页面访问完。下图为采用最近最久未使用的置换算法的置换图。由图可得,采用最近最久未使用置换算法发生了9次缺页中断。

算法执行如下操作步骤:
在这里插入图片描述
当数字不在框中,从头找第一个未被划掉的数字进行替换
当数字在框中,划掉从前往后数和数字一样的第一个数字
3)特点

优点:由于考虑程序访问的时间局部性,一般能有较好的性能;实际应用多
缺点:实现需要较多的硬件支持,会增加硬件成本

三、最佳置换算法(OPT)

(1)原理:每次选择未来长时间不被访问的或者以后永不使用的页面进行淘汰。
(2)举例:假定系统为某进程分配了三块物理块,并有以下页面:
7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1
算法执行如下操作步骤:

  • 程序运行时,先将7,0,1三个页面装入内存。
  • 之后,当进程要访问页面2的时候,将会产生缺页中断。此时根据最佳置换算法,因为页面7要在第18次才能访问,页面0在第5次访问,页面1在第14次访问,页面7最久不被使用,所以将页面7淘汰;
  • 当进程0要访问时,因为它已存在在内存所以不必产生缺页中断; 当页面3要访问时,又引起缺页中断淘汰1;
  • 依次类推直到最后一个页面访问完。下图为采用最佳置换算法的置换图。由图可得,采用最佳置换算法发生了6次缺页中断。

在这里插入图片描述当数字不在框中,从当前向后找最后一个将要访问的数字进行替换
当数字在框中,则不做改变,继续向后
(3)特点
缺点:最佳置换算法是一种理想化算法,具有较好的性能,但是实际上无法实现(无法预知一个进程中的若干页面哪一个最长时间不被访问);
优点:最佳置换算法可以保证获得最低的缺页率

  • 140
    点赞
  • 692
    收藏
    觉得还不错? 一键收藏
  • 26
    评论
页面置换算法课设 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++) {
以下是最优页面置换算法(Optimal Page Replacement Algorithm)的 C 语言代码实现: ```c #include<stdio.h> #include<stdlib.h> int main(){ int frames, pages, page_faults = 0, flag, reppage, i, j, k, max, count; printf("Enter number of frames: "); scanf("%d",&frames); printf("Enter number of pages: "); scanf("%d",&pages); int reference[pages], memlayout[frames]; for(i = 0; i < frames; i++) memlayout[i] = -1; printf("Enter reference string: "); for(i = 0; i < pages; i++) scanf("%d",&reference[i]); for(i = 0; i < pages; i++){ flag = 0; for(j = 0; j < frames; j++){ if(memlayout[j] == reference[i]){ flag = 1; break; } } if(flag == 0){ count = 0; for(j = 0; j < frames; j++){ reppage = 0; for(k = i + 1; k < pages; k++){ if(memlayout[j] == reference[k]) break; else reppage++; } if(reppage > count){ count = reppage; max = j; } } memlayout[max] = reference[i]; page_faults++; } printf("\n"); for(j = 0; j < frames; j++){ printf("%d\t", memlayout[j]); } } printf("\nTotal number of page faults: %d\n", page_faults); return 0; } ``` 代码中,我们先输入页面帧数和页面数量,以及页面引用串(reference string)。然后,我们初始化一个长度为帧数的数组 memlayout,其中所有元素的值都是 -1,表示这些帧当前没有被占用。接下来,我们开始遍历页面引用串,检查每个页面是否已经在 memlayout 中出现过。如果已经出现过,我们就不需要进行任何操作。否则,我们需要将页面放入一个未被占用的帧中。 在找到未被占用的帧之后,我们需要检查当前页面之后还有多长时间才会再次被引用。我们遍历 memlayout 中的所有帧,找到其中距离当前页面最远的一个帧,将该帧替换成当前页面。这样做可以最大限度地减少页面置换的次数。最后,我们输出当前的 memlayout,并且更新 page_faults 的值。 该算法的时间复杂度为 O(n^2),其中 n 是页面数量。因此,它通常只适用于页面数量比较小的情况。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值