您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 其它行业文档 > 请求分页式存储管理的地址转换过程实现
第2部分、请求分页式存储管理的地址转换过程实现:●基本要求:在第1部分实验基础上实现进程的分页式内存分配和地址转换过程,并进一步实现请求分页式存储分配和地址转换过程。页面置换算法至少应实现先进先出(FIFO)、最近最久未使用(LRU)等算法。●参考学时:16学时●实验提示:1、建立一个位示图,用来模拟内存的分配情况,位示图的位数与设定的物理块个数相同。程序启动时可利用一组随机0和1填充位示图,表示内存已被占用情况。假设内存容量为64K,块大小为1K,则共有64个块,对应的位示图可能的值如下:该位示图表示内存的2(0字节第2位)、3(0字节第3位)、6(0字节第6位)、8(1字节第0位)、9(1字节第1位)、12(1字节第4位)、15(1字节第7位)…等块没有被占用。2、创建进程时输入进程大小,并根据程序中设定的物理块大小为进程分配物理块,同时建立页表。例如,在上图基础上,若要建立一个大小为5000字节的进程,则:计算出该进程共有“向上取整(5000/1024)=5”个页,需要占用5个内存块;建立空的页表,即长度为5的一维整数数组;从位示图中找出前5个“0”位在整个位示图中的位置号(即i字节j位为0,则该位的位置为8*i+j),并将这些号依次填入页表中,同时把前5个“0”改为“1”,以示对应内存块已经分配。第0字节10110011第2字节11100111第4字节00011111第6字节11111000第1字节01101100第3字节10000111第5字节01110011第7字节000000013、输入当前执行进程所要访问的逻辑地址,并将其转换成相应的物理地址。4、进程退出时,根据其页表内容向位示图反向回填“1”。5、扩充页表,将其变成支持请求和置换功能的二维页表(增加存在位等)。创建进程时可装入固定的前三页(或键盘输入初始装入页数,不同进程的装入个数可以不同),其余页装入到置换空间内(置换空间大小应为内存空间大小的1.5倍,对其还需建立独立的位示图)。6、分别采用FIFO和LRU置换算法对地址转换过程中遇到的缺页现象进行页面置换,可将多次地址转换过程中所涉及到的页号视为进程的页面访问序列,从而计算置换次数和缺页率。importjava.util.Vector;importjava.io.*;classProcess{Page[]PageTable;VectorPagePageQueue;privateintsize;privateintPagecount;privateStringname;doublevisit;doublereplacement;publicvoidsetPage(Page[]PageTable){this.PageTable=newPage[PageTable.length];for(inti=0;iPageTable.length;i++){this.PageTable[i]=PageTable[i];}}publicintgetPageBlock(intPageNum){returnPageTable[PageNum].getBlockNum();}publicvoidsetSize(intsize){this.size=size;}publicvoidsetPagecount(intPagecount){this.Pagecount=Pagecount;}publicintgetPagecount(){returnPagecount;}{visit=0;replacement=0;}publicProcess(){}publicProcess(Stringname){this.name=name;}publicStringtoString(){returnname;}}classPage{intflag;intblockNum;intwrited;//xiugaiweiintaccessfield;//fangwenziduanintswapsapce_blockno;//waicundizhiintt;{blockNum=0;writed=0;accessfield=0;t=0;}publicPage(){flag=1;swapsapce_blockno=-1;}publicPage(intflag,intswapsapce_blockno){this.flag=flag;this.swapsapce_blockno=swapsapce_blockno;}publicintgetBlockNum(){returnblockNum;}publicintgetFlag(){returnflag;}}classOS2{publicstaticVectorProcessready,blocked;publicstaticProcessrunning;publicstaticBufferedReaderbr;staticint[][]a=newint[8][8];staticint[][]d=newint[10][10];//置换空间staticintcount=0;publicOS2(){ready=newVectorProcess();blocked=newVectorProcess();br=newBufferedReader(newInputStreamReader(System.in));for(inti=0;ia.length;i++){for(intj=0;ja[i].length;j++){if(Math.random()0.5){a[i][j]=0;}else{a[i][j]=1;}}}for(inti=0;id.length;i++){for(intj=0;jd[i].length;j++){if(Math.random()0.5){d[i][j]=0;}else{d[i][j]=1;}}}System.out.println(位示图----------------);print(a);System.out.println(置换空间--------------);print(d);}publicstaticvoidgo(){while(true){System.out.println(=======================================================================);System.out.println(1:进程创建);System.out.println(2:进程到时);System.out.println(3:进程阻塞);System.out.println(4:进程唤醒);System.out.println(5:进程结束);System.out.println(6:逻辑地址转换为物理地址);System.out.println(7:查看页表);System.out.println(8:显示位示图和置换空间);System.out.println(9:查看置换次数和缺页率);System.out.println(0:退出--);try{inti=Integer.parseInt(br.readLine());switch(i){case0:System.exit(0);case1:createNewProcess();break;case2:switchCurrentProcess();break;case3:blockCurrentProcess();break;case4:wakeupBlockedProcess();break;case5:terminateCurrentProcess();break;case6:transform();break;case7:showPage();break;case8:System.out.println(位示图----------------);print(a);System.out.println(置换空间--------------);print(d);break;case9:look();break;}}catch(Exceptione){System.out.println(e);}System.out.println(执行进程:+(running==null?none:running));System.out.print(就绪进程:);printList(ready);System.out.print(阻塞进程:);printList(blocked);}}publicstaticvoidprintList(Vectorv){for(inti=0;iv.size();i++)System.out.print(v.elementAt(i)+\t);System.out.println();}publicstaticvoidcreateNewProcess(){try{System.out.print(进程名称:);Stringname=br.readLine();Processprocess=newProcess(name);ready.add(process);System.out.print(进程大小:);doublesize=Integer.parseInt(br.readLine());intnumPage=0;numPage=(int)Math.ceil(size/1024);process.setPagecount(numPage);Page[]P=newPage[numPage];process.PageQueue=newVectorPage();st:for(inti=0;ia.length;i++){for(intj=0;ja[i].length;j++){if(a[i][j]==0){if(count3){//Pagep1=newPage();//P[count]=p1;P[count]=newPage();P[count].blockNum=8*i+j;process.PageQueue.add(P[count]);P[count].t=3-count;count++;a[i][j]=1;if(count==numPage){breakst;}}else{for(intm=0;md.length;m++){for(intn=0;nd[m].length;n++){if(d[m][n]==0){//Pagep2=newPage();//P[count]=p2;P[count]=newPage(0,-1);P[count].blockNum=-1;P[count].swapsapce_blockno=8*m+n;count++;d[m][n]=1;if(count==numPage){count=0;breakst;}}}}}}}}if(running==null){running=(Process)ready.elementAt(0);ready.removeElementAt(0);}process.setPage(P);}catch(Exceptione){System.out.println(e);}}publicstaticvoidswitchCurrentProcess(){if(running!=null)ready.add(running);if(ready.size()0){running=(Process)ready.elementAt(0);ready.removeElementAt(0);}elserunning=null;}publicstaticvoidblockCurrentProcess(){if(running!=null){blocked.add(running);}if(ready.size()0){running=(Process)re
本文标题:请求分页式存储管理的地址转换过程实现
链接地址:https://www.777doc.com/doc-3548763 .html