模拟虚拟页式存储.doc

上传人:工**** 文档编号:548783078 上传时间:2024-02-04 格式:DOC 页数:9 大小:150KB
返回 下载 相关 举报
模拟虚拟页式存储.doc_第1页
第1页 / 共9页
模拟虚拟页式存储.doc_第2页
第2页 / 共9页
模拟虚拟页式存储.doc_第3页
第3页 / 共9页
模拟虚拟页式存储.doc_第4页
第4页 / 共9页
模拟虚拟页式存储.doc_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《模拟虚拟页式存储.doc》由会员分享,可在线阅读,更多相关《模拟虚拟页式存储.doc(9页珍藏版)》请在金锄头文库上搜索。

1、模拟页面调度 模拟页式虚拟存储管理中硬件的地址转换和缺页中断,并用先进先出算法(FIFO)处理缺页中断。1 页表 假定主存每块的大小为1024个字节,现有一个7页的作业,系统为该作业分配了4个主存块,0-3页已经装入主存(分别装入5,8,9,1块),页表如下:页号标志(1-在主存,0-不在主存)主存块号0151182193114050602 指令序列假设该作业执行的指令序列如下表所示:操作页号页内地址+070+150*215存321取056-640移位453+523存137取278+41存6843 地址转换和缺页中断设计一个地址转换程序来模拟硬件的地址转换和缺页中断,如果访问的页在主存,则形成

2、绝对地址,输出绝对地址。如果访问的页不在主存,则输出“* 该页页号”来表示缺页中断。4 模拟页面调度 当缺页时,使用FIFO页面调度算法,调出最先进入主存的那一页,同时修改页表,调入页的主存块号填写成调出页的主存块号。输出“out 调出页号”,和“in 装入的新页号”。 提示: int p = 0,1,2,3;/前三页已在主存 pk = 新页号 k = (k + 1) mod 4流程图:取一条指令用页号查页表页表标志=1?计算绝对地址,输出输出:“* 该页页号”Yes(不缺页)No(缺页)int out = pk;输出“out 换出页号”输出 “in 调入页号”pk = 调入的页号;k = (

3、k+1)% 4;修改页表:(1) 查询页表中out页所占的内存块号(2) out页的标志置0,内存块号置空;(3) 调入页的标志位置1,内存块号置为原out页块号 5、程序架构和部分代码5.1 页表项PagetableEntry类package paging;/* * 页表项类,每个对象代表一个页表项 * 多个页表项组成一张页表 */public class PagetableEntry private int pageNumber;/页号private int flag;/标志,1在主存,0不在主存private int blockNumber;/块号 public PagetableEnt

4、ry(int pageNumber,int flag,int blockNumber) this.pageNumber = pageNumber; this.flag = flag; this.blockNumber = blockNumber; public int getBlockNumber() return blockNumber;public void setBlockNumber(int blockNumber) this.blockNumber = blockNumber;public int getFlag() return flag;public void setFlag(i

5、nt flag) this.flag = flag;public int getPageNumber() return pageNumber;public void setPageNumber(int pageNumber) this.pageNumber = pageNumber; 5.2 页表类Pagetable页表对象初始化时加入7个页表项,每个页表项代码一页,7页中只有前4页在主存(其标志位为1),并且有其对应的主存块号。Pagetable类提供三个方法: isPageIn():按照页号查询某页是否在主存中 getBlockNumber();按照页号查询该页对应的主存块号 modify

6、(): 修改指定页的页表项(标志位,主存块号)package paging;import java.util.HashMap;public class Pagetable private HashMap table = new HashMap();/页表 public Pagetable() /初始化页表,加入7个页表项,其中前4页在主存 PagetableEntry pe = new PagetableEntry(0,1,5);/创建第0页页表项 table.put(pe.getPageNumber(),pe);/将第0页页表项加入页表 pe = new PagetableEntry(1,1

7、,8); /创建第1页页表项 table.put(pe.getPageNumber(),pe); /将第1页页表项加入页表 _ /创建第2页页表项 _ /将第2页页表项加入页表 _ /创建第3页页表项 _ /将第3页页表项加入页表 pe = new PagetableEntry(4,0,-1); /创建第4页页表项 table.put(pe.getPageNumber(),pe); /将第4页页表项加入页表 _ /创建第5页页表项 _ /将第5页页表项加入页表 _ /创建第6页页表项 _ /将第6页页表项加入页表 /* * 查询某一页是否在内存中 * param 页号 * return 在内存

8、返回true,不在返回false */ public boolean isPageIn(int pageNumber) /在页表中查询pageName对应的页表项 PagetableEntry pe = (PagetableEntry)table.get(pageNumber); if(pe = null) System.err.println(页表中没有此页!); System.exit(-1); if(_) return true;/如果该页的标志位为1,表示在内存,返回true else return false; /* * 修改指定页的页表项 * param 页号 * param 新标

9、志位 * param 新块号 */ public void modify(int pageNumber,int flag,int blockNumber) /在页表中查询pageName对应的页表项 PagetableEntry pe = _; if(pe = null) System.err.println(页表中没有此页!); System.exit(-1); pe.setFlag(flag); /修改标志位 _/修改块号 /* * 根据页号查块号 * param 页号 * return 该页所在的主存块号 */ public int getBlockNumber(int pageNumb

10、er) /在页表中查询pageName对应的页表项 PagetableEntry pe = _; if(pe = null) System.err.println(页表中没有此页!); System.exit(-1); return _;返回该页所在的主存块号 5.3 Paging类,根据用户输入的指令(页号,页内地址),实现FIFO算法的页面置换,以及置换后的绝对地址计算。package paging;import java.io.*;public class Paging private int queue = 0,1,2,3;/页号队列 private int k = 0;/栈顶指针,k

11、指向的单元被换出private Pagetable pt = new Pagetable();/页表/执行指令void execute(String command)/从用户输入中解析出指令、页号和页内地址String params = command.split( );String op = params0;/指令int pageNumber = Integer.parseInt(params1);/页号int relativeAddress = _;/ 页内地址/调用地址转换方法addressTranslation(pageNumber,relativeAddress);/* * 通过页号和页内地址,计算其在内存中的绝对地址 * 方法: * 1、通过页号查块号 * 2、绝对地址 = 块号 * 页大小 + 页内地址 * param 页号 * param 页内地址 * return 绝对地址 */private int generateAbsoluteAddress(int pageNumber,int relativeAddress)/通过页号查块号int blockNumber = pt.getBlockNumber(pageNumber); /计算并返回绝对地址

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号