您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 经营企划 > 操作系统实验三(页面置换算法)实验报告
实验三实验报告实验源码:#includestdio.h#includeiostream.h#includestdlib.h#defineDataMax100//常量DataMax#defineBlockNum10//常量BlockNumintDataShow[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(MBlockNum){printf(物理块数超过预定值,请重新输入:);scanf(%d,&M);}printf(请输入页面的个数:);scanf(%d,&N);//输入页面的个数大于数据个数while(NDataMax){printf(页面个数超过预定值,请重新输入:);scanf(%d,&N);}printf(请选择产生页面访问序列的方式(1.随机2.输入):);scanf(%d,&choice);switch(choice){case1://产生随机访问序列for(i=0;iN;i++){Data[i]=(int)(((float)rand()/32767)*10);//随机数大小在0-9之间}system(cls);//显示随机产生的访问序列printf(\n随机产生的访问序列为:);for(i=0;iN;i++){printf(%d,Data[i]);}printf(\n);break;case2://输入访问序列printf(请输入页面访问序列:\n);for(i=0;iN;i++)scanf(%d,&Data[i]);system(cls);//显示输入的访问序列printf(\n输入的访问序列为:);for(i=0;iN;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;iN;i++){printf(%d,Data[i]);}printf(\n);for(j=0;jM;j++){//对所有数据操作for(i=0;iN;i++){if(DataShowEnable[j][i])printf(%d,DataShow[j][i]);elseprintf();}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;jM;j++){for(i=0;iN;i++){DataShowEnable[j][i]=false;//初始化为false,表示没有要显示的数据}}for(i=0;iM;i++){count[i]=0;//初始化计数器}//确定当前页面是否在物理块中,在继续,不在置换///////////////////////////////////////////////////////////////////////////////////Block[0]=Data[0];for(i=1;mM;i++){intflag=1;for(n=0;nm;n++){if(Data[i]==Block[n])flag=0;}if(flag==0)continue;Block[m]=Data[i];m++;}////////////////////////////////////////////////////////////////////////////////////对所有数据进行操作for(i=0;iN;i++){//表示块中有没有该数据find=false;for(j=0;jM;j++){if(Block[j]==Data[i]){find=true;}}if(find)continue;//块中有该数据,判断下一个数据//块中没有该数据,最优算法ChangeTimes++;//缺页次数++for(j=0;jM;j++){//找到下一个值的位置find=false;for(k=i;kN;k++){if(Block[j]==Data[k]){find=true;count[j]=k;break;}}if(!find)count[j]=N;}//因为i是从0开始记,而BlockNum指的是个数,从1开始,所以i+1if((i+1)M){//获得要替换的块指针temp=0;for(j=0;jM;j++){if(tempcount[j]){temp=count[j];point=j;//获得离的最远的指针}}}elsepoint=i;//替换Block[point]=Data[i];//保存要显示的数据for(j=0;jM;j++){DataShow[j][i]=Block[j];DataShowEnable[iM?(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;jM;j++){for(i=0;iN;i++){DataShowEnable[j][i]=false;//初始化为false,表示没有要显示的数据}}for(i=0;iM;i++){count[i]=0;//大于等于BlockNum,表示块中没有数据,或需被替换掉//所以经这样初始化(321),每次替换=3的块,替换后计数值置1,//同时其它的块计数值加1,成了(132),见下面先进先出程序段}//确定当前页面是否在物理块中,在继续,不在置换///////////////////////////////////////////////////////////////////////////////////Block[0]=Data[0];for(i=1;mM;i++){intflag=1;for(n=0;nm;n++){if(Data[i]==Block[n])flag=0;}if(flag==0)continue;Block[m]=Data[i];m++;}////////////////////////////////////////////////////////////////////////////////////对有所数据操作for(i=0;iN;i++){//增加countfor(j=0;jM;j++){count[j]++;}find=false;//表示块中有没有该数据for(j=0;jM;j++){if(Block[j]==Data[i]){find=true;}}//块中有该数据,判断下一个数据if(find)continue;//块中没有该数据ChangeTimes++;//缺页次数++//因为i是从0开始记,而M指的是个数,从1开始,所以i+1if((i+1)M){//获得要替换的块指针temp=0;for(j=0;jM;j++){if(tempcount[j]){temp=count[j];point=j;//获得离的最远的指针}}}elsepoint=i;//替换Block[point]=Data[i];count[point]=0;//更新计数值//保存要显示的数据for(j=0;jM;j++){DataShow[j][i]=Block[j];DataShowEnable[iM?(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;jM;j++){for(i=0;iN;i++){DataShowEnable[j][i]=false;//初始化为false,表示没有要显示的数据}}for(i=0;iM;i++){count[i]=0;//初始化计数器}//确定当前页面是否在物理块中,在继续,不在置换///////////////////////////////////////////////////////////////////////////////////Block[0]=Data[0];for(i=1;mM;i++){intflag=1;for(n=0;nm;n++){if(Data[i]==Block[n])flag=0;}if(flag==0)continue;Block[m]=Data[i];m++;}////////////////////////////////////////////////////////////////////////////////////对有所数据操作for(i=0;iN;i++){//增加countfor(j=0;jM;j++){count[j]++;}find=false;//表示块中有没有该数据for(j=0;jM;j++){if(Block[j]==Data[i]){count[j]=0;find=true;
本文标题:操作系统实验三(页面置换算法)实验报告
链接地址:https://www.777doc.com/doc-5431306 .html