《操作系统课程设计》开发文档Java.docx
- 文档编号:8019922
- 上传时间:2023-01-28
- 格式:DOCX
- 页数:26
- 大小:276.84KB
《操作系统课程设计》开发文档Java.docx
《《操作系统课程设计》开发文档Java.docx》由会员分享,可在线阅读,更多相关《《操作系统课程设计》开发文档Java.docx(26页珍藏版)》请在冰豆网上搜索。
《操作系统课程设计》开发文档Java
计算机科学与技术系
操作系统课程设计
题目:
通用请求分页调度算法程序
院系:
计算机科学与技术系
专业班级:
09软件工程
学号:
学生姓名:
浪子Raining
指导教师:
2011年12月12日
通用请求分页调度算法程序
1课程设计目的
操作系统是管理计算机硬件的软件。
它也为应用程序提供一个基础,在计算机用户与
计算机硬件之间扮演一个中间者的角色。
在完成操作系统各部分实验的基础上,对操作系统的整体进行一个模拟,通过实践加深对各个部分的管理功能的认识,还能进一步分析各个部分之间的联系,最后达到对完整系统的理解。
本课程设计的目的综合应用学生所学知识,建立系统和完整的计算机系统概念,理解和巩固操作系统基本理论、原理和方法,掌握多道程序设计基本技能。
研究计算机操作系统的基本原理和算法,掌握操作系统的进程管理、存储管理、文件管理和设备管理的基本原理与主要算法。
目的是使学生掌握常用操作系统的一般管理方法,了解它是如何组织和运作的,对操作系统的核心概念和算法有一个透彻的理解,并对系统运行的机制有一个全面的掌握,从而充分理解系统调用与程序设计之间的关系。
由于本课程设计比较复杂,因此也锻炼了同学们在编程方面的能力和解决实际问题的能力,在软件开发方面,也提高了创新的能力;由于在设计的同时必须查阅大量的资料和书籍,所以也锻炼的调查研究查阅技术文献以及编写软件设计文档的能力。
2课程设计内容
在进程运行过程中,当所要访问的页面不在内存时,则应将它调入内存。
假如在此时
内存已无空闲空间,则应选择一页调出。
将哪个页面调出,则须根据一定的算法来确定。
需要调入页面时,选择内存中哪个物理页面被置换。
把未来不再使用的或短期内较少使用的页面调出,通常只能在局部性原理指导下依据过去的统计数据进行预测。
模拟仿真请求分页调度算法OPT、FIFO、LRU、LFU、CLOCK等模拟页面调度算法,并提供性能比较分析功能。
通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解。
熟悉虚存管理的各种页面淘汰算法。
通过编写和调试地址转换过程的模拟程序以加强对地址转换过程的了解。
3系统分析与设计
3.1系统分析:
操作系统中的请求分页系统是建立在基本分页基础上的,为了能支持虚拟存储功能而
增加了调页功能和页面置换功能。
每当程序所要访问的页面未在内存时,便向CPU发出一缺页中断,中断处理程序首先保留CPU环境,分析中断原因后转入缺页中断处理程序。
该程序通过查找页表后,得到该页在外存的物理块后,如果此时内存能容纳新页,则启动磁盘I/O将所却之页调入内存,然后修改页表。
如果内存已满,则须先按照某种置换算法从内存中选出一页准备换出;如果该页未被修改,可不必将该页写回磁盘;但如果此页已被修改,则必须将它写回磁盘,然后再把所缺的也调入内存,并修改页表中的相应表项,置其存在位为“1”,并将此页表项写入快表中。
在缺页调入内存后,利用修改后的页表,去形成所要访问数据的物理地址,再去访问内存数据。
整个页面的调入过程对用户是透明的。
3.2系统设计:
在运行过程中,若其所要访问的页面不再内存而需把它们掉入内存,应将哪个页面调出需根据一定的算法来确定,置换算法的好坏将直接影响到系统的性能。
一个好的页面置换算法应具有较低的页面更换频率。
从理论上讲,应将那些以后不会再访问的页面换出,或把那些再较长时间内不会再访问的页面调出。
①最佳置换算法(Optimal):
它是由Belady于1966年提出的一种理论上的算法。
其所选择的被淘汰页面,将是以后永不使用的或许是在最长(未来)时间内不再被访问的页面。
采用最佳置换算法,通常可保证获得最低的缺页率。
但由于人目前还无法预知一个进程在内存的若干个页面中,哪一个页面是未来最长时间内不再被访问的,因而该算法是无法实现的,便可以利用此算法来评价其它算法。
②先进先出(FIFO)页面置换算法:
这是最早出现的置换算法。
该算法总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰。
该算法实现简单只需把一个进程已调入内存的页面,按先后次序链接成一个队列,因此对首总是最先进去的页面,这样置换总是位于队首的一页。
③LRU置换算法:
最近最久未使用(LRU)置换算法,是根据页面调入内存后的使用情况进行决策的。
由于无法预测各页面将来的使用情况,只能利用“最近的过去”作为“最近的将来”的近似,因此,LRU置换算法是选择最近最久未使用的页面予以淘汰。
该算法可利用一个特殊的栈来保存当前使用的各个页面的页面号,每当进程访问某页面时,便将该页面的页面号从该栈中移出,将它压入栈顶。
因此,栈顶始终是最新被访问页面的编号,而栈底则是最近最久未使用的页面。
3.3模块设计:
1)涉及的抽象数据类型
集合(ArrayList):
集合可以随着元素的增加而自定增加长度,也可删除指定的元素,在指定的位置增加元素。
队列(Queue):
定义了一个可以先进先出的数组,进入时在队尾加入,出队时只能是队首。
栈(Stack):
定义了一个先进后出的数组,进栈和出栈都是在栈顶执行的。
二维数组:
定义了第二维的元素就是第一维元素的标志位。
2)主程序的流程以及模块之间的层次关系
图1:
程序模块图
3.4数据结构说明:
集合:
定义了用来存放所有页面索引号的序列的一个集合,同时也定义了一个表示物理快的集合,用来存放内存中物理块所存放的页面号,在使用过程中可以随时增加和删除,用在页面置换时,可以在指定位置增加和删除元素。
队列:
定义了一个与内存物理块容量相同的队列,同内存快一样用来存放页面号,充分体现类先进先出的作用,在FIFO算法中可以随时找出要置换的页面号,即位于队首的页面。
栈:
定义了一个与内存物理块容量相同的队列,同内存快一样用来存放页面号。
每当进程访问某页面时,便将该页面的页面号从栈中移出,将它压入栈顶。
因此,栈顶始终是最新被访问页面的编号,而栈底则是最近最久未使用的页面号。
二维数组:
在Clock算法中,定义一个二维数组,即给在内存中的每个页面号都定义一个访问位,在根据算法来找到要置换的页面号;在LFU算法中定义一个二维数组,给每个页面号都定义一个访问位来计算被访问的频率,最后比较频率来得出应该被置换的页面号。
3.5算法流程图:
主程序流程图:
图2:
主程序流程图
实现各个算法的流程图:
图3:
FIFO算法流程图
图4:
OPT算法程序流程图
图5:
LRU算法程序流程图
3.6程序代码:
GetSequese.java
/*
*这个类用于设置和获取所输入的页面串
*/
packagecom.model;
importjava.util.*;
publicclassGetSequese{
privateStringsequese=null;
publicStringgetSequese(){
returnsequese;
}
publicvoidsetSequese(){
StringBuffersequese=newStringBuffer("");
Randomrd=newRandom();
for(inti=0;i<15;i++)
{
intnum=rd.nextInt(10);
sequese.append(Integer.toString(num)+"");
}
this.sequese=sequese.toString();
}
publicString[]getSeq(Stringsequese)
{
Stringseq[]=newString[15];
seq=sequese.split("");
returnseq;
}
}
OsView.java
packagecom.view;
importjava.awt.*;
importjava.text.DecimalFormat;
importjava.util.*;
importjava.awt.event.*;
importjavax.swing.*;
importjavax.swing.table.DefaultTableModel;
importcom.model.GetSequese;
publicclassOsViewextendsJFrameimplementsActionListener,ItemListener{
/**
*@paramargs
*/
privateChoicechoice=null;
privateJLabellb[]=newJLabel[6];
privateJCheckBoxckb=null;
privateJTextFieldseq1=null;
privateJButtongetseq=null;
privateJButtonsure=null;
privateJButtonclear=null;
privateJTextFieldseq2[]=newJTextField[15];
privateJTextFieldpage[]=newJTextField[45];
privateJTextFieldctime=null;//记录缺页次数
privateJTextFieldprate=null;//用于计算缺页率
privateJPanelpn[]=newJPanel[13];
privateDefaultTableModeldfmodel=null;
privateJTabletable=null;
privateJScrollPanejsp=null;
privateVectorvector=null;
Stringram[]=newString[3];//模拟内存块
Stringselected=null;//记录所选算法
intabtime=0;//记录缺页次数
intchtime=0;//记录置换次数
doubleabrate=0;//用于计算缺页率
Stringseq3[]=newString[15];//用于暂存seq2的内容,便于FIFO算法和LRU算法的使用
publicOsView(Stringtitle)
{
super(title);
selected="OPT";
for(inti=0;i { pn[i]=newJPanel(); } //顶部布局///////////////////////////////////////////////////////// lb[0]=newJLabel("请选择置换算法: "); lb[1]=newJLabel("进程页面随机索引号顺序(页面号为0~9): "); choice=newChoice(); choice.add("(OPT)最佳置换算法"); choice.add("(FIFO)先进先出置换算法"); choice.add("(LRU)最近最久未使用置换算法"); choice.select(0); choice.addItemListener(this); ckb=newJCheckBox("固定输入"); ckb.addActionListener(this); getseq=newJButton("获得随机索引号"); //getseq.setPreferredSize(newDimension(50,30)); getseq.addActionListener(this); sure=newJButton("确定"); sure.addActionListener(this); pn[1].setLayout(newGridLayout(1,2)); pn[1].add(getseq);pn[1].add(sure); seq1=newJTextField("",50); pn[0].setLayout(newGridLayout(2,3,12,2)); pn[0].add(lb[0]);pn[0].add(ckb);pn[0].add(lb[1]); pn[0].add(choice);pn[0].add(pn[1]);pn[0].add(seq1); //页块布局////////////////////////////////////////////////////////// lb[2]=newJLabel("引用率: "); lb[3]=newJLabel("页框(物理块): "); lb[4]=newJLabel("该算法发生页面置换的次数: "); lb[5]=newJLabel("该算法的缺页率: "); pn[2].setLayout(newGridLayout(3,1,3,18)); pn[2].add(lb[2]);pn[2].add(pn[7]);pn[2].add(lb[3]); pn[3].setLayout(newGridLayout(1,15,13,3)); pn[4].setLayout(newGridLayout(3,15,13,1)); for(inti=0;i { seq2[i]=newJTextField("",2); seq2[i].setHorizontalAlignment(JTextField.CENTER); pn[3].add(seq2[i]); } for(inti=0;i { page[i]=newJTextField("",2);////////////////////////////////////////// page[i].setHorizontalAlignment(JTextField.CENTER); //page[i].setEnabled(false); } inttemp=0; for(intj=0;j<3;j++) { if(j==0||j==1||j==2){ pn[4].add(page[j]); } temp=j; for(inti=0;i { temp=temp+3; if(temp pn[4].add(page[temp]); } } } pn[5].setLayout(newBorderLayout()); pn[5].add(pn[3],"North");pn[5].add(pn[7],"Center");pn[5].add(pn[4],"South"); pn[6].setLayout(newFlowLayout()); pn[6].add(pn[2]); pn[6].add(pn[5]); ctime=newJTextField("",10); //ctime.setEnabled(false); prate=newJTextField("",10); //prate.setEnabled(false); pn[8].add(lb[4]);pn[8].add(ctime); pn[9].add(lb[5]);pn[9].add(prate); clear=newJButton("清空数据"); clear.setPreferredSize(newDimension(123,30)); clear.addActionListener(this); pn[10].add(clear); pn[6].add(pn[8]); pn[6].add(pn[9]);pn[6].add(pn[10]); //统计布局////////////////////////////////////////////////////////// Stringhh[]={"算法","缺页率","描述说明"}; Objectobj[][]={}; dfmodel=newDefaultTableModel(obj,hh); table=newJTable(dfmodel); table.setEnabled(false); table.setPreferredScrollableViewportSize(newDimension(300,223)); jsp=newJScrollPane(table); Stringelement[]={"(OPT)最佳置换算法","(FIFO)先进先出置换算法","(LRU)最近最久未使用置换算法"}; for(inti=0;i<16;i++) { vector=newVector(); if(i<3){ vector.add(element[i]); }else{ vector.add(""); } vector.add(""); vector.add(""); dfmodel.addRow(vector); } this.setLayout(newBorderLayout()); this.add(pn[0],"North"); this.add(pn[6],"Center"); this.add(jsp,"South"); this.setBounds(250,123,800,500); this.setDefaultCloseOperation(EXIT_ON_CLOSE); this.setResizable(false); this.setVisible(true); this.validate(); } publicvoidactionPerformed(ActionEvente){ //TODOAuto-generatedmethodstub GetSequesegets=newGetSequese(); //固定输入复选框的触发事件//////////////////////////////////////////// if(e.getSource()==ckb) { if(ckb.isSelected()){ getseq.setEnabled(false); } else{ getseq.setEnabled(true); } } //获得随机索引号按钮触发事件/////////////////////////////////////////// if(e.getSource()==getseq) { gets.setSequese(); abtime=0; abrate=0; chtime=0; seq1.setText(gets.getSequese()); for(inti=0;i ram[i]=""; } } //确定按钮的触发事件///////////////////////////////////////////////////// if(e.getSource()==sure) { booleanb=true;//作为检查输入的页面串数据是否有误的开关 ram[0]=""; ram[1]=""; ram[2]=""; abtime=0; chtime=0; Stringseq[]=gets.getSeq(seq1.getText().trim()); for(inti=0;i { if(seq[i].matches("[0-9]")==false||seq.length>15) { JOptionPane.showMessageDialog(null,"系统提示: 输入格式错误,请输入1~9的数并以空格隔开! "); b=false; break; }else{ seq2[i].setText(seq[i]); seq3[i]=seq[i]; } } intlocation=0; booleanabsent=true; for(inti=0;i { for(intj=3*i,n=0;j<=2+i*3;j++) { if(this.ishad(seq2[i].getText().trim()))//如果已经在内存中,则不产生缺页中断 { absent=false; }else{ if((location=this.isEmply())! =-1){//如果内存有空闲块,则产生缺页中断 ram[location]=seq2[i].getText().trim(); page[j].setText(ram[location]); abtime++; break; }elseif(selected.indexOf("OPT")! =-1){//如果是OPT算法 this.OPT(i,seq2[i].getText().trim()); break; }elseif(selected.indexOf("FIFO")! =-1){//如果是FIFO算法 this.FIFO(i,seq2[i].getText().trim()); break; }elseif(selected.indexOf("LRU")! =-1){//如果是LRU算法 this.LRU(i,seq2[i].getText().trim()); break; } } } for(intj=3*i,m=0;j<=2+i*3;j++) { if(! absent){//如果不缺页 page[j].setText(""); s
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统课程设计 操作系统 课程设计 开发 文档 Java
![提示](https://static.bdocx.com/images/bang_tan.gif)