操作系统课程实验报告完整版.docx
《操作系统课程实验报告完整版.docx》由会员分享,可在线阅读,更多相关《操作系统课程实验报告完整版.docx(38页珍藏版)》请在冰豆网上搜索。
操作系统课程实验报告完整版
中南大学
《操作系统》实验报告
姓名:
福星
专业班级:
软件1006班
学号:
完成日期:
2011.11.22
进程调度与存管理
一、实验目的
在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态。
当就续进程个数大于处理器数时,就必须依照某种策略来决定哪些进程优先占用处理器。
实验模拟实现处理机调度,以加深了解处理机调度的工作,并体会优先级和时间片轮转调度算法的具体实施方法。
帮助了解在不同的存储管理方式下,应怎样实现主存空间的分配和回收。
二、实验要求
1、可随机输入若干进程,并按优先权排序;
2、从就绪队首选进程运行:
优先权-1/要求运行时间-1
要求运行时间=0时,撤销该进程
3、重新排序,进行下轮调度。
4、可随时增加进程;
5、规定道数,设置后备队列和挂起状态。
若存中进程少于规定道数,可自动从后备队列调度一作业进入。
被挂起进程入挂起队列,设置解挂功能用于将指定挂起进程解挂入就绪队列。
6、每次调度后,显示各进程状态。
7、自行假设主存空间大小,预设操作系统所占大小并构造未分分区表;
表目容:
起址、长度、状态(未分/空表目)
8、结合以上实验,PCB增加为:
{PID,要求运行时间,优先权,状态,所需主存大小,主存起始位置,
PCB指针}
9、采用最先适应算法分配主存空间;
10、进程完成后,回收主存,并与相邻空闲分区合并。
11、采用图形界面;
三、实验容
选择一个调度算法,实现处理机调度。
1、设计一个按优先权调度算法实现处理机调度的程序;
2、设计按时间片轮转实现处理机调度的程序。
3、主存储器空间的分配和回收。
在可变分区管理方式下,采用最先适应算法实现主存空间的分配和回收。
四、实验原理
该模拟系统采用java语言实现,要实现的功能有新建进程、进程调度、挂起进程、解挂进程、删除进程,道数和时间片大小可以由用户自己调整,有两种调度策略:
按优先权调度和按时间片轮转调度。
每个进程可能有5种状态:
新建(new)、就绪(ready)、运行(running)、阻塞(waiting)、挂起(suspend)。
每个状态都有一个队列用来存放处于该状态的进程,不同的调度策略采用不同的队列实现。
当创建进程时,如果存中的进程数还没达到规定道数,则将新建进程插入就绪队列,如果存中进程数已经达到规定道数,则插到后备队列,后备队列中的进程的状态为new。
CPU每次调度时都从就绪队列中取进程,在进程执行过程中如果下一个操作时IO操作,则将进程插入到waiting队列。
在系统运行过程中可以执行进程挂起操作,但执行的挂起操作时系统自动暂停运行,在弹出窗口选择要挂起的进程后,将选中的进程从原来的队列中删除并插入到挂起队列。
进行解挂操作时将选中的进程从挂起队列中删除并插入该进程原来所处的队列。
Ø按优先级调度:
当选择按优先权调度时,所有队列都采用优先队列,优先队列采用一个有序链表实现,进程的优先权值越大代表优先级越高,优先队列中的进程按优先权从大到小排列,当新进程插入时根据该进程的优先权插入到队列中的合适位置,插入后保持队列按优先权从大到小排列,如果新进程与队列中某个进程优先权值相等,则该新进程插到那个进程后面,以遵循先来先服务的规则。
当要从队列中取出进程时总是取队列中第一个进程,因为该进程的优先级最高。
Ø按时间片轮转调度:
当选择按时间片轮转调度时,所有队列都采用先进先出队列,先进先出队列采用一个普通单向链表实现,当新进程插入时插入到队列的末尾,当要取进程时取队首进程,这样就实现了先进先出。
Ø存管理
该实验基于实验一完成,核心是存的分配和回收,在实验一的基础上增加存管理部分,在新建进程的时候增加一个输入存大小的输入框,在进程进入存时要分配存,在进程销毁时要回收存,如果进入存时存不足,则将进程插入到后备队列等待下次调度。
系统维护一个存表,每个表项代表一个空间,每个空间保存了该空间的起始地址和空间大小以及空间使用状态。
初始时只有一个空间,当CPU启动时要分配存,存分配采用最先适应算法。
回收存时如果有相邻空闲空间,则要进行空闲空间合并。
}
}
五、源代码及截图:
1.divDTO:
publicclassdivDTO
{
privateintdivBase;
privateintlength;
privateintdivFlag;
publicdivDTO(intdivBase,intlength,intdivFlag)
{
this.divBase=divBase;
this.divFlag=divFlag;
this.length=length;
}
publicdivDTO()
{
}
publicvoidsetDivBase(intbase)
{
this.divBase=base;
}
publicintgetDivBase()
{
returnthis.divBase;
}
publicvoidsetLength(intlength)
{
this.length=length;
}
publicintgetLength()
{
returnthis.length;
}
publicvoidsetDivFlag(intflag)
{
this.divFlag=flag;
}
publicintgetDivFalg()
{
returnthis.divFlag;
}
}
2.PcbDTO:
publicclassPcbDTO
{
staticfinalintRunning=1;
staticfinalintReady=2;
staticfinalintWaiting=3;
privateStringprocessName;
privateintrunTime;
privateintprority;
privateintprocessState;
privateintbase;
privateintlimit;
privateintpcbFlag;
publicPcbDTO(Stringname,inttime,intpro,intbase,intlimit)
{
this.processName=name;
this.runTime=time;
this.prority=pro;
this.processState=0;
this.limit=limit;
this.base=base;
}
publicPcbDTO()
{this.pcbFlag=0;}
publicvoidsetProcessName(Stringname)
{
this.processName=name;
}
publicStringgetProcessName()
{
returnprocessName;
}
publicvoidsetRunTime(inttime)
{
this.runTime=time;
}
publicintgetRunTime()
{
returnthis.runTime;
}
publicvoidsetPrority(intprority)
{
this.prority=prority;
}
publicintgetPrority()
{
returnthis.prority;
}
publicvoidsetProcessState(intstate)
{
this.processState=state;
}
publicStringgetProcessState()
{
Strings=newString();
if(this.processState==1)
{
s="running";
}
elseif(this.processState==2)
{
s="ready";
}
elseif(this.processState==3)
{
s="waiting";
}
returns;
}
publicintgetBase()
{
returnthis.base;
}
publicvoidsetBase(intbase)
{
this.base=base;
}
publicvoidsetLimit(intlimit)
{
this.limit=limit;
}
publicintgetLimit()
{
returnthis.limit;
}
}
3.importjavax.swing.*;
importjava.util.*;
importjava.awt.*;
importjava.awt.event.*;
importjavax.swing.event.*;
publicclassMainFrame{
privateJListreadyList;
privateJListwaitingList;
privateJListjobList;
privateJButtonsusButton;
privateJButtonrelaxButton;
privateJButtonstartButton;
privateJButtonnewButton;
privateJLabelnameLabel;
privateJLabelprorityLabel;
privateJLabeltimeLabel;
privateJLabeljobLabel;
privateJLabelreadyLabel;
privateJLabelwaitingLabel;
privateJLabelrunningLabel;
privateJLabelspaceLabel;
privateJLabeldivLabel;
privateJLabelallocLabel;
privateJTablereadyTable;
privateJTablerunningTable;
privateJTabledivTable;
privateJTableallocTable;
privateJTextFieldnameText;
privateJTextFieldtimeText;
privateJTextFieldspaceText;
privateJComboBoxprorityCom;
privateJPanelnewPanel;
privateJPanelwaitingPanel;
privateJPanelreadyPanel;
VectorjobVectorName;
VectorjobDtoVector;
VectorwaitingVectorName;
VectorwaitingDtoVector;
PcbDTO[]readyDtoArray;
PcbDTO[]newDtoArray;
divDTO[]divDtoArray;
PcbDTO[]newSort;
Object[][]readydata;
Object[][]runningdata;
Object[][]divdata;
Object[][]allocdata;
intfirst;
intend;
intpoint;
PcbDTOa;
publicMainFrame(){
a=newPcbDTO();
first=0;
end=0;
point=0;
JFramejf=newJFrame("进程调度-ws");
Containerc=jf.getContentPane();
c.setLayout(null);
//c.setBackground(Color.pink);
newPanel=newJPanel();
newPanel.setLayout(null);
waitingPanel=newJPanel();
waitingPanel.setLayout(null);
//waitingPanel.setBackground(Color.pink);
readyPanel=newJPanel();
readyPanel.setLayout(null);
susButton=newJButton("挂起");
relaxButton=newJButton("释放");
startButton=newJButton("开始");
newButton=newJButton("新建进程");
nameLabel=newJLabel("进程名");
prorityLabel=newJLabel("优先级");
timeLabel=newJLabel("运行时间");
jobLabel=newJLabel("后备队列");
readyLabel=newJLabel("就绪队列");
waitingLabel=newJLabel("等待队列");
runningLabel=newJLabel("运行进程");
spaceLabel=newJLabel("需要空间");
divLabel=newJLabel("未分分区表");
allocLabel=newJLabel("存分配表");
nameText=newJTextField();
timeText=newJTextField();
spaceText=newJTextField();
prorityCom=newJComboBox();
prorityCom.setToolTipText("优先级");
readyDtoArray=newPcbDTO[6];
newSort=newPcbDTO[6];
for(inti=0;i<6;i++){
newSort[i]=newPcbDTO();
}
newDtoArray=newPcbDTO[100];
jobDtoVector=newVector();
jobVectorName=newVector();
waitingDtoVector=newVector();
waitingVectorName=newVector();
divDtoArray=newdivDTO[20];
for(inti=0;i<20;i++){
divDtoArray[i]=newdivDTO();
divDtoArray[i].setDivFlag(0);
}
divDtoArray[0].setDivFlag
(1);
divDtoArray[0].setDivBase(20);
divDtoArray[0].setLength(180);
readydata=newObject[6][4];
runningdata=newObject[2][3];
divdata=newObject[20][3];
allocdata=newObject[20][3];
String[]col1={"进程","时间","优先级","状态"};
String[]col2={"进程","时间","优先级"};
String[]col3={"起址","长度","状态"};
String[]col4={"起址","长度","占用进程"};
readyTable=newJTable(readydata,col1);
//readyTable.setEnabled(false);
runningTable=newJTable(runningdata,col2);
runningTable.setRowHeight(22);
runningTable.setEnabled(false);
allocTable=newJTable(allocdata,col4);
allocTable.setEnabled(false);
divTable=newJTable(divdata,col3);
divTable.setEnabled(false);
divTable.setValueAt(String.valueOf(20),0,0);
divTable.setValueAt(String.valueOf(180),0,1);
divTable.setValueAt(String.valueOf
(1),0,2);
JScrollPanerunningSP=newJScrollPane();
JScrollPanereadySP2=newJScrollPane();
JScrollPanedivSP=newJScrollPane();
JScrollPaneallocSP=newJScrollPane();
runningSP.getViewport().add(runningTable);
readySP2.getViewport().add(readyTable);
divSP.getViewport().add(divTable);
allocSP.getViewport().add(allocTable);
//int[]prorityArray=newint[10];
for(inti=0;i<10;i++){
prorityCom.addItem(i);//prorityArray[i]=i;
}
jobList=newJList();
waitingList=newJList();
JScrollPanereadySP=newJScrollPane(readyList);
JScrollPanejobSP=newJScrollPane(jobList);
JScrollPanewaitingSP=newJScrollPane(waitingList);
newPanel.setSize(450,100);
newPanel.setLocation(0,0);
nameLabel.setSize(80,20);
nameLabel.setLocation(10,5);
nameText.setSize(100,25);
nameText.setLocation(10,30);
prorityLabel.setSize(80,20);
prorityLabel.setLocation(120,5);
prorityCom.setSize(100,25);
prorityCom.setLocation(120,30);
timeLabel.setSize(80,20);
timeLabel.setLocation(230,5);
timeText.setSize(100,25);
timeText.setLocation(230,30);
spaceLabel.setSize(80,20);
spaceLabel.setLocation(340,5);
spaceText.setSize(100,25);
spaceText.setLocation(340,30);
newButton.setSize(100,20);
newButton.setLocation(320,70);
waitingPanel.setSize(190,410);
waitingPanel.setLocation(0,100);
jobLabel.setSize(100,20);
jobLabel.setLocation(10,2);
jobSP.setSize(180,105);
jobSP.setLocation(10,25);
waitingLabel.setSize(100,20);
waitingLabel.setLocation(10,129);
waitingSP.setSize(180,105);
waitingSP.setLocation(10,150);
divLabel.setSize(100,20);
divLabel.setLocation(10,253);
divSP.setSize(180,113);
divSP.setLocation(10,273);
relaxButton.setSize(80,20);
relaxButton.setLocation(110,388);
readyPanel.setSize(260,410);
readyPanel.setLocation(190,100);
readyLabel.setSize(100,22);
readyLabel.setLocation(10,2);
allocLabel.setSize(100,20);
allocLabel.setLocation(10,232);
startButton.setSize(80,20);
startButton.setLocation(177,388);
susButton.setSize(80,20);
susButton.setLocation(95,388);
readySP2.