实验六:页面置换算法

一、 实验目的( 页面置换 )
在地址映射过程中,若在页面中发现所要访问的页面不在内存中,则产生缺页中断。当发生缺页中断时,如果操作系统内存中没有空闲页面,则操作系统必须在内存选择一个页面将其移出内存,以便为即将调入的页面让出空间。而用来选择淘汰哪一页的规则叫做页面置换算法。
二、 实验内容( 常用的 页面置换算法 )
1.  最佳置换算法(OPT )

这是一种理想情况下的页面置换算法,但实际上是不可能实现的。

该算法的基本思想是:发生缺页时,有些页面在内存中,其中有一页将很快被访问(也包含紧接着的下一条指令的那页),而其他页面则可能要到 10、100 或者 1000 条指令后才会被访问,每个页面都可以用在该页面首次被访问前所要执行的指令数进行标记。最佳页面置换算法只是简单地规定:标记最大的页应该被置换。这个算法唯一的一个问题就是它无法实现。当缺页发生时,操作系统无法知道各个页面下一次是在什么时候被访问。虽然这个算法不可能实现,但是最佳页面置换算法可以用于对可实现算法的性能进行衡量比较。

2.  先进先出置换算法(FIFO )

最简单的页面置换算法是先入先出(FIFO)法。

这种算法的实质是,总是选择在主存中停留时间最长(即最老)的一页置换,即先进入内存的页,先退出内存。理由是:最早调入内存的页,其不再被使用的可能性比刚调入内存的可能性大。建立一个 FIFO 队列,收容所有在内存中的页。被置换页面总是在队列头上进行。当一个页面被放入内存时,就把它插在队尾上。这种算法只是在按线性顺序访问地址空间时才是理想的,否则效率不高。因为那些常被访问的页,往往在主存中也停留得最久,结果它们因变“老”而不得不被置换出去。

FIFO 的另一个缺点是,它有一种异常现象,即在增加存储块的情况下,反而使缺页中断率增加了。当然,导致这种异常现象的页面走向实际上是很少见的。

3.  最近最久未使用(LRU )算法
FIFO 算法和 OPT 算法之间的主要差别是,FIFO 算法利用页面进入内存后的时间长短作为置换依据,而 OPT 算法的依据是将来使用页面的时间。如果以最近的过去作为不久将来的近似,那么就可以把过去最长一段时间里不曾被使用的页面置换掉。它的实质是,当需要置换一页时,选择在之前一段时间里最久没有使用过的页面予以置换。这种算法就称为最久未使用算法(Least Recently Used,LRU)。LRU 算法是与每个页面最后使用的时间有关的。当必须置换一个页面时,LRU 算法选择过去一段时间里最久未被使用的页面。LRU 算法是经常采用的页面置换算法,并被认为是相当好的,但是存在如何实现它的问题。LRU 算法需要实际硬件的支持,其问题是怎么确定最后使用时间的顺序。

三、实验参考代码

#include "stdio.h"
#include "stdlib.h"typedef struct item
{int num;        //页号int time;        //等待时间,LRU算法会用到这个属性
}Pro;int pageNum;        //系统分配给作业的主存中的页面数
int memoryNum;        //可用内存页面数void print(Pro *page1);        //打印当前主存中的页面
int  Search(int num1, Pro *memory1);    //在页面集memory1中查找num1,如果找到,返回其在memory1中的下标,否则返回-1
int Max(Pro *memory1);
int optimal(int num,int tag,Pro *memory1,Pro *page1);int main(void)
{int i;int curmemory;        //调入主存中的页面个数int missNum;        //缺页次数float missRate;        //缺页率char c;                //得到用户的输入字符,来选择相应的置换算法Pro *page;            //作业页面集Pro *memory;        //内存页面集printf("输入系统分配给作业的主存中的页面数:");scanf("%d", &pageNum);    printf("输入内存页面数:");scanf("%d", &memoryNum);page= (Pro*)malloc(sizeof(Pro)*pageNum);memory= (Pro*)malloc(sizeof(Pro)*memoryNum);for(i=0;i<pageNum;i++){printf("第 %d 个页面号为:", i);scanf("%d", &page[i].num);page[i].time=0;            //等待时间开始默认为0}do{for(i=0;i<memoryNum;i++)        //初始化内存中页面{memory[i].num=-1;                //页面为空用-1表示memory[i].time=-1;                //}     printf("*****f:FIFO页面置换*****\n");printf("*****o:OPT页面置换*****\n");printf("*****l:LRU页面置换*****\n");printf("*****请选择操作类型(f,o,l),按其它键结束******\n");fflush(stdin);scanf("%c", &c);i = 0; curmemory = 0;if(c=='f')            //FIFO页面置换{missNum = 0;            printf("FIFO页面置换情况:   \n");for(i=0;i<pageNum;i++){if(Search(page[i].num,memory)<0)//若在主存中没有找到该页面{missNum ++;memory[curmemory].num=page[i].num;print(memory);curmemory = (curmemory+1)%memoryNum;}}//end formissRate = (float)missNum/pageNum;printf("缺页次数:%d   缺页率:  %f\n", missNum, missRate);}//end ifif(c=='o')            //OPT页面置换{missNum = 0;            printf("OPT页面置换情况:   \n");for(i=0;i<pageNum;i++){if(Search(page[i].num,memory)<0)//若在主存中没有找到该页面{if(i<memoryNum)curmemory = i;elsecurmemory = optimal(page[i].num,i,memory,page);missNum ++;memory[curmemory].num=page[i].num;print(memory);curmemory = (curmemory+1)%memoryNum;}}//end formissRate = (float)missNum/pageNum;printf("缺页次数:%d   缺页率:  %.2f%%\n", missNum, missRate*100);}//end ifif(c=='l')            //LRU页面置换{missNum = 0;            printf("LRU页面置换情况:   \n");for(i=0;i<pageNum;i++){for(int j=0;j<memoryNum;j++){if(memory[j].num>=0)memory[j].time++;}if(Search(page[i].num,memory)<0)//若在主存中没有找到该页面{missNum ++;//    printf("%d \n",curmemory);if(i<3)curmemory = i;elsecurmemory = Max(memory);memory[curmemory].num=page[i].num;memory[curmemory].time = 0;print(memory);curmemory = (curmemory+1)%memoryNum;}else{curmemory = Search(page[i].num,memory);memory[curmemory].time=0;curmemory = (curmemory+1)%memoryNum;}}//end formissRate = (float)missNum/pageNum;printf("缺页次数:%d   缺页率:  %.2f%%\n", missNum, missRate*100);}//end if}while(c=='f'||c=='l'||c=='o');return 0;
}void print(Pro *memory1)//打印当前的页面
{int j;for(j=0;j<memoryNum;j++)printf("%d ", memory1[j].num);printf("\n");
}//在页面集memory1中查找num1,如果找到,返回其在memory1中的下标,否则返回-1
int  Search(int num1,Pro *memory1  )
{int j;for(j=0;j<memoryNum;j++){if(num1==memory1[j].num)return j;            }return -1;
}
int Max(Pro *memory1)
{int max = 0;for(int k=1;k<memoryNum;k++){if(memory1[k].time > memory1[max].time)max = k;}return max;
}int optimal(int num,int tag,Pro *memory1,Pro *page1)
{int k,j,min[100],min_k;for(k=0;k<memoryNum;k++)min[k] = 500;for(k=0;k<memoryNum;k++){j = tag;do{j++;if(j>20)break;}while(page1[j].num!=memory1[k].num);if(j<min[k]){min[k] = j;}}int max = 0;for(int t=1;t<memoryNum;t++){if(min[t]>min[max])max = t;}return max;
}

操作系统-页面置换算法相关推荐

  1. 操作系统——页面置换算法练习题

    操作系统--页面置换算法练习题 1.设某计算机的逻辑地址空间和物理地址空间均为64KB,按字节编址.若某进程最多需要6页(Page)数据存储空间,页的大小为1KB,操作系统采用固定分配局部置换策略为此 ...

  2. 2020-11-22(操作系统——页面置换算法)

    当内存中的页面满了之后,需要的数据又在磁盘虚拟内存中,可以使用页面置换算法将需要的页置换到物理内存中.下面先介绍几种局部页面置换算法,其针对一个进程而言的页面置换. 一.局部页面置换算法 1.最优页面 ...

  3. 计算机操作系统——页面置换算法

    声明:本篇博客参考书籍<计算机操作系统>(西安电子科技大学出版社) 文章目录 一.最佳页面置换算法 1.基本知识 2.算法思想 二.先进先出(FIFO)页面置换算法 1.基本知识 2.算法 ...

  4. 操作系统——页面置换算法

    一.页面置换算法简介 操作系统将内存按照页的进行管理,在需要的时候才把进程相应的部分调入内存.当产生缺页中断时,需要选择一个页面写入.如果要换出的页面在内存中被修改过,变成了"脏" ...

  5. 操作系统页面置换算法(opt,lru,fifo,clock)实现

    选择调出页面的算法就称为页面置换算法.好的页面置换算法应有较低的页面更换频率,也就是说,应将以后不会再访问或者以后较长时间内不会再访问的页面先调出. 常见的置换算法有以下四种(以下来自操作系统课本). ...

  6. 操作系统页面置换算法之先进先出(FIFO)页面置换算法(C语言实现)

    先进先出(FIFO)页面置换算法 [注]本代码数据及思路方法参考自<计算机操作系统(第四版)>汤小丹等 编著的教材. #include <iostream>int access ...

  7. 操作系统页面置换算法实验报告

    实验指导 一 .页面置换算法的基本内容 1.1 页面置换算法是在当进程运行过程中,若其要访问的页面不在内存且内存已满时,要决定将哪个页面换出的算法.常见的页面置换算法包括最佳置换.先进先出置换.最近最 ...

  8. 操作系统页面置换算法

    通常把选择换出页面的算法称为页面置换算法,置换算法的好坏直接影响到系统的性能,不适当的算法可能会导致抖动, 最近学习了一下,算是做一个笔记吧... 实现OPT和LRU置换算法 #include < ...

  9. 操作系统页面置换算法(最佳置换算法,FIFO,LRU,Clock)

    页面置换算法 为什么要页面置换 最佳置换算法 先进先出页面置换算法 LRU置换算法 Clock置换算法 为什么要页面置换 缺页中断: 在地址映射过程中,若在页表中发现所要访问的页面不在内存,则产生中断 ...

最新文章

  1. 解题报告(一)E、(BZOJ4589)Hard Nim(博弈论 + FWT)
  2. WindowsPhone基础琐碎总结-----数据绑定(一)
  3. matlab字母随机排列,matlab_一组数据元素随机排列
  4. iframe内容 固定比例_允知研习|浅析固定总价合同的结算问题
  5. [Pyhon疫情大数据分析] 一.腾讯实时数据爬取、Matplotlib和Seaborn可视化分析全国各地区、某省各城市、新增趋势
  6. 带有Angular JS的Java EE 7 –第1部分
  7. 机器学习模型评分总结(sklearn)
  8. 巴士电台开放接口API
  9. linux集群启动脚本,Hadoop2.2.0集群启动和停止Shell脚本
  10. canny边缘检测_每日习题-图像处理-Canny边缘检测(2020.4.15)
  11. windows CA的几点记录小结
  12. Mac 如何安装 Mysql@5.7
  13. php读取mysql单条数据_用PHP框架与原始代码读取Mysql单条数据性能比较
  14. mpa和pis_压力单位pis、bar与Mpa换算
  15. uart硬件一些小知识
  16. select python interpreter什么意思_熟悉Python Interpreter解释器
  17. 【教你如何用驱动人生解决驱动问题】
  18. AtCoder Beginner Contest 164 E - Two Currencies
  19. 计算机与英语关系,计算机底层和英文毫无关系
  20. Java实现生成和解析二维码

热门文章

  1. C/C++《程序设计基础(C语言)课程设计》[2023-04-20]
  2. 03 HTML_网页中的表格
  3. linux内核源码分析之slab(四)
  4. 88E1111与千兆网口连接
  5. 大寰机器人通讯转换系统(CTS-B1.0) 操作说明
  6. 计算机项目管理缩写,项目管理英文缩写!!!
  7. C语言希冀平台作业-南京晓庄
  8. 面试题:群聊消息的已读未读设计
  9. AWD准备的一些脚本和工具及其使用方法
  10. html中span跟div属性,HTML 的 div 和 span 标签