页面置换算法总结 操作系统七次实验报告常用页面置换算法模拟实验

  操作系统课程第七次实验报告

 姓名学号系计算机

 教导指评阅教师贺辉贺辉任课教师贺辉师

 实验地点 B102 综合楼

 2012-9-26

 实验时间

 Q1(15+15出勤和个人表现得分:)(组长评分)=30分实 验课表现

 实验总分

 (Q1+Q2+Q3+Q4 )

 (组分实验完成情况Q2(45长与教师评分的加权平得分:) )均

 实验七、常用页面置换算法模拟实验

 实验目的:

 通过模拟实现请求页式存储管理的几种基本页面置换算法,了解虚拟存储技术的特点,掌握虚拟存储请求 页式存储管理中几种基本页面置换算法的基本思想和实现过程,并比较它们的效率。

 实验内容及要求(详见实验讲义与实验指导书):

 要求:

 1) 要求用你熟悉的程序设计语言编写和调试一个页面置换模拟程序;要求在主函数中测试。

 2) 实验报告中必须包括: 设计思想、数据定义(包括详细说明)、处理流程(详细算法描述和算法流程图) 源代码、运行结果、体会等部分。

 3) 必须模拟本实验内容中提到的算法中的至少 2种页面置换算法。

 4) 比较不同页面置换算法的效率

 内容:编写一个程序,使用以下页面置换算法中的某 2种分别模拟一个分页系统, 并统计同一个页面访问

 序列情况下不同页面置换算法引发的缺页中断次数。

 1、 第二次机会算法(Seco nd Cha nee)

 2、 最近最少使用算法( Least Recently Used, LRU )

 3、 最不常用算法(Not Frequently Used , NFU)

 4、 最近未使用算法( Not Recently Used ,NRU)

 5、 时钟页面置换算法

 6、 老化算法(aging)

 页框的数量固定为 4,虚拟页面数为 8。实验输入为访问页面序列,比如 0,1 ,3,2, 1,7.

 实验用到的软件(:)

 DevC++,Visio

 实验内容及关键步骤(代码)Q3

 实验内容及关键步骤(代码)Q3 (15分)

 得分:

 流程图:输入页面访问序列

 取访问的页号

 查页表

 否是

 是否缺页?

 为'*' flag置缺页标志 按算法不同淘汰一页面

 调入所访问的页面

 FIFO算法流程图

 LRU算法流程图:

 触贾面调度糧曲算去療豐圉云刨(2)

 耙斬氏放莊枝頂?呵 啊自T略功体氽匪号

 S^JSEAftTl. PI

 时找陈灵号移岀

 、卜畫曲命中宰

 函数关系解释图:

 主函数,入口 designB作者信息显示y()Main()01用fifo算法实现11LRU退出

 EXIT()FIFO()算法实用lru现22PRINT()显示内存页框每次置换结果

 实现结果:

 *reh ¥ew 史

 *reh ¥ew 史raject

 pzintf(曲卜

 I f

 图2

 ,Vi WIIWM HPI

 -IH

 ?I9 }

 2.20

 代码:

 #include <stdio.h>

 #include <stdlib.h>

 */

 物理块数 /* #define MEMORY_SIZE 4

 #define PROESS_SIZE 8 /* 页面号引用串个数 */#include <stdio.h>

 #i nclude <stdlib.h>

 /*全局变量*/

 int mSIZE=4;

 in t pSIZE=8;

 static int memery[4]={0}; /* 物理块中的页号 */

 static int page[8]={0}; /* 页面号引用串 */

 static int temp[8][4]={0}; /* 辅助数组 */

 /*置换算法函数*/

 void FIFO();

 void LRU();

 void OPT();

 void desig nBy();

 /*辅助函数*/

 void print(un sig ned int t);

 /*主函数*/

 int main()

 {

 int i,k,code;

 desig nBy();

 system(color 0A);

 異獴尨请依次输入页面号(8个):);

 for(i=0;ivpSIZE;i++)

 sca nf(_x001D _,&page[i]);

 system(cls);

 system(color 0E);

 do{

 異獴尨输入的页面号引用串为:);

 for(k=0;kv=(pSIZE -1)/20;k++)

 {

 for(i=20*k;(i<pSIZE )&&(i<20*(k+1));i++)

 {

 if(((i+1) ==0)||(((i+1) )&&(i==pSIZE -1)))

 prin tf(%d\n,page[i]);

 else

 prin tf(%d ,page[i]);

 }

 }

 printf(* * * * * * * * * * * * * * * * * * * * * * *\n)?

 printf(*请选择页面置换算法:\t\t\t *\n);

 printf(* *\n);

 printf(* 1.先进先出(FIFO) 2.最近最久未使用(LRU) *\n);

 *\n);

 退出 printf(* 3.

 printf(* * * * * * * * * * * * * * * * * * * * * * *\n)? 牰湩晴尨请选择操作:[]\b\b); sea nf(%d,&code);

 switch(code)

 { case 1:

 FIFO(); break;

 case 2: LRU(); break;

 case 3:

 system(cls); system(color OA);

 exit(O);

 default:

 牰湩晴尨输入错误,请重新输入:);

 }

 牰湩晴尨按任意键重新选择置换算法:>>>);

 getch(); system(cls);

 }while (code!=3);

 getch();

 }

 void print(un sig ned int t)

 {

 int i,j,k,l;

 int flag;

 for(k=0;kv=(pSIZE -1)/20;k++)

 {

 for(i=20*k;(i<pSIZE )&&(i<20*(k+1));i++)

 {

 if(((i+1) ==0)||(((i+1) )&&(i==pSIZE -1))) prin tf(%d\n,page[i]);

 else

 prin tf(%d ,page[i]);

 }

 for(j=0;j<mSIZE;j++)

 {

 for(i=20*k;(i<mSIZE+20*k)&&(i<pSIZE);i++) {

 if(i>=j) printf( |%d|,temp[i][j]);

 else

 printf( ||);

 } for(i=mSIZE+20*k;(i<pSIZE)&&(i<20*(k+1));i++)

 {

 for(flag=0,l=0;l<mSIZE;l++)

 if(temp[i][l]==temp[i -1][l]) flag++;

 if(flag==mSIZE)/*页面在物理块中*/

 printf( );

 else

 printf( |%d|,temp[i][j]);

 }

 /*每行显示20个*/

 if(i ==0)

 con ti nue;

 );

 }

 }

 printf( \n);

 牰湩晴尨缺页次数:%d\t\t,t+mSIZE);

 牰湩晴尨缺页率:%d/%d\n,t+mSIZE,pSIZE);

 牰湩晴尨置换次数:%d\t\t,t);

 牰湩晴尨访问命中率: %d%%\n,(pSIZE-(t+mSIZE))*100/pSIZE);

 printf( \n);

 }

 /*先进先出页面置换算法*/

 void FIFO()

 {

 int memery[10]={0};

 int time[10]={0}; /*记录进入物理块的时间*/

 int i,j,k,m;

 int max=0; /*记录换出页*/

 int count=0; /*记录置换次数*/

 /*前mSIZE个数直接放入*/

 for(i=0;i<mSIZE;i++)

 {

 memery[i]=page[i];

 time[i]=i;

 for(j=0;j<mSIZE;j++)

 temp[i][j]=memery[j];

 }

 for(i=mSIZE;i<pSIZE;i++)

 */

 判断新页面号是否在物理块中/*

 for(j=0,k=0;jvmSIZE;j++)

 {

 if(memery[j]!=page[i]) k++;

 }

 if(k==mSIZE) /*如果不在物理块中*/

 {

 coun t++;

 /*计算换出页*/

 max=time[0]<time[1]?0:1;

 for(m=2;m<mSIZE;m++) if(time[m]<time[max])

 max=m;

 memery[max]=page[i];

 time[max]=i; /*记录该页进入物理块的时间*/ for(j=0;j<mSIZE;j++)

 temp[i][j]=memery[j];

 } else

 {

 for(j=0;j<mSIZE;j++)

 temp[i][j]=memery[j];

 }

 }

 prin t(co un t);

 }

 /*最近最久未使用置换算法*/

 void LRU()

 {

 int memery[10]={0};

 int flag[10]={0}; /*记录页面的访问时间*/

 int i,j,k,m;

 int max=0; /*记录换出页*/

 int count=0; /*记录置换次数*/

 /*前mSIZE个数直接放入*/

 for(i=0;i<mSIZE;i++)

 {

 memery[i]=page[i];

 flag[i]=i;

 for(j=0;j<mSIZE;j++)

 temp[i][j]=memery[j];

 }

 for(i=mSIZE;i<pSIZE;i++)

 {

 /*判断新页面号是否在物理块中*/

 for(j=0,k=0;jvmSIZE;j++)

 {

 if(memery[j]!=page[i])

 k++;

 else

 flag[j]=i; /*刷新该页的访问时间*/

 }

 if(k==mSIZE) /*如果不在物理块中*/

 {

 coun t++;

 /*计算换出页*/

 max=flag[0]vflag[1]?0:1;

 for(m=2;m<mSIZE;m++)

 if(flag[m]vflag[max])

 max=m;

 memery[max]=page[i];

 flag[max]=i; /*记录该页的访问时间*/

 for(j=0;j<mSIZE;j++)

 temp[i][j]=memery[j];

 }

 else

 {

 for(j=0;j<mSIZE;j++)

 temp[i][j]=memery[j];

 }

 }

 // compute。;

 prin t(co un t);

 }

 /*显示设计者信息*/

 void desig nBy()

 {

 牰湩晴尨 1 \n);

 牰湩晴尨丨㊣ 实验七:页面置换算法 ㊣丨\n);

 牰湩晴尨丨 学号:1001010042 | \n);

 牰湩晴尨丨 姓名:黄浩全 <Dev-C++ 4.9.9.0>| \n);

 牰湩晴尨 1 \n);

 }

 需手写,10Q4 (实验过程中遇到的问题解决办法与实验体会 分)

 得分:

 1、在FIFO算法可以很容易用数组实现,而 LRU算法可以用数组实现,不过用结 构体会更明显简单。结构体成员变量可以记录页号进入的时间,和最近使用的记录。

 相对比数组更容易理解和实现。

 2:首先,FIFO (先进先出)算法和LRU (最近未使用算法)两者之间,FIFO算法 明显会比LRU容易理解,而且比LRU算法较容易实现,但在性能方面,LRU的 确在优化方面做的比较理想。再且在考虑页框和页表号之间的问题用代码可以容易 模拟,但是真是在物理内存块中是如何实现, 那确实是很难以理解,需要真正理解 到内存内部的知识才知道这两个算法是怎么实现的。

 评阅教师特殊评语:

 评阅教师: 日 期:

推荐访问:实验 置换 算法 操作系统 常用