请求分页式存储管理的地址转换过程实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 PageQueue;

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 ready,blocked;

public static Process running;

public static BufferedReader br;

static int [][]a=new int[8][8];

相关文档
最新文档