第3章与存储管理有关的操作系统算法实践作业(占课程整体分数5%)参照“强化实践能力培养课程内容”中“内存页面置换算法实践能力培养考核选例”程序,编写一个能演示LRU内存页面置换算法的程序,它可根据给定的一组页面引用序列号和实存页数,显示LRU置换页的过程,能统计和报告LRU置换算法情况下依次淘汰的页号、缺页次数(页错误数)和缺页率。参考运行结果:#includestdio.h#includestdlib.hvoidCopyL(intSour[],intDist[],intx);//数组Sour复制到数组Dist,复制到x个数voidSetDI(intDiscL[]);//随机生成磁道数voidPrint(intPri[],intx);//打印输出数组PrivoidDelInq(intSour[],intx,inty);//数组Sour把x位置的数删除,并把y前面的数向前移动,y后的数保持不变(即会出现2个y)voidFCFS(intHan,intDiscL[]);//先来先服务算法(FCFS)voidSSTF(intHan,intDiscL[]);//最短寻道时间优先算法(SSTF)intSCAN(intHan,intDiscL[],intx,inty);//扫描算法(SCAN)voidCSCAN(intHan,intDiscL[]);//循环扫描算法(CSCAN)//voidN_Step_SCAN(intHan1,intDiscL[]);//N步扫描算法(NStepScan)voidPaiXu();//寻道长度由低到高排序voidPri();intNAll=0;intBest[5][2];//用作寻道长度由低到高排序时存放的数组intLimit=0;//输入寻找的范围磁道数iintJage;floatAver=0;intmain(){inti;intDiscLine[10];//声明准备要生成的随机磁道号的数组intHand;//磁道数intCon=1;intn;while(Con==1){Jage=0;printf(\n请输入初始的磁道数(0n65536):);scanf(%d,&Hand);printf(\n+输入寻找的范围:);scanf(%d,&Limit);if(Limit65536){printf(超出范围!);}else{printf(*********************************************\n);printf(****************磁盘调度算法******************\n);printf(*********************************************\n);printf(*1.先来先服务算法(FCFS)*\n);printf(*2.最短寻道时间优先算法(SSTF)*\n);printf(*3.扫描算法(SCAN)*\n);printf(*4.循环扫描算法(CSCAN)*\n);printf(*********************************************\n);scanf(%d,&n);if(n==0)exit(0);printf(\n);switch(n){case1:SetDI(DiscLine);//随机生成磁道数FCFS(Hand,DiscLine);//先来先服务算法(FCFS)break;case2:SetDI(DiscLine);//随机生成磁道数SSTF(Hand,DiscLine);//最短寻道时间优先算法(SSTF)break;case3:SetDI(DiscLine);//随机生成磁道数SCAN(Hand,DiscLine,0,9);//扫描算法(SCAN)break;case4:SetDI(DiscLine);//随机生成磁道数CSCAN(Hand,DiscLine);//循环扫描算法(CSCAN)break;case5:SetDI(DiscLine);//随机生成磁道数SetDI(DiscLine);//随机生成磁道数FCFS(Hand,DiscLine);//先来先服务算法(FCFS)SSTF(Hand,DiscLine);//最短寻道时间优先算法(SSTF)SCAN(Hand,DiscLine,0,9);//扫描算法(SCAN)CSCAN(Hand,DiscLine);//循环扫描算法(CSCAN)PaiXu();//寻道长度由低到高排序printf(\n\n+寻道长度由低到高排序:);for(i=0;i5;i++){printf(%4d,Best[i][0]);}break;}printf(\n\n+是否继续(按0结束,按1继续)?);scanf(%5d,&Con);}}}//数组Sour复制到数组Dist,复制到x个数voidCopyL(intSour[],intDist[],intx){inti;for(i=0;i=x;i++){Dist[i]=Sour[i];}}//打印输出数组PrivoidPrint(intPri[],intx){inti;for(i=0;i=x;i++){printf(%5d,Pri[i]);}}//随机生成磁道数voidSetDI(intDiscL[]){inti;for(i=0;i=9;i++){DiscL[i]=rand()%Limit;//随机生成10个磁道号}printf(+需要寻找的磁道号:);Print(DiscL,9);//输出随机生成的磁道号printf(\n);}//数组Sour把x位置的数删除,并把y前面的数向前移动,y后的数保持不变(即会出现2个y)voidDelInq(intSour[],intx,inty){inti;for(i=x;iy;i++){Sour[i]=Sour[i+1];x++;}}//先来先服务算法(FCFS)voidFCFS(intHan,intDiscL[]){intRLine[10];//将随机生成的磁道数数组Discl[]复制给数组RLine[]inti,k,All,Temp;//Temp是计算移动的磁道距离的临时变量All=0;//统计全部的磁道数变量k=9;//限定10个的磁道数CopyL(DiscL,RLine,9);//复制磁道号到临时数组RLineprintf(\n+按照FCFS算法磁道的访问顺序为:);All=Han-RLine[0];for(i=0;i=9;i++){Temp=RLine[0]-RLine[1];//求出移动磁道数,前一个磁道数减去后一个磁道数得出临时的移动距离if(Temp0)Temp=(-Temp);//移动磁道数为负数时,算出相反数作为移动磁道数printf(%5d,RLine[0]);All=Temp+All;//求全部磁道数的总和DelInq(RLine,0,k);//每个磁道数向前移动一位k--;}Best[Jage][1]=All;//Best[][1]存放移动磁道数Best[Jage][0]=1;//Best[][0]存放算法的序号为:1Jage++;//排序的序号加1Aver=((float)All)/10;//求平均寻道次数printf(\n+移动磁道数:%5d,All);printf(\n+平均寻道长度:*%0.2f*,Aver);}//最短寻道时间优先算法(SSTF)voidSSTF(intHan,intDiscL[]){inti,j,k,h,All;intTemp;//Temp是计算移动的磁道距离的临时变量intRLine[10];//将随机生成的磁道数数组Discl[]复制给数组RLine[]intMin;All=0;//统计全部的磁道数变量k=9;//限定10个的磁道数CopyL(DiscL,RLine,9);//复制磁道号到临时数组RLineprintf(\n+按照SSTF算法磁道的访问顺序为:);for(i=0;i=9;i++){Min=64000;for(j=0;j=k;j++)//内循环寻找与当前磁道号最短寻道的时间的磁道号{if(RLine[j]Han)//如果第一个随机生成的磁道号大于当前的磁道号,执行下一句Temp=RLine[j]-Han;//求出临时的移动距离elseTemp=Han-RLine[j];//求出临时的移动距离if(TempMin)//如果每求出一次的移动距离小于Min,执行下一句{Min=Temp;//Temp临时值赋予Minh=j;//把最近当前磁道号的数组下标赋予h}}All=All+Min;//统计一共移动的距离printf(%5d,RLine[h]);Han=RLine[h];DelInq(RLine,h,k);//每个磁道数向前移动一位k--;}Best[Jage][1]=All;//Best[][1]存放移动磁道数Best[Jage][0]=2;//Best[][0]存放算法的序号为:2Jage++;//排序序号加1Aver=((float)All)/10;//求平均寻道次数printf(\n+移动磁道数:%5d,All);printf(\n+平均寻道长度:*%0.2f*,Aver);}//扫描算法(SCAN)intSCAN(intHan,intDiscL[],intx,inty){intj,n,k,h,m,All;intt=0;intTemp;intMin;intRLine[10];//将随机生成的磁道数数组Discl[]复制给数组RLine[]intOrder;Order=1;k=y;m=2;//控制while语句的执行,即是一定要使当前磁道向内向外都要扫描到All=0;//统计全部的磁道数变量CopyL(DiscL,RLine,9);//复制磁道号到临时数组RLineprintf(\n+按照SCAN算法磁道的访问顺序为:);Min=64000;for(j=x;j=y;j++)//寻找与当前磁道号最短寻道的时间的磁道号{if(RLine[j]Han)//如果第一个随机生成的磁道号大于当前的磁道号,执行下一句Temp=RLine[j]-Han;//求出临时的移动距离elseTemp=Han-RLine[j];//求出临时的移动距离if(TempMin){Min=Temp;//Temp临时值赋予Minh=j;//把最近当前磁道号的数组下标赋予h}}All=All+Min;printf(%5d,RLine[h]);if(RLine[h]=Han){//判断磁道的移动方向,即是由里向外还是由外向里Order=0;t=1;}Han=RLine[h];DelInq(RLine,h,k);//每个磁道数向前移动一位k--;while(m0){if(Order==1)//order是判断磁盘扫描的方向标签,order是1的话,磁道向内移动{for(j=x;j=y;j++){h=-1;Min=64000;for(n=x;n=k;n++)//判断离当前磁道最近的磁道号{if(RLine[n]=Han){Temp=Han-RLine[n];if(TempMin){Min=Temp;//Temp临时值赋予Minh=n;//把最近当前磁道号的数组下标赋予h}}}if(h!=-1){All=All+Min;//叠加移动距离printf(%5d,RLine[h]);Han=RLine[h];//最近的磁道号作为当前磁道DelInq(RLine,h,k);k--;}}Order=0;//当完成向内的移动,order赋予0,执行else语句,使磁道向外移动m--;//向内完成一次,m减一次,保证while循环执行两次}else//order是0的话,磁道向外移动{for(j=x;j=y;j++){h=-1;Min=64000;for(n=x;n=k;n++)//判断离当前磁道最近的磁道号{if(RLine[n]=Han){Temp=RLin