您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 其它行业文档 > 操作系统实验4-请求分页存储管理模拟实验
实验四请求分页存储管理模拟实验一:实验目的通过对页面、页表、地址转换和页面置换过程的模拟,加深对请求分页存储管理系统的原理和实现技术的理解。二:实验内容假设每个页面可以存放10条指令,分配给进程的存储块数为4。用C语言或Pascal语言模拟一进程的执行过程。设该进程共有320条指令,地址空间为32个页面,运行前所有页面均没有调入内存。模拟运行时,如果所访问的指令已经在内存,则显示其物理地址,并转下一条指令;如果所访问的指令还未装入内存,则发生缺页,此时需要记录缺页产生次数,并将相应页面调入内存,如果4个内存块已满,则需要进行页面置换。最后显示其物理地址,并转下一条指令。在所有指令执行完毕后,显示进程运行过程中的缺页次数和缺页率。页面置换算法:分别采用OPT、FIFO、LRU三种算法。进程中的指令访问次序按如下原则生成:50%的指令是顺序执行的。25%的指令是均匀分布在低地址部分。25%的指令是均匀分布在高地址部分。三:实验类别分页存储管理四:实验类型模拟实验五:主要仪器计算机六:结果OPT:LRU:FIFO:七:程序#includestdio.h#includestdlib.h#includeconio.h#defineblocknum4//页面尺寸大小intm;//程序计数器,用来记录按次序执行的指令对应的页号staticintnum[320];//用来存储320条指令typedefstructBLOCK//声明一种新类型--物理块类型{intpagenum;//页号intaccessed;//访问量,其值表示多久未被访问}BLOCK;BLOCKblock[blocknum];//定义一大小为8的物理块数组voidinit()//程序初始化函数,对block初始化{for(inti=0;iblocknum;i++){block[i].pagenum=-1;block[i].accessed=0;m=0;}}intpageExist(intcurpage)//查找物理块中页面是否存在,寻找该页面curpage是否在内存块block中,若在,返回块号{for(inti=0;iblocknum;i++){if(block[i].pagenum==curpage)returni;//在内存块block中,返回块号}return-1;}intfindSpace()//查找是否有空闲物理块,寻找空闲块block,返回其块号{for(inti=0;iblocknum;i++){if(block[i].pagenum==-1)returni;//找到了空闲的block,返回块号}return-1;}intfindReplace()//查找应予置换的页面{intpos=0;for(inti=0;iblocknum;i++){if(block[i].accessedblock[pos].accessed)pos=i;//找到应该置换页面,返回BLOCK中位置}returnpos;}voiddisplay()//显示物理块中的页面号{for(inti=0;iblocknum;i++){if(block[i].pagenum!=-1){printf(%02d,block[i].pagenum);printf(%p|,&block[i].pagenum);}}printf(\n);}voidrandam()//产生320条随机数,显示并存储到num[320]{intflag=0;printf(请为一进程输入起始执行指令的序号(0~320):\n);scanf(%d,&m);//用户决定的起始执行指令printf(******进程中指令访问次序如下:(由随机数产生)*******\n);for(inti=0;i320;i++){//进程中的320条指令访问次序的生成num[i]=m;//当前执行的指令数,if(flag%2==0)m=++m%320;//顺序执行下一条指令if(flag==1)m=rand()%(m-1);//通过随机数,跳转到低地址部分[0,m-1]的一条指令处,设其序号为m1if(flag==3)m=m+1+(rand()%(320-(m+1)));//通过随机数,跳转到高地址部分[m1+2,319]的一条指令处,设其序号为m2flag=++flag%4;printf(%03d,num[i]);//输出格式:3位数if((i+1)%10==0)//控制换行,每个页面可以存放10条指令,共32个页面printf(\n);}}voidpagestring()//显示调用的页面序列,求出此进程按次序执行的各指令所在的页面号并显示输出{for(inti=0;i320;i++){printf(%02d,num[i]/10);//输出格式:2位数if((i+1)%10==0)//控制换行,每个页面可以存放10条指令,共32个页面printf(\n);}}voidOPT()//最佳替换算法{intn=0;//记录缺页次数intexist,space,position;intcurpage;//当前指令的页面号for(inti=0;i320;i++){m=num[i];curpage=m/10;exist=pageExist(curpage);if(exist==-1){//当前指令的页面号不在物理块中space=findSpace();if(space!=-1){//当前存在空闲的物理块block[space].pagenum=curpage;//将此页面调入内存display();//显示物理块中的页面号n++;//缺页次数+1}else{//当前不存在空闲的物理块,需要进行页面置换for(intk=0;kblocknum;k++){for(intj=i;j320;j++){//找到在最长(未来)时间内不再被访问的页面if(block[k].pagenum!=num[j]/10){block[k].accessed=1000;}//将来不会被访问,设置为一个很大数else{//将来会被访问,访问量设为jblock[k].accessed=j;break;}}}position=findReplace();//找到被置换的页面,淘汰block[position].pagenum=curpage;//将新页面调入display();n++;//缺页次数+1}}}printf(缺页次数:%d\n,n);printf(缺页率:%f%%\n,(n/320.0)*100);}voidLRU()//最近最久未使用算法{intn=0;//记录缺页次数intexist,space,position;intcurpage;//当前指令的页面号for(inti=0;i320;i++){m=num[i];curpage=m/10;exist=pageExist(curpage);if(exist==-1){//当前指令的页面号不在物理块中space=findSpace();if(space!=-1){//当前存在空闲的物理块block[space].pagenum=curpage;//将此页面调入内存display();//显示物理块中的页面号n++;//缺页次数+1}else{//当前不存在空闲的物理块,需要进行页面置换position=findReplace();block[position].pagenum=curpage;display();n++;//缺页次数+1}}elseblock[exist].accessed=-1;//恢复存在的并刚访问过的BLOCK中页面accessed为-1for(intj=0;jblocknum;j++){//其余的accessed++block[j].accessed++;}}printf(缺页次数:%d\n,n);printf(缺页率:%f%%\n,(n/320.0)*100);}voidFIFO(){intn=0;//记录缺页次数intexist,space,position;intcurpage;//当前指令的页面号intblockpointer=-1;for(inti=0;i320;i++){m=num[i];curpage=m/10;exist=pageExist(curpage);if(exist==-1){//当前指令的页面号不在物理块中space=findSpace();if(space!=-1){//当前存在空闲的物理块blockpointer++;block[space].pagenum=curpage;//将此页面调入内存n++;//缺页次数+1display();//显示物理块中的页面号}else{//没有空闲物理块,进行置换position=(++blockpointer)%4;block[position].pagenum=curpage;//将此页面调入内存n++;display();}}}printf(缺页次数:%d\n,n);printf(缺页率:%f%%\n,(n/320.0)*100);}voidmain(){intchoice;printf(************请求分页存储管理模拟系统*************\n);randam();printf(************此进程的页面调用序列如下**************\n);pagestring();while(choice!=4){printf(********1:OPT2:LRU3:FIFO4:退出*********\n);printf(请选择一种页面置换算法:);scanf(%d,&choice);init();switch(choice){case1:printf(最佳置换算法OPT:\n);printf(页面号物理地址页面号物理地址页面号物理地址页面号物理地址\n);OPT();break;case2:printf(最近最久未使用置换算法LRU:\n);printf(页面号物理地址页面号物理地址页面号物理地址页面号物理地址\n);LRU();break;case3:printf(先进先出置换算法FIFO:\n);printf(页面号物理地址页面号物理地址页面号物理地址页面号物理地址\n);FIFO();break;}}}
本文标题:操作系统实验4-请求分页存储管理模拟实验
链接地址:https://www.777doc.com/doc-4257066 .html