实验5分页式存储管理

实验五 分页式存储管理

一、实验目的

通过编写分页式存储管理的模拟程序,加深对页式存储管理方式的理解,熟悉逻辑地址到物理地址的转换过程,掌握虚拟存储管理中的页面调度算法,认识分页式虚拟存储系统中缺页中断的处理过程。

二、实验内容

1、设计一个分页式虚拟存储系统,用程序模拟实现,假设页面大小为1K,每个作业分配三个页面。

2、页面调度分别采用FIFO调度算法和最佳置换算法。(淘汰页面时直接将该页面从内存中直接淘汰,不考虑该页面是否被修改,是否需要保存到外存。)

3

4操作符 页号1 页内地址1 页号2 页内地址2 表示将页面1内地址为011单元的

内容和页面2中地址为051的单元的内容相加。例如:

5面调度算法,淘汰之前内存中相应页,然后该页放进内存。

6、要求每执行上述指令流中的一条逻辑指令,输出相应的物理指令,若页表有修改,则显示修改后的页表。

这次试验是用Java 写的。

首先,在页表类中,该类定义为:

Page.java:

package 操作系统;

public class Page {

private int pageNo; //表示页号码

private int mark; //表示标志

private int blockNo; //表示主存块号

public Page(int pageNo, int mark, int blockNo) {

super();

this.pageNo = pageNo;

this.mark

this.blockNo = blockNo;

}

public int getPageNo() {

return pageNo;

}

public void setPageNo(int pageNo) {

this.pageNo = pageNo;

}

public int getMark() {

return mark;

}

public void setMark(int mark) {

this.mark = mark;

}

public int getBlockNo() {

return blockNo;

}

public void setBlockNo(int blockNo) {

this.blockNo = blockNo;

}

}

其次,我将操作指令封装成一个类,该类为:

Command.java:

package 操作系统;

public class Command {

private static int fifoindex=0; //下面有解释

private static int optimalIndex = 0; //跟上面 一个一样 private int pageNo; //表示页号

private String pageAdd; //表示业内地址

public Command() {

}

public Command(int pageNo, String pageAdd) {

super();

this.pageNo = pageNo;

this.pageAdd = pageAdd;

}

public int getPageNo() {

return pageNo;

}

public void setPageNo(int pageNo) {

this.pageNo = pageNo;

}

public String getPageAdd() {

return pageAdd;

}

public void setPageAdd(String pageAdd) {

this.pageAdd = pageAdd;

}

前面部分就是设置与获取操作指令中的私有属性。

下半部分分别是Fifo算法和最优置换算法。

//该函数用来判断指令中的页号是否在主存当中

boolean isInMain(Page page[] ,Command first) {

if(page[first.getPageNo()].getMark() == 1) {

return true;

}

return false;

}

//用来输出当前主存中的页表

void printPage(Page page[] ,Command first,Command

second,String oper) {

System.out.println("当前主存的页表为:");

System.out.println("页号 " + " 标志 " + " 主存块号" );

for(int i=0;i

System.out.print(" " + page[i].getPageNo()); System.out.print(" " + page[i].getMark());

System.out.println(" " + page[i].getBlockNo()); }

System.out.println();

System.out.println("当前的物理指令为:"

+ oper + " " + first.getPageNo() + " " + first.getPageAdd() + " " + second.getPageNo() + " " +

second.getPageAdd());

}

//用来表示输出结果

void print(Command first, String oper,Command second ,Page page[]) {

int index1 = 0,index2 = 0;

for(int i=0;i

if(first.getPageNo() == page[i].getPageNo()) { index1 = i;

}

if(second.getPageNo() == page[i].getPageNo()) { index2 = i;

}

}

if(oper.equals("读")) {

System.out.println("(" + page[index1].getBlockNo() + first.getPageAdd() + ")" + "(" +

page[index2].getBlockNo() +second.getPageAdd() + ")" );

}else {

System.out.println("(" + page[index1].getBlockNo() + first.getPageAdd() + ")" + (String)oper + "(" + page[index2].getBlockNo() +second.getPageAdd() + ")" );

}

}

//该函数是将在外存的页号调入主存中

void fifoChangeLocation(Page page[] ,Command first) {

/*如果不在主存当中,那么最最最最最最最最最最最最起初当然是删除第一个,

* 然后把该页号送进这块主存的地方,然后fifoindex递增一次,当到达最后一个时候要返回第一个,

* 所以要设置循环,所以fifoindex= fifoindex%3

*/

page[fifoindex].setMark(0);

page[fifoindex].setPageNo(first.getPageNo());

fifoindex++;

fifoindex = fifoindex % 3;

}

//FIFO算法

void fifoOperate(String oper, Command first, Command second, Page page[] )

{

//首先进来对两个页号进行判断,看其是否在主存之中.如果不在主存块中,那么根据先进先出原则,把

if(!isInMain(page,first)) {

//如果不在内存中,实行调换

fifoChangeLocation(page,first);

}

if(!isInMain(page,second)) {

fifoChangeLocation(page,second);

}

printPage(page,first,second,oper);

print(first,oper,second,page);

System.out.println();

}

//y用来判断主存中三个页号最晚出现的页号

int min(int a,int b,int c) {

int min = a;

if(min

min = b;

if(min

min = c;

}

}

return min;

}

//最优置换算法将外存的页号调入内存

//用来进行调换外存页号与要被替换的主存页号

void optimalChangeLocation(Page page[],Command

character[],Command first ) {

int firstNum = -1; //用来记录外存中

int secondNum = -1;

int thirtNum = -1;

for(int i=0;i

if(page[0].getPageNo() == character[i].getPageNo()) { firstNum = i;

}

if(page[1].getPageNo() == character[i].getPageNo()) { secondNum = i;

}

if(page[2].getPageNo() == character[i].getPageNo()) { thirtNum = i;

}

//这边我只在乎谁最后一个出现

if(firstNum != -1 && secondNum != -1 && thirtNum != -1) {

break;

}

}

int = min(firstNum,secondNum,thirtNum);

page[optimalIndex].setMark(0);

page[optimalIndex].setPageNo(first.getPageNo());

optimalIndex++;

optimalIndex = optimalIndex % 3;

}

//最优置换算法操作

void optimalOperate(Command character[],Page page[],String oper, Command first,Command second) {

if(!isInMain(page,first)) {

optimalChangeLocation(page,character,first);

}

if(!isInMain(page,second)) {

optimalChangeLocation(page,character,second);

}

printPage(page,first,second,oper);

print(first,oper,second,page);

System.out.println();

}

}

在主函数中:

即在TestMain.java:

package 操作系统;

public class TestMain {

public static void main(String[] args) {

//首先对页表进行初始化

Page A = new Page(0,1,3);

Page B = new Page(1,1,4);

Page C = new Page(2,1,5);

Page D = new Page(3,0,0);

Page E = new Page(4,0,0);

Page F = new Page(5,0,0);

Page page[] = {A,B,C,D,E,F};

//然后再植入指令序列

Command a = new Command(0, "030");

Command b = new Command(2, "003");

Command c = new Command(1, "050");

Command d = new Command(2, "005");

Command e = new Command(2, "001");

Command f = new Command(5, "004");

Command g = new Command(3, "007");

Command h = new Command(1, "031");

Command i = new Command(4, "034");

Command j = new Command(3, "025");

Command character[] = {a,b,c,d,e,f,g,h,i,j};

Command operate = new Command();

operate.fifoOperate("+", a, b, page);

operate.fifoOperate("-", c, d, page);

operate.fifoOperate("*", e, f, page);

operate.fifoOperate("/", g, h, page);

operate.fifoOperate("读", i, j, page);

//(3030 + 5003 4050-5005 5001*3004 4007/5031 3034 读 4025)

System.out.println("最优置换算法输出结果:");

operate.optimalOperate(character,page,"+", a, b); operate.optimalOperate(character,page,"-", c, d); operate.optimalOperate(character,page,"*", e, f); operate.optimalOperate(character,page,"/", g, h); operate.optimalOperate(character,page,"读", i, j); }

}

最后的实验结果:

实验五 分页式存储管理

一、实验目的

通过编写分页式存储管理的模拟程序,加深对页式存储管理方式的理解,熟悉逻辑地址到物理地址的转换过程,掌握虚拟存储管理中的页面调度算法,认识分页式虚拟存储系统中缺页中断的处理过程。

二、实验内容

1、设计一个分页式虚拟存储系统,用程序模拟实现,假设页面大小为1K,每个作业分配三个页面。

2、页面调度分别采用FIFO调度算法和最佳置换算法。(淘汰页面时直接将该页面从内存中直接淘汰,不考虑该页面是否被修改,是否需要保存到外存。)

3

4操作符 页号1 页内地址1 页号2 页内地址2 表示将页面1内地址为011单元的

内容和页面2中地址为051的单元的内容相加。例如:

5面调度算法,淘汰之前内存中相应页,然后该页放进内存。

6、要求每执行上述指令流中的一条逻辑指令,输出相应的物理指令,若页表有修改,则显示修改后的页表。

这次试验是用Java 写的。

首先,在页表类中,该类定义为:

Page.java:

package 操作系统;

public class Page {

private int pageNo; //表示页号码

private int mark; //表示标志

private int blockNo; //表示主存块号

public Page(int pageNo, int mark, int blockNo) {

super();

this.pageNo = pageNo;

this.mark

this.blockNo = blockNo;

}

public int getPageNo() {

return pageNo;

}

public void setPageNo(int pageNo) {

this.pageNo = pageNo;

}

public int getMark() {

return mark;

}

public void setMark(int mark) {

this.mark = mark;

}

public int getBlockNo() {

return blockNo;

}

public void setBlockNo(int blockNo) {

this.blockNo = blockNo;

}

}

其次,我将操作指令封装成一个类,该类为:

Command.java:

package 操作系统;

public class Command {

private static int fifoindex=0; //下面有解释

private static int optimalIndex = 0; //跟上面 一个一样 private int pageNo; //表示页号

private String pageAdd; //表示业内地址

public Command() {

}

public Command(int pageNo, String pageAdd) {

super();

this.pageNo = pageNo;

this.pageAdd = pageAdd;

}

public int getPageNo() {

return pageNo;

}

public void setPageNo(int pageNo) {

this.pageNo = pageNo;

}

public String getPageAdd() {

return pageAdd;

}

public void setPageAdd(String pageAdd) {

this.pageAdd = pageAdd;

}

前面部分就是设置与获取操作指令中的私有属性。

下半部分分别是Fifo算法和最优置换算法。

//该函数用来判断指令中的页号是否在主存当中

boolean isInMain(Page page[] ,Command first) {

if(page[first.getPageNo()].getMark() == 1) {

return true;

}

return false;

}

//用来输出当前主存中的页表

void printPage(Page page[] ,Command first,Command

second,String oper) {

System.out.println("当前主存的页表为:");

System.out.println("页号 " + " 标志 " + " 主存块号" );

for(int i=0;i

System.out.print(" " + page[i].getPageNo()); System.out.print(" " + page[i].getMark());

System.out.println(" " + page[i].getBlockNo()); }

System.out.println();

System.out.println("当前的物理指令为:"

+ oper + " " + first.getPageNo() + " " + first.getPageAdd() + " " + second.getPageNo() + " " +

second.getPageAdd());

}

//用来表示输出结果

void print(Command first, String oper,Command second ,Page page[]) {

int index1 = 0,index2 = 0;

for(int i=0;i

if(first.getPageNo() == page[i].getPageNo()) { index1 = i;

}

if(second.getPageNo() == page[i].getPageNo()) { index2 = i;

}

}

if(oper.equals("读")) {

System.out.println("(" + page[index1].getBlockNo() + first.getPageAdd() + ")" + "(" +

page[index2].getBlockNo() +second.getPageAdd() + ")" );

}else {

System.out.println("(" + page[index1].getBlockNo() + first.getPageAdd() + ")" + (String)oper + "(" + page[index2].getBlockNo() +second.getPageAdd() + ")" );

}

}

//该函数是将在外存的页号调入主存中

void fifoChangeLocation(Page page[] ,Command first) {

/*如果不在主存当中,那么最最最最最最最最最最最最起初当然是删除第一个,

* 然后把该页号送进这块主存的地方,然后fifoindex递增一次,当到达最后一个时候要返回第一个,

* 所以要设置循环,所以fifoindex= fifoindex%3

*/

page[fifoindex].setMark(0);

page[fifoindex].setPageNo(first.getPageNo());

fifoindex++;

fifoindex = fifoindex % 3;

}

//FIFO算法

void fifoOperate(String oper, Command first, Command second, Page page[] )

{

//首先进来对两个页号进行判断,看其是否在主存之中.如果不在主存块中,那么根据先进先出原则,把

if(!isInMain(page,first)) {

//如果不在内存中,实行调换

fifoChangeLocation(page,first);

}

if(!isInMain(page,second)) {

fifoChangeLocation(page,second);

}

printPage(page,first,second,oper);

print(first,oper,second,page);

System.out.println();

}

//y用来判断主存中三个页号最晚出现的页号

int min(int a,int b,int c) {

int min = a;

if(min

min = b;

if(min

min = c;

}

}

return min;

}

//最优置换算法将外存的页号调入内存

//用来进行调换外存页号与要被替换的主存页号

void optimalChangeLocation(Page page[],Command

character[],Command first ) {

int firstNum = -1; //用来记录外存中

int secondNum = -1;

int thirtNum = -1;

for(int i=0;i

if(page[0].getPageNo() == character[i].getPageNo()) { firstNum = i;

}

if(page[1].getPageNo() == character[i].getPageNo()) { secondNum = i;

}

if(page[2].getPageNo() == character[i].getPageNo()) { thirtNum = i;

}

//这边我只在乎谁最后一个出现

if(firstNum != -1 && secondNum != -1 && thirtNum != -1) {

break;

}

}

int = min(firstNum,secondNum,thirtNum);

page[optimalIndex].setMark(0);

page[optimalIndex].setPageNo(first.getPageNo());

optimalIndex++;

optimalIndex = optimalIndex % 3;

}

//最优置换算法操作

void optimalOperate(Command character[],Page page[],String oper, Command first,Command second) {

if(!isInMain(page,first)) {

optimalChangeLocation(page,character,first);

}

if(!isInMain(page,second)) {

optimalChangeLocation(page,character,second);

}

printPage(page,first,second,oper);

print(first,oper,second,page);

System.out.println();

}

}

在主函数中:

即在TestMain.java:

package 操作系统;

public class TestMain {

public static void main(String[] args) {

//首先对页表进行初始化

Page A = new Page(0,1,3);

Page B = new Page(1,1,4);

Page C = new Page(2,1,5);

Page D = new Page(3,0,0);

Page E = new Page(4,0,0);

Page F = new Page(5,0,0);

Page page[] = {A,B,C,D,E,F};

//然后再植入指令序列

Command a = new Command(0, "030");

Command b = new Command(2, "003");

Command c = new Command(1, "050");

Command d = new Command(2, "005");

Command e = new Command(2, "001");

Command f = new Command(5, "004");

Command g = new Command(3, "007");

Command h = new Command(1, "031");

Command i = new Command(4, "034");

Command j = new Command(3, "025");

Command character[] = {a,b,c,d,e,f,g,h,i,j};

Command operate = new Command();

operate.fifoOperate("+", a, b, page);

operate.fifoOperate("-", c, d, page);

operate.fifoOperate("*", e, f, page);

operate.fifoOperate("/", g, h, page);

operate.fifoOperate("读", i, j, page);

//(3030 + 5003 4050-5005 5001*3004 4007/5031 3034 读 4025)

System.out.println("最优置换算法输出结果:");

operate.optimalOperate(character,page,"+", a, b); operate.optimalOperate(character,page,"-", c, d); operate.optimalOperate(character,page,"*", e, f); operate.optimalOperate(character,page,"/", g, h); operate.optimalOperate(character,page,"读", i, j); }

}

最后的实验结果:


相关文章

  • 实验室设备管理系统
  • . 实验室设备管理系统计划任务书 1. 范围 1. 1项目目标 本系统的目标是每学年能够对实验室的实验设备使用的一些基本情况进行统计.添加.修改和删除,根据设备的损坏情况:彻底损坏.有严重问题的.急需却又缺少的.能根据给出的信息决定对设备进 ...查看


  • 数据库实验指导书
  • 数据库原理及应用 实验指导书 湖南工程学院计算机科学与通信学院 2011年9月 实验一 一. 实验目的: 掌握建立一个数据库表结构的方法和步骤 ,了解数据库表的基本组成. 二. 实验内容: 基本表的创建和修改. 三. 实验要求:(必做) 硬 ...查看


  • 样本库硬件建设
  • BIMS生物样本库整体解决方案主要流程为: 样本库规划建设→样本采集→样本处理→样本信息获取→样本存储→样本信息管理. 场地规划建设 在建筑行业有着"百年基业从地基开始"的行业准则,在生物样本库硬件建设中坚持这一标准也十 ...查看


  • 给一个未出生孩子的信Txt-[意]法拉奇
  • (revision 1.0) 拟制人: 葛平军 审核人: 王振铎 批准人: 修 宇 Software Analysis Description 2006年11月1日 需求分析报告 §1概述 §1.1背景 任何一个组织或是集体,实现它内部人员 ...查看


  • 存储管理实验报告
  • GDOU-B-11-112 广东海洋大学学生实验报告书(学生用表) 实验名称 存储管理 学院(系) 学生姓名 课程名称 专业 学号 操作系统 课程号 班级 实验日期 软件学院 软件工程 实验地点 一.实验目的 修改MINIX操作系统内存管理 ...查看


  • 数据库图书馆管理
  • 课程设计报告 课程设计题目: 图书借阅管理系统数据库 的设计与实现 专 业: 软件工程 班 级: 10211123 姓 名: ** 学 号: ******* 指导教师: 游胜玉 2011年 11 月25 日 目 录 一. 实验题目 ···· ...查看


  • 浅谈SQLServer数据库的特点和基本功能
  • DOI:10.14018/j.cnki.cn13-1085/n.2012.22.111 Value Engineering ·229· 浅谈SQL Server 数据库的特点和基本功能 Research of the Characteris ...查看


  • 计算机组成原理存储器读写和总线控制实验实验报告
  • 信息与管理科学学院计算机科学与技术 实验报告 课程名称: 计算机组成原理 实验名称: 存储器读写和总线控制实验 学 号: 姓 名: 班 级: 实 验 室: 组成原理实验室 日 期: 2013-11-22 指导教师: 一.实验目的 1.掌握半 ...查看


  • 门禁系统设置标准
  • 上海市质量技术监督局发布上海市地方标准<重点单位重 要部位安全技术防范系统要求第11部分:医院> 1 范围 本标准规定了本市医院安全技术防范系统的设计.施工.检验.验收.维护. 本标准适用于本市行政区域内依照<医疗机构管理 ...查看


热门内容