操作系统实验三面置换算法实验报告.docx
- 文档编号:23756207
- 上传时间:2023-05-20
- 格式:DOCX
- 页数:20
- 大小:93.58KB
操作系统实验三面置换算法实验报告.docx
《操作系统实验三面置换算法实验报告.docx》由会员分享,可在线阅读,更多相关《操作系统实验三面置换算法实验报告.docx(20页珍藏版)》请在冰豆网上搜索。
操作系统实验三面置换算法实验报告
实验三实验报告
实验源码:
#include"stdio.h"
#include
#include
#defineDataMax100//常量DataMax
#defineBlockNum10//常量BlockNum
intDataShow[BlockNum][DataMax];//用于存储要显示的数组
boolDataShowEnable[BlockNum][DataMax];//用于存储数组中的数据是否需要显示
intData[DataMax];//保存数据
intBlock[BlockNum];//物理块
intcount[BlockNum];//计数器
intN;//页面个数
intM;//最小物理块数
intChangeTimes;//缺页次数
voidDataInput();//输入数据的函数
voidDataOutput();//输出数据的函数
voidFIFO();//FIFO函数
voidOptimal();//Optimal函数
voidLRU();//LRU函数
intmain(intargc,char*argv[])
{
DataInput();
intmenu;
while(true)
{
printf("\n*菜单选择*\n");
printf("*******************************************************\n");
printf("*1-Optimal*\n");
printf("*2-FIFO*\n");
printf("*3-LRU*\n");
printf("*4-返回上一级*\n");
printf("*0-EXIT*\n");printf("*******************************************************\n");
scanf("%d",&menu);
switch(menu)
{
case1:
Optimal();
break;
case2:
FIFO();
break;
case3:
LRU();
break;
case0:
exit(0);
break;
case4:
system("cls");
DataInput();
break;
}
if(menu!
=1&&menu!
=2&&menu!
=3&&menu!
=0&&menu!
=4){
system("cls");
printf("\n请输入0-4之间的整数!
\n");
continue;
}
}
return0;
}
voidDataInput()
{
inti,choice;
printf("请输入最小物理块数:
");
scanf("%d",&M);
//输入最小物理块数大于数据个数
while(M>BlockNum)
{
printf("物理块数超过预定值,请重新输入:
");
scanf("%d",&M);
}
printf("请输入页面的个数:
");
scanf("%d",&N);
//输入页面的个数大于数据个数
while(N>DataMax)
{
printf("页面个数超过预定值,请重新输入:
");
scanf("%d",&N);
}
printf("请选择产生页面访问序列的方式(1.随机2.输入):
");
scanf("%d",&choice);
switch(choice)
{
case1:
//产生随机访问序列
for(i=0;i { Data[i]=(int)(((float)rand()/32767)*10);//随机数大小在0-9之间 } system("cls"); //显示随机产生的访问序列 printf("\n随机产生的访问序列为: "); for(i=0;i { printf("%d",Data[i]); } printf("\n"); break; case2: //输入访问序列 printf("请输入页面访问序列: \n"); for(i=0;i scanf("%d",&Data[i]); system("cls"); //显示输入的访问序列 printf("\n输入的访问序列为: "); for(i=0;i { printf("%d",Data[i]); } printf("\n"); break; default: while(choice! =1&&choice! =2) { printf("请输入1或2选择相应方式: "); scanf("%d",&choice); } break; } } voidDataOutput() { inti,j; //对所有数据操作 for(i=0;i { printf("%d",Data[i]); } printf("\n"); for(j=0;j { //对所有数据操作 for(i=0;i { if(DataShowEnable[j][i]) printf("%d",DataShow[j][i]); else printf(""); } printf("\n"); } printf("缺页次数: %d\n",ChangeTimes); printf("缺页率: %d%%\n",ChangeTimes*100/N); } //最佳置换算法 voidOptimal() { inti,j,k; boolfind; intpoint; inttemp;//临时变量,比较离的最远的时候用 intm=1,n; ChangeTimes=0; for(j=0;j { for(i=0;i { DataShowEnable[j][i]=false;//初始化为false,表示没有要显示的数据 } } for(i=0;i { count[i]=0;//初始化计数器 } //确定当前页面是否在物理块中,在继续,不在置换 /////////////////////////////////////////////////////////////////////////////////// Block[0]=Data[0]; for(i=1;m { intflag=1; for(n=0;n { if(Data[i]==Block[n])flag=0; } if(flag==0)continue; Block[m]=Data[i]; m++; } ////////////////////////////////////////////////////////////////////////////////// //对所有数据进行操作 for(i=0;i { //表示块中有没有该数据 find=false; for(j=0;j { if(Block[j]==Data[i]) { find=true; } } if(find)continue;//块中有该数据,判断下一个数据 //块中没有该数据,最优算法 ChangeTimes++;//缺页次数++ for(j=0;j { //找到下一个值的位置 find=false; for(k=i;k { if(Block[j]==Data[k]) { find=true; count[j]=k; break; } } if(! find)count[j]=N; } //因为i是从0开始记,而BlockNum指的是个数,从1开始,所以i+1 if((i+1)>M) { //获得要替换的块指针 temp=0; for(j=0;j { if(temp { temp=count[j]; point=j;//获得离的最远的指针 } } } elsepoint=i; //替换 Block[point]=Data[i]; //保存要显示的数据 for(j=0;j { DataShow[j][i]=Block[j]; DataShowEnable[i (j<=i? j: i): j][i]=true;//设置显示数据 } } //输出信息 printf("\nOptimal=>\n"); DataOutput(); } //先进先出置换算法 voidFIFO() { inti,j; boolfind; intpoint; inttemp;//临时变量 intm=1,n; ChangeTimes=0; for(j=0;j { for(i=0;i { DataShowEnable[j][i]=false;//初始化为false,表示没有要显示的数据 } } for(i=0;i { count[i]=0;//大于等于BlockNum,表示块中没有数据,或需被替换掉 //所以经这样初始化(321),每次替换>=3的块,替换后计数值置1, //同时其它的块计数值加1,成了(132),见下面先进先出程序段 } //确定当前页面是否在物理块中,在继续,不在置换 /////////////////////////////////////////////////////////////////////////////////// Block[0]=Data[0]; for(i=1;m { intflag=1; for(n=0;n { if(Data[i]==Block[n])flag=0; } if(flag==0)continue; Block[m]=Data[i]; m++; } ////////////////////////////////////////////////////////////////////////////////// //对有所数据操作 for(i=0;i { //增加count for(j=0;j { count[j]++; } find=false;//表示块中有没有该数据 for(j=0;j { if(Block[j]==Data[i]) { find=true; } } //块中有该数据,判断下一个数据 if(find)continue; //块中没有该数据 ChangeTimes++;//缺页次数++ //因为i是从0开始记,而M指的是个数,从1开始,所以i+1 if((i+1)>M) { //获得要替换的块指针 temp=0; for(j=0;j { if(temp { temp=count[j]; point=j;//获得离的最远的指针 } } } elsepoint=i; //替换 Block[point]=Data[i]; count[point]=0;//更新计数值 //保存要显示的数据 for(j=0;j { DataShow[j][i]=Block[j]; DataShowEnable[i (j<=i? j: i): j][i]=true;//设置显示数据 } } //输出信息 printf("\nFIFO=>\n"); DataOutput(); } //最近最久未使用置换算法 voidLRU() { inti,j; boolfind; intpoint; inttemp;//临时变量 intm=1,n; ChangeTimes=0; for(j=0;j { for(i=0;i { DataShowEnable[j][i]=false;//初始化为false,表示没有要显示的数据 } } for(i=0;i { count[i]=0;//初始化计数器 } //确定当前页面是否在物理块中,在继续,不在置换 /////////////////////////////////////////////////////////////////////////////////// Block[0]=Data[0]; for(i=1;m { intflag=1; for(n=0;n { if(Data[i]==Block[n])flag=0; } if(flag==0)continue; Block[m]=Data[i]; m++; } ////////////////////////////////////////////////////////////////////////////////// //对有所数据操作 for(i=0;i { //增加count for(j=0;j { count[j]++; } find=false;//表示块中有没有该数据 for(j=0;j { if(Block[j]==Data[i]) { count[j]=0; find=true; } } //块中有该数据,判断下一个数据 if(find)continue; //块中没有该数据 ChangeTimes++; //因为i是从0开始记,而BlockNum指的是个数,从1开始,所以i+1 if((i+1)>M) { //获得要替换的块指针 temp=0; for(j=0;j { if(temp { temp=count[j]; point=j;//获得离的最远的指针 } } } elsepoint=i; //替换 Block[point]=Data[i]; count[point]=0; //保存要显示的数据 for(j=0;j { DataShow[j][i]=Block[j]; DataShowEnable[i (j<=i? j: i): j][i]=true;//设置显示数据 } } //输出信息 printf("\nLRU=>\n"); DataOutput(); } 实验结果截图: 程序运行: 输入相应数据: 选择相应算法: 最佳置换算法: 先进先出算法: 最近最久未使用算法:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 实验 置换 算法 报告