分页管理实验报告.docx
《分页管理实验报告.docx》由会员分享,可在线阅读,更多相关《分页管理实验报告.docx(33页珍藏版)》请在冰豆网上搜索。
分页管理实验报告
2015-2016学年第二学期
操作系统课程
实验设计报告
班级网络2班
学号201414620207
姓名韩金铖
成绩
指导教师于复兴
1、实验题目:
(1)模拟请求分页存储管理中的硬件地址转换和产生却页中断的过程。
(2)采用先进先出(或LRU)算法实现分页管理的缺页调度。
2、实验目的:
(1)通过实验模拟请求分页存储管理中的硬件地址转换和产生却页中断帮助理解在分页式存储管理中怎样虚拟存储器。
(2)通过采用先进先出(或LRU)算法实现分页管理的缺页调度帮助理解和掌握模拟分页式虚拟存储管理的缺页中断,帮助自己对请求分页管理的概念有一个清楚的理解。
3、程序设计及实现过程:
(1)请求分页储存管理是把作业的全部信息存在磁盘上,当作业被选中时,可把作业的开始几页先装入主存并启动运行。
为此,在为作业建立页表时,应说明哪些页已在主存,哪些页尚未装入主存,页表格式为:
页号
标志
主存块号
外存地址
其中,标志表示对应页是否已经装入主存,“标志=0”表示该页尚未装入主存,“标志=1”表示该页已在主存。
主存块号表示已装入主存的页所占用的块号。
外存地址表示该页在外存的地址。
(2)作业执行完时,指令中的逻辑地址指出了参加运算的操作数存放的页号和单元号,硬件地址转换机构按页号查页表,若该页对应的标志为“1”,则表示该页已在主存。
根据关系式:
绝对地址=块号*块长+单元号。
计算出欲访问的主存单元地址,将块长设成2的整次幂,可把块号作为地址寄存器的高位部分,单元号作为低位部分。
两个拼接形成绝对地址。
按计算出的绝对地址取操作数,完成一条指令的执行。
若访问的页对应标志为“0”,则表示不在主存,这时硬件发缺页中断信号,由操作系统按页表中的该页对应的外存地址把该页装入主存后,执行该指令。
(3)设计一个“地址变换”程序来模拟硬件的地址转换工作。
当访问的页不在主存时,则形成绝对地址后不去模拟指令的执行,而用输出转换后的地址来代替一条指令的执行,当访问的页不在主存时,则输出“*”,表示产生了一次缺页中断。
该算法框图如下:
地址变换算法:
假定主存的每块长度为126个字节;现有一个共7页的作业,其中第0页至第3页已装入,其余三页尚未装入主存,该作业的页表为:
页号
标志
主存块号
外存地址
0
1
5
011
1
1
8
012
2
1
9
013
3
1
1
021
4
0
022
5
0
023
6
0
121
运行设计的地址变换机构程序,显示或打印运行结果。
因仅模拟地址变换,并不模拟指令的实际执行。
(4)在分页式虚拟存贮系统中,当硬件发出缺页中断后,转操作系统处理缺页中断。
如果主存中已无空闲块,当采用先进先出算法时,则淘汰最先进入主存的一页,若该页修改过,还要存入磁盘,然后在把当前要访问的页装入该块,并修改页表中的对应标志。
当采用LRU算法时,则淘汰最近没有访问的页。
大概流程图如下:
(5)有了具体的核心算法实现方法之后,就可以开发简单的界面,并且把以上综合到程序中,最后调试BUG,完成实验。
4、实验结果及分析:
(1)对于题目一我制作了一个帮助界面(如图1),可以便于我记起实验的内容以及理解相应知识,有了已知内容,我输入逻辑地址(例如320),则程序输出为(如图2)。
图1“题目一帮助界面”图2“题目一运行界面”
(2)对于题目二我同样制作了一个帮助界面(如图3),可以便于我操作程序不出现格式错误,如果出错程序会弹出窗口报错(如图4)。
当物理块数为3,页面使用列表为233223123233时,则采用先进先出算法时table表应如下:
233221212233
2333221223
232333212
******(‘*‘代表缺页中断)
采用LRU算法时table表应如下:
233223123233
23322312323
2332231212
*****(‘*‘代表缺页中断)
则程序输出为(如图5、6)。
图3“题目二帮助界面”图4“题目二错误窗口”
图5“题目二FIFO算法”图6“题目二LRU算法”
5、实验收获和体会:
通过本次实验,使我对于虚拟存储管理的相关内容有了更深的认识,同时提升了我的编程水平和思考问题的能力,对于以后学习或者工作上的困难克服有很大的积极作用。
通过程序设计的训练,我进一步学习和掌握了对程序的设计和编写,从中体会到了面向对象程序设计的方便和巧妙。
懂得了在进行编写一个程序之前,要有明确的目标和整体的设计思想。
另外某些具体的细节内容也是相当的重要。
这些宝贵的编程思想和从中摸索到的经验都是在编程的过程中获得的宝贵财富。
这些经验对我以后的编程会有很大的帮助的,我要好好利用。
我很珍惜这次实验的机会,冰冻三尺非一日之寒,我相信以后会更加细心、更加勤奋。
6、源程序:
1、下面是MenuFrame.Java
packagecom.hjc;
importstaticcom.hjc.Constant.*;
importjava.awt.Button;
importjava.awt.Color;
importjava.awt.Frame;
importjava.awt.Graphics;
importjava.awt.Image;
importjava.awt.Toolkit;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjava.awt.event.WindowAdapter;
importjava.awt.event.WindowEvent;
//菜单界面
publicclassMenuFrameextendsFrameimplementsActionListener{
/**
*
*/
privatestaticfinallongserialVersionUID=1L;
privateImageicon=Toolkit.getDefaultToolkit()
.getImage("image//icon.png");//图标
privateImagetext=Toolkit.getDefaultToolkit()
.getImage("image//text.png");//文字
privateButtonworkOne=newButton("进入题目一");//Button1
privateButtonworkTwo=newButton("进入题目二");//Button2
publicMenuFrame(Stringtitle){
this.setTitle(title);//设置题目
this.setLayout(null);//设置布局
this.setBounds((PM_WIDTH-EXE_WIDTH)/2,
(PM_HEIGHT-EXE_HEIGHT)/2,EXE_WIDTH,EXE_HEIGHT);//应用的位置
this.setIconImage(icon);//设置图标
this.setBackground(Color.YELLOW);//设置背景
workOne.setBounds((EXE_WIDTH-200)/2,(EXE_HEIGHT-40)/2,200,40);
workOne.addActionListener(this);
this.add(workOne);//添加Button1
workTwo.setBounds((EXE_WIDTH-200)/2,(EXE_HEIGHT-40)/2+80,
200,40);
workTwo.addActionListener(this);
this.add(workTwo);//添加Button2
this.addWindowListener(newWindowAdapter(){
publicvoidwindowClosing(WindowEvente){
super.windowClosing(e);
System.exit(0);
}
});//添加窗口监听
this.setResizable(false);//设置不可改变大小
this.setVisible(true);//设置可视
}
//绘制的方法
publicvoidpaint(Graphicsg){
Colorc=g.getColor();//得到初始g颜色
g.setColor(Color.BLUE);//设置画笔为蓝色
g.drawImage(text,(EXE_WIDTH-400)/2,40,400,150,this);//绘制text图片
g.drawString("(实验四)",400,160);//绘制文字
g.drawString("题目一:
模拟请求分页存储管理中的硬件地址转换和产生却页中断的过程",50,400);//绘制文字
g.drawString("题目二:
采用先进先出(或LRU)算法,实现分页管理的缺页调度",50,430);//绘制文字
g.setColor(Color.RED);//设置画笔为红色
g.drawRect(45,380,400,70);//绘制矩形
g.setColor(Color.CYAN);
g.drawString("制作:
乐事@Happy",380,480);
g.setColor(c);//恢复画笔初始颜色
}
publicstaticvoidmain(String[]args){
newMenuFrame("欢迎");
}
//动作监听
publicvoidactionPerformed(ActionEvente){
if(e.getSource()==workOne){
this.setVisible(false);
newworkOneFrame(this);
}elseif(e.getSource()==workTwo){
this.setVisible(false);
newworkTwoFrame(this);
}
}
}
2、下面是Constant.Java
packagecom.hjc;
importjava.awt.Toolkit;
publicclassConstant{
publicstaticintEXE_WIDTH=500;//应用宽度
publicstaticintEXE_HEIGHT=500;//应用高度
publicstaticintPM_WIDTH=Toolkit.getDefaultToolkit().getScreenSize().width;//得到屏幕宽度
publicstaticintPM_HEIGHT=Toolkit.getDefaultToolkit().getScreenSize().height;//得到屏幕高度
publicstaticintMAX=100;
}
3、下面是Page.Java
packagecom.hjc;
publicclassPage{
intpno;//页号
intflag;//标志位
intcno;//主存号
intaddr;//外存地址
publicPage(intpno,intflag,intaddr){
this.pno=pno;
this.flag=flag;
this.addr=addr;
}
publicPage(intpno,intflag,intcno,intaddr){
this.pno=pno;
this.flag=flag;
o=cno;
this.addr=addr;
}
}
4、下面是helpOneFrame.Java
packagecom.hjc;
importstaticcom.hjc.Constant.EXE_HEIGHT;
importstaticcom.hjc.Constant.EXE_WIDTH;
importstaticcom.hjc.Constant.PM_HEIGHT;
importstaticcom.hjc.Constant.PM_WIDTH;
importjava.awt.Color;
importjava.awt.Frame;
importjava.awt.Graphics;
importjava.awt.Image;
importjava.awt.Toolkit;
importjava.awt.event.WindowAdapter;
importjava.awt.event.WindowEvent;
publicclasshelpOneFrameextendsFrame{
/**
*
*/
privatestaticfinallongserialVersionUID=1L;
privateworkOneFramewof;
privateImageicon=Toolkit.getDefaultToolkit()
.getImage("image//icon.png");//图标
privateImageback=Toolkit.getDefaultToolkit().getImage(
"image//helponeback.png");//背景
publichelpOneFrame(workOneFramewof){
this.wof=wof;
this.setTitle("帮助");
this.setLayout(null);//布局为null
this.setBounds((PM_WIDTH-EXE_WIDTH)/2,
(PM_HEIGHT-EXE_HEIGHT)/2,EXE_WIDTH,EXE_HEIGHT);//应用的位置
this.setIconImage(icon);//设置应用图标
this.addWindowListener(newWindowAdapter(){
publicvoidwindowClosing(WindowEvente){
setVisible(false);
wof.setVisible(true);
}
});
this.setResizable(false);//大小不可变
this.setVisible(true);//可视
}
publicvoidpaint(Graphicsg){
Colorc=g.getColor();
g.drawImage(back,0,0,EXE_WIDTH,EXE_HEIGHT,this);
g.setColor(c);
}
}
5、下面是helpTwoFrame.Java
packagecom.hjc;
importstaticcom.hjc.Constant.EXE_HEIGHT;
importstaticcom.hjc.Constant.EXE_WIDTH;
importstaticcom.hjc.Constant.PM_HEIGHT;
importstaticcom.hjc.Constant.PM_WIDTH;
importjava.awt.Color;
importjava.awt.Frame;
importjava.awt.Graphics;
importjava.awt.Image;
importjava.awt.Toolkit;
importjava.awt.event.WindowAdapter;
importjava.awt.event.WindowEvent;
publicclasshelpTwoFrameextendsFrame{
/**
*
*/
privatestaticfinallongserialVersionUID=1L;
privateworkTwoFramewtf;
privateImageicon=Toolkit.getDefaultToolkit()
.getImage("image//icon.png");//图标
privateImageback=Toolkit.getDefaultToolkit().getImage(
"image//helptwoback.png");//背景
publichelpTwoFrame(workTwoFramewtf){
this.wtf=wtf;
this.setTitle("帮助");
this.setLayout(null);//布局为null
this.setBounds((PM_WIDTH-EXE_WIDTH)/2,
(PM_HEIGHT-EXE_HEIGHT)/2,EXE_WIDTH,EXE_HEIGHT);//应用的位置
this.setIconImage(icon);//设置应用图标
this.addWindowListener(newWindowAdapter(){
publicvoidwindowClosing(WindowEvente){
setVisible(false);
wtf.setVisible(true);
}
});
this.setResizable(false);//大小不可变
this.setVisible(true);//可视
}
publicvoidpaint(Graphicsg){
Colorc=g.getColor();
g.drawImage(back,0,0,EXE_WIDTH,EXE_HEIGHT,this);
g.setColor(c);
}
}
6、下面是workOneFrame.Java
packagecom.hjc;
importstaticcom.hjc.Constant.EXE_HEIGHT;
importstaticcom.hjc.Constant.EXE_WIDTH;
importstaticcom.hjc.Constant.PM_HEIGHT;
importstaticcom.hjc.Constant.PM_WIDTH;
importjava.awt.Button;
importjava.awt.Color;
importjava.awt.Font;
importjava.awt.Frame;
importjava.awt.Graphics;
importjava.awt.Image;
importjava.awt.TextArea;
importjava.awt.TextField;
importjava.awt.Toolkit;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjava.awt.event.KeyAdapter;
importjava.awt.event.KeyEvent;
importjava.awt.event.WindowAdapter;
importjava.awt.event.WindowEvent;
importjavax.swing.JOptionPane;
publicclassworkOneFrameextendsFrameimplementsActionListener{
/**
*
*/
privatestaticfinallongserialVersionUID=1L;
privateMenuFramemf;//大管家
privateImageicon=Toolkit.getDefaultToolkit()
.getImage("image//icon.png");//图标
privateImageback=Toolkit.getDefaultToolkit()
.getImage("image//back.png");//背景
privateButtonstart=newButton("Run...");
privateButtonbtHelp=newButton("帮助");
privateTextFieldtf_Logical_Address=newTextField();
privateTextAreata_Output=newTextArea();
privatestaticintEach_Length=126;//主存的每块长度
privatestaticintMax_Numbers=7;//作业页数
publicworkOneFrame(MenuFramemf){
this.mf=mf;
this.setTitle("地址转换和产生却页中断的过程");
this.setLayout(null);//布局为null
this.setBounds((PM_WIDTH-EXE_WIDTH)/2,
(PM_HEIGHT-EXE_HEIGHT)/2,EXE_WIDTH,EXE_HEIGHT);//应用的位置
this.setIconImage(icon);//设置应用图标
tf_Logical_Address.setBounds(200