模拟操作系统的请求分页存储管理java代码_第1页
模拟操作系统的请求分页存储管理java代码_第2页
模拟操作系统的请求分页存储管理java代码_第3页
模拟操作系统的请求分页存储管理java代码_第4页
模拟操作系统的请求分页存储管理java代码_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

/请求分页存储管理的实现写出方案实现代码〔1page类packagehomework;publicclassPage{privateintpagenumb;//页号privateintphysicsnumb;//物理块号privatebooleanstate;//状态位privateintvisitcount;//访问字段privatebooleanchange;//修改位privateintCRTaddress;//外存地址publicPage<>{this.pagenumb=-1;this.physicsnumb=-1;this.state=false;this.visitcount=0;this.change=false;this.CRTaddress=-1; }publicPage<intpagenumb,intphysicsnumb,booleanstate,intvisitcount,booleanchange,intCRTaddress>{this.pagenumb=pagenumb;this.physicsnumb=physicsnumb;this.state=state;this.visitcount=visitcount;this.change=change;this.CRTaddress=CRTaddress; }publicvoidsetPagenumb<intpagenumb>{this.pagenumb=pagenumb; }publicvoidsetPhysicsnumb<intphysicsnumb>{this.physicsnumb=physicsnumb; }publicvoidsetState<booleanstate>{this.state=state; }publicvoidsetVisitcount<intvisitcount>{this.visitcount=visitcount; }publicvoidsetChange<booleanchange>{this.change=change; }publicvoidsetCRTaddress<intCRTaddress>{this.CRTaddress=CRTaddress; }publicintgetPagenumb<>{returnthis.pagenumb; }publicintgetPhysicsnumb<>{returnthis.physicsnumb; }publicbooleangetState<>{returnthis.state; }publicintgetVisitcount<>{returnthis.visitcount; }publicbooleangetChange<>{returnthis.change; }publicintgetCRTaddress<>{returnthis.CRTaddress; }}〔2Shell类:页表packagehomework;importjava.util.Scanner;publicclassShell{ Pageshell[];privateintcurrent;privateintlength;publicShell<>{};publicShell<intlength>{this.length=length;this.current=0;shell=newPage[length];for<inti=0;i<length;i++>{this.shell[i]=newPage<>; } }publicvoidsetCurrent<intcurrent>{this.current=current;}publicintgetCurrent<>{returnthis.current;}publicintsearchpage<intpagenumb>{inti=0;if<this.current==0>{return-2; }else{while<i<this.current>{if<this.shell[i].getPagenumb<>==pagenumb>{returni; }i++; }return-1; } }publicvoidInchange<intb[],Stringch,intnumber>{ Scannera=newScanner<System.in>;switch<ch>{case"yes":{System.out.println<"请输入一个新的数据">;b[this.shell[number].getPhysicsnumb<>]=a.nextInt<>;this.shell[number].setChange<true>; System.out.println<"修改成功!">;break; }case"no":{break; }default:{ System.out.println<"输入字符有误.将退出程序!!">; System.exit<0>; } } }publicintIsover<>{if<this.current>=this.length>{return1; }elsereturn0; }publicintMinVisitcount<>{inti,t=0;for<i=1;i<this.current;i++>{if<this.shell[i].getVisitcount<><this.shell[t].getVisitcount<>>{t=i; } }returnt; }publicintIschange<intnumber>{if<this.shell[number].getChange<>==true>{return1; }elsereturn0; }publicvoidprintPageShell<>{ System.out.println<"页表:">; System.out.println<"索引\t"+"页号\t"+"物理块号\t"+"状态\t"+"访问次数\t"+"修改\t"+"外存地址\t">;for<inti=0;i<this.length;i++>{ System.out.println<i+"\t"+this.shell[i].getPagenumb<>+"\t"+this.shell[i].getPhysicsnumb<>+"\t"+this.shell[i].getState<>+"\t"+this.shell[i].getVisitcount<>+"\t"+this.shell[i].getChange<>+"\t"+this.shell[i].getCRTaddress<>>; } }publicvoidprogramFunction<>{ System.out.println<"****************************请求分页存储系统****************************">; System.out.println<"功能:">; System.out.println<"\t1.查看页表">; System.out.println<"\t2.查看快表">; System.out.println<"\t3.查看外存">; System.out.println<"\t4.在内存修改数据">; System.out.println<"\t5.继续访问页面">; System.out.println<"\t6.退出程序">; }publicvoidDealfunction<inti,KShellTLB,Sources[],intb[]>{if<i==1>{this.printPageShell<>; }elseif<i==2>{TLB.printKShell<>; }elseif<i==3>{ System.out.println<"外存:">; System.out.println<"外存地址\t"+"页号\t"+"数据\n">;for<intk=0;k<20;k++>{s[k].printSource<k>; } }elseif<i==4>{ Stringch="yes";intpageNumb; Scannera=newScanner<System.in>; System.out.print<"请输入一个页号:">;pageNumb=a.nextInt<>;intnumb=this.searchpage<pageNumb>;if<numb<0>{ System.out.println<"内存中没有此页号">; }else{this.Inchange<b,ch,numb>; } }elseif<i==6>{ System.out.println<"结束程序">; System.exit<0>; } }publicstaticvoidmain<String[]args>{ Scannera=newScanner<System.in>;inti,number=-10,k1,k2,result;intk3=0;//当前存储的内存地址intt;//页表中访问次数最小的索引intb[]=newint[10];//内存中存储的数据 Stringch;intslength,plength,Tlength,data; System.out.print<"请输入外存大小:">;slength=a.nextInt<>; System.out.print<"请输入页表大小:">;plength=a.nextInt<>; System.out.print<"请输入快表大小:">;Tlength=a.nextInt<>;//定义页表,快表.外存 Shellpageshell=newShell<plength>;//页表 Sources[]=newSource[slength];//外存 KShellTLB=newKShell<Tlength>;//快表 System.out.println<"产生一个随机序列作为外存数据!">;//录入外存地址和数据for<i=0;i<slength;i++>{data=<int><100*Math.random<>>; System.out.print<data+"\t">;s[i]=newSource<i,data>; } System.out.println<"\n外存设置成功">;//请求页面do{//TLB.printKShell<>;//打印当前快表的情况//pageshell.printPageShell<>;//打印当前页表的情况 System.out.println<"请输入一个页面的页号<0-19>:">;k1=a.nextInt<>;if<k1>=20||k1<0>{ System.out.println<"输入数据有错.将退出程序!!">; System.exit<0>; }//检测快表,快表存储当前的页表项.即当快表满时采用最近最久未被使用算法置换快表 System.out.println<"进入快表检测">;if<TLB.getCurrent<>>0>{number=TLB.searchpage<k1>;if<number!=-1&&number!=-2>{result=b[TLB.shell[number].getPhysicsnumb<>]; System.out.println<"在快表中找到,结果为:"+result>;//找出该页号在页表中的位置并修改访问字段number=TLB.shell[number].getIndex<>;pageshell.shell[number].setVisitcount<pageshell.shell[number].getVisitcount<>+1>; } }if<TLB.getCurrent<><=0||number==-1>{ System.out.println<"在快表中找不到!"+"进入内存检测:">;//在快表中找不到,去内存区的页表找if<pageshell.current>0>{number=pageshell.searchpage<k1>;//页号k1所在的下标if<number!=-1&&number!=-2>{result=b[pageshell.shell[number].getPhysicsnumb<>]; System.out.println<"在页表中找到,结果为:"+result>;//修改访问字段和状态位pageshell.shell[number].setVisitcount<pageshell.shell[number].getVisitcount<>+1>;//修改快表TLB.changeKShell<pageshell,number>; } }if<pageshell.current<=0||number==-1>{ System.out.println<"在内存中找不到!!">; System.out.println<"从外存中调入内存:">;//在页表找不到.去外存区找for<i=0;i<slength;i++>{if<k1==s[i].getPagenumb<>>{//在外存找到了缺页k2=pageshell.Isover<>;if<k2==1>{//内存已满t=pageshell.MinVisitcount<>; System.out.println<"内存已满!即将调出页号"+pageshell.shell[t].getPagenumb<>>; }else{t=pageshell.current;pageshell.setCurrent<pageshell.getCurrent<>+1>; }//判断是否修改了内存的数据if<pageshell.Ischange<t>==1>{s[pageshell.shell[t].getCRTaddress<>].setSts<b[pageshell.shell[t].getPhysicsnumb<>]>; }//调入内存pageshell.shell[t].setPagenumb<k1>;if<k2==1>{b[pageshell.shell[t].getPhysicsnumb<>]=s[i].getSts<>; }else{pageshell.shell[t].setPhysicsnumb<k3>;//未满则设置物理块号.满了只改变其他5个字段b[k3]=s[i].getSts<>;k3++;//物理块号 }pageshell.shell[t].setState<true>;pageshell.shell[t].setVisitcount<1>;pageshell.shell[t].setChange<false>;pageshell.shell[t].setCRTaddress<i>; System.out.println<"调入内存成功!">;//修改快表TLB.changeKShell<pageshell,t>; System.out.println<"修改快表成功!">; System.out.println<"结果为:"+b[k3-1]>;break; } } } }do{gramFunction<>; System.out.print<"请输入一个整数〔1-6:">;i=a.nextInt<>;while<i<1||i>6>{ System.out.println<"输入有误.请重新输入<1-6>:">;i=a.nextInt<>; }pageshell.Dealfunction<i,TLB,s,b>; }while<i!=5>;/*System.out.println<"是否继续请求访问页面<1or0>:">; i=a.nextInt<>; while<i!=1&&i!=0>{ System.out.println<"输入有误.请重新输入<1or0>:">; i=a.nextInt<>; } */}while<i==5>;System.out.println<"退出程序!">;}}〔4KShell类:快表packagehomework;publicclassKShell{ KPageshell[];privateintcurrent;privateintlength;privateintchangenumb;//修改快表的次数publicKShell<>{};publicKShell<intlength>{this.length=length;this.current=0;this.changenumb=0;shell=newKPage[length];for<inti=0;i<length;i++>{this.shell[i]=newKPage<>; } }publicvoidsetCurrent<intcurrent>{this.current=current;}publicvoidsetChangenumb<intchangenumb>{this.changenumb=changenumb;}publicintgetCurrent<>{returncurrent;}publicintgetChangenumb<>{returnchangenumb;}publicintgetLength<>{returnlength;}publicintsearchpage<intpagenumb>{inti=0;if<this.changenumb==0&&this.current==0>{return-2; }elseif<this.changenumb<this.length>{while<i<this.current>{if<this.shell[i].getPagenumb<>==pagenumb>{returni; }i++; }return-1; }else{while<i<this.length>{if<this.shell[i].getPagenumb<>==pagenumb>{returni; }i++; }return-1; } }publicvoidchangeKShell<Shellpageshell,intnumber>{if<this.getChangenumb<>>=this.getLength<>>{if<this.getCurrent<>==this.getLength<>>{this.setCurrent<0>; } System.out.println<"快表已满,快表中即将调出页号"+this.shell[this.current].getPagenumb<>>; }if<this.getCurrent<><this.getLength<>>{this.shell[this.getCurrent<>].setIndex<number>;this.shell[this.getCurrent<>].setPagenumb<pageshell.shell[number].getPagenumb<>>;this.shell[this.getCurrent<>].setPhysicsnumb<pageshell.shell[number].getPhysicsnumb<>>;this.se

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论