先进先出算法实验报告
先进先出算法实验报告
(COVER)
评阅结果 Final mark
评阅人
Examiner
课程名称(Subject): 操作系统课程设计
编号 (No.):
系别 (Department):
专业 (Major):
姓名 (Name):
学号(Student’s Number):
注意事项,Notes,
1.考生需将上述有关项目填写清楚
2.字迹要清楚,保持卷面清洁。
3.交卷时请将本答卷和题签一起上交,题签作为封面下一页装订。
1、Candidates should fill in the information appropriately.
2、Keep the handwriting clear and the paper tidy.
3、Candidate
should hand in this cover and paper together; the answer sheet should be attached to the cover.
黑龙江外国语学院 2011-2012学年第1学期
Term 1 2011-2012 Academic Year Heilongjiang International University 机密(Confidential) 编号(No.): 11-12-1-050154
试题(Test)
课程名称(Subject):操作系统课程设计考核类别(Type of test):考查课程类别(Type of course) : 实践环节考试形式(Test type) : 论文使用范围(Target group): 计算机科学与技术要求:
一、通过本课程设计,使学生在上机实验中体会计算机操作系统的基本原理,训练学生模拟实现操作系统管理和控制资源的能力。二、学生可在下列14个题目中任选1个。
(1)先来先服务调度算法、短作业优先调度算法、时间片轮转调度
算法、优先级调度算法
(2)生产者-消费者问题、读者-写者问题
(3)最先适应算法、最佳适应算法、最坏适应算法
(4)先进先出算法、最久未使用淘汰算法、理想淘汰算法 (5)银行家算法
(6)进程通信
(7)小型文件系统
三、模拟实现算法在Windows平台下,可用C语言、C++语言和Java语言等。
I
黑龙江外国语学院 2011-2012学年第1学期
Term 1 2011-2012 Academic Year Heilongjiang International University 摘要
本文围绕Java编程,按照进程进入就绪队列的先后次序来分配处理器,对先
进先出程序进行需求分析、概要设计、详细设计,最后使用Java编程实现的全过程。
关键词:操作系统先进先出算法 java语言
II
黑龙江外国语学院 2011-2012学年第1学期
Term 1 2011-2012 Academic Year Heilongjiang International University 目录
一、设计题
目 ..................................................................... ........................................................
二、设计内
容 ..................................................................... ........................................................
三、设计过
程 ..................................................................... ........................................................
3.1需求分
析 ..................................................................... ..................................................
3.2概要设
计 ..................................................................... ..................................................
3.3详细设
计 ..................................................................... ..................................................
3.4代码实
现 ..................................................................... ..................................................
3.5程序运
行 ..................................................................... ..................................................
四、总结...................................................................... ...............................................................
五、参考文
献 ..................................................................... ........................................................
III
黑龙江外国语学院 2011-2012学年第1学期
Term 1 2011-2012 Academic Year Heilongjiang International University
一、设计题目
《先来先服务调度算法》。
二、设计内容
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)三种状态之一。每个作业的最初状态总是等待W。例如,三个作业同时到达系统并立即进入调度:作业名所需CPU时间
作业1 28
作业2 9
作业3 3
1
黑龙江外国语学院 2011-2012学年第1学期
Term 1 2011-2012 Academic Year Heilongjiang International University 采用FCFS算法,三个作业的周转时间分别为:28、37和40,因此,平均作业
周转时间T = (28+37+40)/3 = 35
若三个作业提交顺序改为作业2、1、3,平均作业周转时间约为29。
((9+37+40)/3 29)
若三个作业提交顺序改为作业3、2、1,平均作业周转时间约为18。
((3+12+40)/3 18)
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
黑龙江外国语学院 2011-2012学年第1学期
Term 1 2011-2012 Academic Year Heilongjiang International University
3.3详细设计
设定系统中有n个进程,每一个进程用一个进程控制块( PCB)表示,进程队列采用链表数据结构。
进程控制块包含如下信息:进程名、优先数、需要运行时间、已用CPU时间、
进程状态等等。
每次运行设计的处理调度程序之前,由终端输入n个进程的“优先数”和“要求运行时间”。
进程的优先数及需要的运行时间人为地指定.进程的运行时间以时间片为单位
进行计算。
采用优先权调度算法,将五个进程按给定的优先数从大到小连成就绪队列。用头指针指出队列首进程,队列采用链表结构。
处理机调度总是选队列首进程运行。采用动态优先数办法,进程每运行一次将已运行时间加“1”。
进程运行一次后,若要求运行时间不等于已运行时间,则再将它加入就绪队列;否则将其状态置为“结束”,且退出就绪队列。
,7步骤,直到所有进程都成为“结束”“就绪”状态的进程队列不为空,则
重复上面6
状态。
在计的程序中有输入语句,输入n个进程的“优先数”和“要求运行时间”,也有显示或打印语句,能显示或打印每次被选中进程的进程名、运行一次后队列的变化,以及结束进程的进程名。
最后,为n个进程任意确定一组“优先数”和“要求运行时间”,运行并调试所设计的程序,显示或打印出逐次被选中进程的进程名及其进程控制块的动态变化过程。:
程序说明:
在先来先服务算法中,按作业提交的先后次序进行调度。
程序中使用的数据结构及符号说明:
#define num 5//假定系统中进程个数为5
struct PCB{
char ID; //进程名
int runtime;//要求运行时间
char state; //状态,R-就绪,F-结束
};
struct PCB pcblist[num];//定义进程控制块数组
3
黑龙江外国语学院 2011-2012学年第1学期
Term 1 2011-2012 Academic Year Heilongjiang International University 流程图:
3.4代码实现
经过前面的工作,最后在集成编辑环境中,编写的程序代码如下:
{ public class FCFS extends JFrame implements ActionListener
Vector workVector;
int status[]={0,0,0,0,0};
String workname[]={"作业名","提交时刻","要求运行时间","运行时刻","完成时
刻","周转时间","带权周转时间"};
String worktable[][]=new String[5][7];
JTable workjtable;
JScrollPane messageScrollPane;
4
黑龙江外国语学院 2011-2012学年第1学期
Term 1 2011-2012 Academic Year Heilongjiang International University JToolBar toolBar = new JToolBar();
JButton InputButton;
JButton FCFSButton;
JButton exitButton;
JTextField show;
JTextArea source;
public void actionPerformed(ActionEvent e)
{
Object obj = e.getSource();
if (obj ==InputButton)
{
String stringnum;
Work work=new Work();
stringnum=JOptionPane.showInputDialog(this,"作业名、提交时刻、要求运行时间").trim();
StringTokenizer st0 = new StringTokenizer(stringnum);
System.out.println(stringnum);
if(st0.hasMoreTokens())
{
work.workname=(String)st0.nextToken();
source.append("作业: "+work.workname);
}
if(st0.hasMoreTokens())
{
work.refertime=Double.valueOf(st0.nextToken()).doubleValue();
source.append("提交时间为: "+work.refertime);
}
if(st0.hasMoreTokens())
{
work.needtime=Double.valueOf(st0.nextToken()).doubleValue();
source.append("要求运行时间为: "+work.needtime);
}
source.append("\n");
workVector.add(work);
}
if ( obj == FCFSButton)
{
for(int a=0;a<5;a++)
{
status[a]=0;
}
int i=0;
double minrefertime,finishtime=0,T=0,sunT=0,sunW=0,W=0;
Work work=new Work();
Work work1=new Work();
5
黑龙江外国语学院 2011-2012学年第1学期 Term 1 2011-2012 Academic Year Heilongjiang International University
Work work2=new Work();
String msg;
while(i { 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; int j=0,k=i; while(j { 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=new JTable(worktable,workname); show=new JTextField(30); show.setText(msg); messageScrollPane = new JScrollPane(workjtable, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); messageScrollPane.setPreferredSize(new Dimension(400, 101)); messageScrollPane.revalidate(); JFrame frame=new JFrame(); frame.setSize(400,180); frame.setLocation(200,300); frame.setTitle("FCFS的作业调度"); frame.setLayout(new BorderLayout()); frame.add(messageScrollPane,BorderLayout.NORTH); frame.add(show,BorderLayout.CENTER); frame.setVisible(true); } if ( obj == exitButton) { int j=JOptionPane.showConfirmDialog(this,"真的要停止服务吗","停 止服务",JOptionPane.YES_OPTION,JOptionPane.QUESTION_MESSAGE); 6 黑龙江外国语学院 2011-2012学年第1学期 Term 1 2011-2012 Academic Year Heilongjiang International University if(j==JOptionPane.YES_OPTION) { System.exit(0); } } } public static void main(String arg[]) { FCFS FCFS1=new FCFS(); } class Work { String workname=null; double refertime=0; double needtime=0; double starttime=0; double finishtime=0; double alltime=0; double ratealltime=0; } } 3.5程序运行 测试用例: 屏幕显示:请输入进程个数 输入:4 <回车> 屏幕显示:请输入进程名称(字母) 提交时刻运行时间输入:进程1:A 1 10 进程2:B 2 20 进程3:C 3 30 进程4:D 4 40 <回车> 已经输入完毕.您刚才输入的内容如下: 进程名称提交时刻运行时间 A 2 5 B 3 4 C 1 2 D 4 3 经代码演示得: 7 黑龙江外国语学院 2011-2012学年第1学期 Term 1 2011-2012 Academic Year Heilongjiang International University 程序运行 输入第一个进程 输入结果 8 黑龙江外国语学院 2011-2012学年第1学期 Term 1 2011-2012 Academic Year Heilongjiang International University 输入一组进程 输出结果 9 黑龙江外国语学院 2011-2012学年第1学期 Term 1 2011-2012 Academic Year Heilongjiang International University 四、总结 通过本次实验加深了我对进程调度功能的认识,并且更加深刻的理解了操作系统中进程调度的基本原理 由运行的界面可以看出,本课程设计基本实现了先进先出算法,通过输入生成的数目,达到先进先出算法的最后目的。 以前真的没有认真的学习过,即使是在听课,可是后来却没有对学习中出现的问题而仔细分析过。得过且过,迷失了我前进的方向,而现在却又重新敞开了。不论是以后的学习还是工作,我想这都是很重要的,我们需要不断进步的动力。 总的说来知识上的收获很是重要,精神上的丰收也是更加可喜的,让我知道了学无止境的道理。我们每一个人永远不能满足于现有的成就,人生就像在爬山,一座山峰的后面还有更高的山峰在等着你。挫折是一份财富,经历是一份拥有。这次课程设计必将成为我人生旅途上一个非常美好的回忆 在做这个课程设计之前,对先进先出这个算法并不是很理解,但是通过同学们之间的相互交流,还有就是从网上搜索了很多相关资料,做这个程序的过程中让我对各种调度算法从初步了解到了一定的理解,基本已经可以运用其进行编程了,也 从许多java实例中,学习java软件对相关题材的编程思想和基本方法,并且对java程序语言的应用又掌握的深刻了一些。 五、参考文献 [1] java 编程思想 Bruce Eckel [2] java面向对象编程张卫琴 [3]Windows操作系统原理 [M],机械工业出版社2004年版。 10