操作系统课程 实验报告完整版.docx

上传人:b****8 文档编号:12679148 上传时间:2023-06-07 格式:DOCX 页数:38 大小:261.27KB
下载 相关 举报
操作系统课程 实验报告完整版.docx_第1页
第1页 / 共38页
操作系统课程 实验报告完整版.docx_第2页
第2页 / 共38页
操作系统课程 实验报告完整版.docx_第3页
第3页 / 共38页
操作系统课程 实验报告完整版.docx_第4页
第4页 / 共38页
操作系统课程 实验报告完整版.docx_第5页
第5页 / 共38页
操作系统课程 实验报告完整版.docx_第6页
第6页 / 共38页
操作系统课程 实验报告完整版.docx_第7页
第7页 / 共38页
操作系统课程 实验报告完整版.docx_第8页
第8页 / 共38页
操作系统课程 实验报告完整版.docx_第9页
第9页 / 共38页
操作系统课程 实验报告完整版.docx_第10页
第10页 / 共38页
操作系统课程 实验报告完整版.docx_第11页
第11页 / 共38页
操作系统课程 实验报告完整版.docx_第12页
第12页 / 共38页
操作系统课程 实验报告完整版.docx_第13页
第13页 / 共38页
操作系统课程 实验报告完整版.docx_第14页
第14页 / 共38页
操作系统课程 实验报告完整版.docx_第15页
第15页 / 共38页
操作系统课程 实验报告完整版.docx_第16页
第16页 / 共38页
操作系统课程 实验报告完整版.docx_第17页
第17页 / 共38页
操作系统课程 实验报告完整版.docx_第18页
第18页 / 共38页
操作系统课程 实验报告完整版.docx_第19页
第19页 / 共38页
操作系统课程 实验报告完整版.docx_第20页
第20页 / 共38页
亲,该文档总共38页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

操作系统课程 实验报告完整版.docx

《操作系统课程 实验报告完整版.docx》由会员分享,可在线阅读,更多相关《操作系统课程 实验报告完整版.docx(38页珍藏版)》请在冰点文库上搜索。

操作系统课程 实验报告完整版.docx

操作系统课程实验报告完整版

中南大学

《操作系统》实验报告

 

姓名:

孙福星

专业班级:

软件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(

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2