模拟操作系统的请求分页存储管理java代码.docx
- 文档编号:24149774
- 上传时间:2023-05-24
- 格式:DOCX
- 页数:22
- 大小:216.81KB
模拟操作系统的请求分页存储管理java代码.docx
《模拟操作系统的请求分页存储管理java代码.docx》由会员分享,可在线阅读,更多相关《模拟操作系统的请求分页存储管理java代码.docx(22页珍藏版)》请在冰豆网上搜索。
模拟操作系统的请求分页存储管理java代码
请求分页存储管理的实现
写出方案实现代码
(1)page类
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;
}
}
(2)Shell类:
页表
packagehomework;
importjava.util.Scanner;
publicclassShell{
Pageshell[];
privateintcurrent;
privateintlength;
publicShell(){};
publicShell(intlength){
this.length=length;
this.current=0;
shell=newPage[length];
for(inti=0;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 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 if(this.shell[i].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 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 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 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{ pageshell.programFunction(); 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("退出程序! "); } } (4)KShell类: 快表 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 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 while(i if(this.shell[i].getPagenumb()==pagenumb){ returni; } i++; } return-1; } else{ while(i 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.shell[this.getCurrent()].setIndex(number); this.shell[this.getCurrent()].setPagenumb(pageshell.shell[number].getPagenumb()); this.shell[this.getCurrent()].setPhysicsnumb(pageshell.shell[number].getPhysicsnumb()); this.setCurrent(this.getCurrent()+1); this.setChangenumb(this.getChangenumb()+1); } } publicvoidprintKShell(){ System.out.println("快表: "); System.out.println("索引\t"+"页号\t"+"物理块号\t"+"在页表下的索引"); for(inti=0;i System.out.println(i+"\t"+this.shell[i].getPagenumb()+"\t
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 模拟 操作系统 请求 分页 存储 管理 java 代码