先进先出算法实验报告Word下载.docx
《先进先出算法实验报告Word下载.docx》由会员分享,可在线阅读,更多相关《先进先出算法实验报告Word下载.docx(15页珍藏版)》请在冰豆网上搜索。
二、学生可在下列14个题目中任选1个。
(1)先来先服务调度算法、短作业优先调度算法、时间片轮转调度
算法、优先级调度算法
(2)生产者-消费者问题、读者-写者问题
(3)最先适应算法、最佳适应算法、最坏适应算法
(4)先进先出算法、最久未使用淘汰算法、理想淘汰算法(5)银行家算法
(6)进程通信
(7)小型文件系统
三、模拟实现算法在Windows平台下,可用C语言、C++语言和Java语言等。
I
摘要
本文围绕Java编程,按照进程进入就绪队列的先后次序来分配处理器,对先进先出程序进行需求分析、概要设计、详细设计,最后使用Java编程实现的全过程。
关键词:
操作系统先进先出算法java语言
II
一、设计题目.............................................................................................................................
二、设计内容.............................................................................................................................
三、设计过程.............................................................................................................................
3.1需求分析.......................................................................................................................
3.2概要设计.......................................................................................................................
3.3详细设计.......................................................................................................................
3.4代码实现.......................................................................................................................
3.5程序运行.......................................................................................................................
四、总结.....................................................................................................................................
五、参考文献.............................................................................................................................
III
一、设计题目
《先来先服务调度算法》。
二、设计内容
1、综合应用下列知识点设计并实现操作系统的进程调度:
先进先出,进程控制块,进程状态转换,多级反馈队列进程调度算法。
2、加深理解操作系统进程调度的过程。
3、加深理解先进先出调度算法。
4、由于在单道批处理系统中,作业一投入运行,它就占有计算机的一切资源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所占用的CPU时限等因素。
5、作业调度算法:
采用先来先服务(FCFS)调度算法,即按作业提交的先后次序进行调度。
6、总是首先调度在系统中等待时间最长的作业。
每个作业由一个作业控制块JCB表示,JCB可以包含如下信息:
作业名、提交时间、所需的运行时间、所需的资源、作业状态、链指针等等。
7、作业的状态可以是等待W(Wait)、运行R(Run)和完成F(Finish)三种状态之一。
每个作业的最初状态总是等待W。
8、各个等待的作业按照提交时刻的先后次序排队,总是首先调度等待队列中队首的作业。
9、每个作业完成后要打印该作业的开始运行时刻、完成时刻、周转时间和带权周转时间,这一组作业完成后
10、要计算并打印这组作业的平均周转时间、带权平均周转时间。
三、设计过程
3.1需求分析
1.由于在单道批处理系统中,作业一投入运行,它就占有计算机的一切资源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所占用的CPU时限等因素。
2.每个作业由一个作业控制块JCB表示,JCB可以包含如下信息:
作业的状态可以是等待W(Wait)、运行R(Run)和完成F(Finish)三种状态之一。
例如,三个作业同时到达系统并立即进入调度:
作业名所需CPU时间
作业128
作业29
作业33
1
采用FCFS算法,三个作业的周转时间分别为:
28、37和40,因此,平均作业周转时间T=(28+37+40)/3=35
若三个作业提交顺序改为作业2、1、3,平均作业周转时间约为29。
((9+37+40)/329)
若三个作业提交顺序改为作业3、2、1,平均作业周转时间约为18。
((3+12+40)/318)
FCFS调度算法的平均作业周转时间与作业提交的顺序有关。
3.2概要设计
设计、编写一个进程调度程序,允许多个进程共同运行的进程调度程序。
(1)进程调度算法:
采用先进先出算法
(2)每个进程有一个进程控制块(PCB)表示。
进程控制块可以包含如下信息:
进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等。
(3)进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。
进程的到达时间为输入进程的时间。
(4)进程的运行时间以时间片为单位进行计算。
(5)进程状态及状态转换。
1)每个进程的状态可以是就绪W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一;
2)就绪进程获得CPU后都只能运行一个时间片。
用已占用CPU时间加1来表示;
3)如果运行一个时间片后,进程的已占用CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,然后把它插入就绪队列等待CPU;
4)每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的PCB,以便进行检查;
5)重复以上过程,直到所要进程都完成为止。
(6)进程的到达时间为输入进程时间,进程的运行时间以时间片的计算单位计算。
(7)每一个进程的状态可以使就绪W(wait),运行R(Run)或完成F(Fish)三种状态之一
(8)建立一个类PCB控制进程
建立一个类TestFrame测试进程
建立一个类List__Test管理进程
建立一个类Main写主函数
主流程图:
开始
调用初始化子程序
调用运行子程序
结束2
3.3详细设计
设定系统中有n个进程,每一个进程用一个进程控制块(PCB)表示,进程队列采用链表数据结构。
进程控制块包含如下信息:
进程名、优先数、需要运行时间、已用CPU时间、进程状态等等。
每次运行设计的处理调度程序之前,由终端输入n个进程的“优先数”和“要求运行时间”。
进程的优先数及需要的运行时间人为地指定.进程的运行时间以时间片为单位进行计算。
采用优先权调度算法,将五个进程按给定的优先数从大到小连成就绪队列。
用头指针指出队列首进程,队列采用链表结构。
处理机调度总是选队列首进程运行。
采用动态优先数办法,进程每运行一次将已运行时间加“1”。
进程运行一次后,若要求运行时间不等于已运行时间,则再将它加入就绪队列;
否则将其状态置为“结束”,且退出就绪队列。
,7步骤,直到所有进程都成为“结束”“就绪”状态的进程队列不为空,则重复上面6
状态。
在计的程序中有输入语句,输入n个进程的“优先数”和“要求运行时间”,也有显示或打印语句,能显示或打印每次被选中进程的进程名、运行一次后队列的变化,以及结束进程的进程名。
最后,为n个进程任意确定一组“优先数”和“要求运行时间”,运行并调试所设计的程序,显示或打印出逐次被选中进程的进程名及其进程控制块的动态变化过程。
:
程序说明:
在先来先服务算法中,按作业提交的先后次序进行调度。
程序中使用的数据结构及符号说明:
#definenum5//假定系统中进程个数为5
structPCB{
charID;
//进程名
intruntime;
//要求运行时间
charstate;
//状态,R-就绪,F-结束
};
structPCBpcblist[num];
//定义进程控制块数组
3
流程图:
3.4代码实现
经过前面的工作,最后在集成编辑环境中,编写的程序代码如下:
{publicclassFCFSextendsJFrameimplementsActionListener
VectorworkVector;
intstatus[]={0,0,0,0,0};
Stringworkname[]={"
作业名"
"
提交时刻"
要求运行时间"
运行时刻"
完成时
刻"
周转时间"
带权周转时间"
Stringworktable[][]=newString[5][7];
JTableworkjtable;
JScrollPanemessageScrollPane;
4
JToolBartoolBar=newJToolBar();
JButtonInputButton;
JButtonFCFSButton;
JButtonexitButton;
JTextFieldshow;
JTextAreasource;
publicvoidactionPerformed(ActionEvente)
{
Objectobj=e.getSource();
if(obj==InputButton)
Stringstringnum;
Workwork=newWork();
stringnum=JOptionPane.showInputDialog(this,"
作业名、提交时刻、要求运行时间"
).trim();
StringTokenizerst0=newStringTokenizer(stringnum);
System.out.println(stringnum);
if(st0.hasMoreTokens())
work.workname=(String)st0.nextToken();
source.append("
作业:
"
+work.workname);
}
work.refertime=Double.valueOf(st0.nextToken()).doubleValue();
提交时间为:
+work.refertime);
work.needtime=Double.valueOf(st0.nextToken()).doubleValue();
要求运行时间为:
+work.needtime);
\n"
);
workVector.add(work);
if(obj==FCFSButton)
for(inta=0;
a<
5;
a++)
status[a]=0;
inti=0;
doubleminrefertime,finishtime=0,T=0,sunT=0,sunW=0,W=0;
Workwork1=newWork();
5
黑龙江外国语学院2011-2012学年第1学期Term12011-2012AcademicYearHeilongjiangInternationalUniversity
Workwork2=newWork();
Stringmsg;
while(i<
workVector.size())
if(status[i]==0)
work=(Work)workVector.elementAt(i);
worktable[i][0]=String.valueOf(work.workname);
worktable[i][1]=String.valueOf(work.refertime);
worktable[i][2]=String.valueOf(work.needtime);
minrefertime=work.refertime;
intj=0,k=i;
while(j<
workVector.size())//找出最先到达的进程
work1=(Work)workVector.elementAt(j);
//指定索引处
if(minrefertime>
work1.refertime&
&
status[j]==0)
minrefertime=work1.refertime;
k=j;
j++;
T=sunT/i;
W=sunW/i;
msg="
平均周转时间T="
+T+"
时间单位"
+"
平均带权周转时间W="
+W;
workjtable=newJTable(worktable,workname);
show=newJTextField(30);
show.setText(msg);
messageScrollPane=newJScrollPane(workjtable,
JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
messageScrollPane.setPreferredSize(newDimension(400,101));
messageScrollPane.revalidate();
JFrameframe=newJFrame();
frame.setSize(400,180);
frame.setLocation(200,300);
frame.setTitle("
FCFS的作业调度"
frame.setLayout(newBorderLayout());
frame.add(messageScrollPane,BorderLayout.NORTH);
frame.add(show,BorderLayout.CENTER);
frame.setVisible(true);
if(obj==exitButton)
intj=JOptionPane.showConfirmDialog(this,"
真的要停止服务吗"
停
止服务"
JOptionPane.YES_OPTION,JOptionPane.QUESTION_MESSAGE);
6
if(j==JOptionPane.YES_OPTION)
System.exit(0);
publicstaticvoidmain(Stringarg[])
FCFSFCFS1=newFCFS();
classWork
Stringworkname=null;
doublerefertime=0;
doubleneedtime=0;
doublestarttime=0;
doublefinishtime=0;
doublealltime=0;
doubleratealltime=0;
3.5程序运行
测试用例:
屏幕显示:
请输入进程个数
输入:
4<
回车>
请输入进程名称(字母)提交时刻运行时间输入:
进程1:
A110
进程2:
B220
进程3:
C330
进程4:
D440
<
已经输入完毕.您刚才输入的内容如下:
进程名称提交时刻运行时间
A25
B34
C12
D43经代码演示得:
7
程序运行
输入第一个进程
输入结果
8
输入一组进程
输出结果
9
四、总结
通过本次实验加深了我对进程调度功能的认识,并且更加深刻的理解了操作系统中进程调度的基本原理
由运行的界面可以看出,本课程设计基本实现了先进先出算法,通过输入生成的数目,达到先进先出算法的最后目的。
以前真的没有认真的学习过,即使是在听课,可是后来却没有对学习中出现的问题而仔细分析过。
得过且过,迷失了我前进的方向,而现在却又重新敞开了。
不论是以后的学习还是工作,我想这都是很重要的,我们需要不断进步的动力。
总的说来知识上的收获很是重要,精神上的丰收也是更加可喜的,让我知道了学无止境的道理。
我们每一个人永远不能满足于现有的成就,人生就像在爬山,一座山峰的后面还有更高的山峰在等着你。
挫折是一份财富,经历是一份拥有。
这次课程设计必将成为我人生旅途上一个非常美好的回忆
在做这个课程设计之前,对先进先出这个算法并不是很理解,但是通过同学们之