请求分页式存储管理的地址转换过程实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第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字节
第2字节 第4字节 第6字节
第1字节
第3字节 第5字节 第7字节
3、输入当前执行进程所要访问的逻辑地址,并将其转换成相应的物理地址。
4、进程退出时,根据其页表内容向位示图反向回填“1”。
5、扩充页表,将其变成支持请求和置换功能的二维页表(增加存在位等)。
创建进程时可装入固定的前三页(或键盘输入初始装入页数,不同进程
的装入个数可以不同),其余页装入到置换空间内(置换空间大小应为内
存空间大小的1.5倍,对其还需建立独立的位示图)。
6、分别采用FIFO和LRU置换算法对地址转换过程中遇到的缺页现象进行页
面置换,可将多次地址转换过程中所涉及到的页号视为进程的页面访问
序列,从而计算置换次数和缺页率。
import java.util.Vector;
import java.io.*;
class Process{
Page []PageTable;
Vector
private int size;
private int Pagecount;
private String name;
double visit;
double replacement;
public void setPage(Page []PageTable) {
this.PageTable=new Page[PageTable.length];
for(int i=0;i this.PageTable[i]=PageTable[i]; } } public int getPageBlock(int PageNum) { return PageTable[PageNum].getBlockNum(); } public void setSize(int size) { this.size=size; } public void setPagecount(int Pagecount) { this.Pagecount=Pagecount; } public int getPagecount() { return Pagecount; } { visit=0; replacement=0; } public Process() { } public Process(String name){ =name; } public String toString(){ return name; } } class Page { int flag; int blockNum; int writed;//xiu gai wei int accessfield;//fang wen zi duan int swapsapce_blockno;//wai cun dizhi int t; { blockNum=0; writed=0; accessfield=0; t=0; } public Page() { flag=1; swapsapce_blockno=-1; } public Page(int flag,int swapsapce_blockno) { this.flag=flag; this.swapsapce_blockno=swapsapce_blockno; } public int getBlockNum() { return blockNum; } public int getFlag() { return flag; } } class OS2 { public static Vector public static Process running; public static BufferedReader br; static int [][]a=new int[8][8];