操作系统课程 实验报告完整版Word文档下载推荐.docx
《操作系统课程 实验报告完整版Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《操作系统课程 实验报告完整版Word文档下载推荐.docx(28页珍藏版)》请在冰点文库上搜索。
11、采用图形界面;
三、实验内容
选择一个调度算法,实现处理机调度。
1、设计一个按优先权调度算法实现处理机调度的程序;
2、设计按时间片轮转实现处理机调度的程序。
3、主存储器空间的分配和回收。
在可变分区管理方式下,采用最先适应算法实现主存空间的分配和回收。
四、实验原理
该模拟系统采用java语言实现,要实现的功能有新建进程、进程调度、挂起进程、解挂进程、删除进程,道数和时间片大小可以由用户自己调整,有两种调度策略:
按优先权调度和按时间片轮转调度。
每个进程可能有5种状态:
新建(new)、就绪(ready)、运行(running)、阻塞(waiting)、挂起(suspend)。
每个状态都有一个队列用来存放处于该状态的进程,不同的调度策略采用不同的队列实现。
当创建进程时,如果内存中的进程数还没达到规定道数,则将新建进程插入就绪队列,如果内存中进程数已经达到规定道数,则插到后备队列,后备队列中的进程的状态为new。
CPU每次调度时都从就绪队列中取进程,在进程执行过程中如果下一个操作时IO操作,则将进程插入到waiting队列。
在系统运行过程中可以执行进程挂起操作,但执行的挂起操作时系统自动暂停运行,在弹出窗口选择要挂起的进程后,将选中的进程从原来的队列中删除并插入到挂起队列。
进行解挂操作时将选中的进程从挂起队列中删除并插入该进程原来所处的队列。
按优先级调度:
当选择按优先权调度时,所有队列都采用优先队列,优先队列采用一个有序链表实现,进程的优先权值越大代表优先级越高,优先队列中的进程按优先权从大到小排列,当新进程插入时根据该进程的优先权插入到队列中的合适位置,插入后保持队列按优先权从大到小排列,如果新进程与队列中某个进程优先权值相等,则该新进程插到那个进程后面,以遵循先来先服务的规则。
当要从队列中取出进程时总是取队列中第一个进程,因为该进程的优先级最高。
按时间片轮转调度:
当选择按时间片轮转调度时,所有队列都采用先进先出队列,先进先出队列采用一个普通单向链表实现,当新进程插入时插入到队列的末尾,当要取进程时取队首进程,这样就实现了先进先出。
内存管理
该实验基于实验一完成,核心是内存的分配和回收,在实验一的基础上增加内存管理部分,在新建进程的时候增加一个输入内存大小的输入框,在进程进入内存时要分配内存,在进程销毁时要回收内存,如果进入内存时内存不足,则将进程插入到后备队列等待下次调度。
系统维护一个内存表,每个表项代表一个空间,每个空间保存了该空间的起始地址和空间大小以及空间使用状态。
初始时只有一个空间,当CPU启动时要分配内存,内存分配采用最先适应算法。
回收内存时如果有相邻空闲空间,则要进行空闲空间合并。
}
}
五、源代码及截图:
:
publicclassdivDTO
{
privateintdivBase;
privateintlength;
privateintdivFlag;
publicdivDTO(intdivBase,intlength,intdivFlag)
{
=divBase;
=divFlag;
=length;
publicdivDTO()
publicvoidsetDivBase(intbase)
=base;
publicintgetDivBase()
return;
publicvoidsetLength(intlength)
publicintgetLength()
publicvoidsetDivFlag(intflag)
=flag;
publicintgetDivFalg()
publicclassPcbDTO
staticfinalintRunning=1;
staticfinalintReady=2;
staticfinalintWaiting=3;
privateStringprocessName;
privateintrunTime;
privateintprority;
privateintprocessState;
privateintbase;
privateintlimit;
privateintpcbFlag;
publicPcbDTO(Stringname,inttime,intpro,intbase,intlimit)
=name;
=time;
=pro;
=0;
=limit;
publicPcbDTO()
{=0;
publicvoidsetProcessName(Stringname)
publicStringgetProcessName()
returnprocessName;
publicvoidsetRunTime(inttime)
publicintgetRunTime()
publicvoidsetPrority(intprority)
=prority;
publicintgetPrority()
publicvoidsetProcessState(intstate)
=state;
publicStringgetProcessState()
Strings=newString();
if==1)
{
s="
running"
;
}
elseif==2)
ready"
elseif==3)
waiting"
returns;
publicintgetBase()
publicvoidsetBase(intbase)
publicvoidsetLimit(intlimit)
publicintgetLimit()
3.import.*;
import.*;
importclassMainFrame{
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=();
(null);
etDivFlag(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);
dd(runningTable);
().add(readyTable);
().add(divTable);
().add(allocTable);
etProcessState().equals(
"
)){
max=j;
break;
}
j=(j+1)%6;
}
for(intj=first;
j%6!
=end;
){
if(!
readyDtoArray[j].getProcessState().equals(
if(readyDtoArray[j].getPrority()>
readyDtoArray[max]
.getPrority()){
max=j;
}
if(max>
=0){
a=readyDtoArray[max];
readyDtoArray[max]=readyDtoArray[first];
readyDtoArray[first]=a;
(
readyDtoArray[max].getProcessName(),max,0);
(readyDtoArray[max].getRunTime(),
max,1);
(readyDtoArray[max].getPrority(),
max,2);
readyDtoArray[max].getProcessState(),max,3);
("
"
first,0);
first,1);
first,2);
first,3);
(),0,0);
(),0,1);
(),0,2);
readyDtoArray[first].setRunTime(readyDtoArray[first]
.getRunTime()-1);
if(0!
=readyDtoArray[first].getPrority()){
readyDtoArray[first]
.setPrority(readyDtoArray[first]
.getPrority()-1);
first=(first+1)%6;
}else{
"
cpu等待中……"
}else{
/*
*try{(2000);
}catch(InterruptedException
*e1){}
*/
etBase()>
=()){
newSort[i]=newSort[i+1];
point--;
etBase()),i,0);
allocTable
.setValueAt(newSort[i]
.getLimit()),i,1);
(newSort[i].getProcessName(),
i,2);
point,0);
point,1);
point,2);
etDivFalg()==1){
memoryEnd=divDtoArray[i].getDivBase()
+divDtoArray[i].getLength();
if(memoryEnd==()){
up=i;
}
if(divDtoArray[i].getDivBase()==()+a
.getLimit())){
down=i;
if(up>
=0&
&
down>
divDtoArray[up]
.setLength((divDtoArray[up].getLength()
+()+divDtoArray[down]
.getLength()));
divDtoArray[down].setDivFlag(0);
for(inti=(down+1);
i<
20;
i++){
if(divDtoArray[i].getDivFalg()==1){
divDtoArray[i-1]
.setDivBase(divDtoArray[i]
.getDivBase());
divDtoArray[i-1].setDivFlag
(1);
divDtoArray[i-1].setLength(divDtoArray[i]
.getLength());
divDtoArray[i].setDivFlag(0);
}else{
("
i-1,0);
i-1,1);
i-1,2);
break;
}elseif(up>
down<
0){
divDtoArray[up].setLength((divDtoArray[up]
.getLength()+()));
}elseif(up<
0&
divDtoArray[down].setLength((divDtoArray[down]
divDtoArray[down].setDivBase());
for(inti=0;
if(divDtoArray[i].getDivBase()>
()
||divDtoArray[i].getDivFalg()==0){
location=i;
for(inti=20;
i>
location;
i--){
if(divDtoArray[i-1].getDivFalg()==1){
divDtoArray[i]
.setDivBase(divDtoArray[i-1]
divDtoArray[i].setDivFlag
(1);
divDtoArray[i].setLength(divDtoArray[i-1]
divDtoArray[location].setDivBase());
divDtoArray[location].setDivFlag
(1);
divDtoArray[location].setLength());
(String
.valueOf(divDtoArray[i].getDivBase()),
i,0);
.valueOf(divDtoArray[i].getLength()),
i,1);
.valueOf(divDtoArray[i].getDivFalg()),
i,2);
()){
intrunLength=0;
PcbDTOjobToReady=(PcbDTO)jobDtoVector
.elementAt(0);
if(divDtoArray[i].getLength()>
=jobToReady
.getLimit()){
runAllocFlag=i;
break;
}
if(runAllocFlag>