操作系统实施报告.docx
《操作系统实施报告.docx》由会员分享,可在线阅读,更多相关《操作系统实施报告.docx(18页珍藏版)》请在冰豆网上搜索。
操作系统实施报告
操作系统实验报告
学院计算机学院
操作系统课程设计任务书
学生姓名
专业班级
学号
题目
进程调度
指导教师
题目编号
2013秋-06
主要内容
本课程设计要求编程进程调度的四个算法。
通过具体的进程调度算法的实现,加深对进程调度算法实现过程的理解。
任务要求
进程调度是低级调度,它的主要功能是根据一定的算法将CPU分派给就绪队列中的一个进程。
1.假设一个系统中有5个进程,它们的到达时间和服务时间如下表所示,忽略I/O以及其他开销时间。
进程到达时间服务时间
A03
B26
C44
D65
E82
2.分别实现按照先来先服务(FCFS)、非抢占及抢占的短进程优先(SPF)、高响应比优先(HRRN)以及时间片轮转(RR、时间片=1)调度算法进行CPU调度。
3.分别在不同算法控制下运行设计的程序,给出各进程的完成时间、周转时间、带权周转时间和平均带权周转时间。
(计算到小数点后两位)
4.选用程序设计语言:
java
5.开发软件:
eclipse
6.开发平台:
windows732位系统
参考文献
[1]计算机操作系统,汤小丹等,西安电子科技大学出版社
[2]操作系统实验指导书,傅秀芬,广东工业大学(自编)
[3]计算机操作系统教程(第二版),张尧学、史美林,清华大学出版社
[4]现代操作系统,A.S.Tanenbaum著,陈向群等译机械工业出版社
[5]java技术及其应用李卫华编著
[6]java语言程序设计(第三版)邹丽萍张后杨编著
审查意见
指导教师签字:
系主任签字:
年月日
说明:
本表由指导教师填写,由系主任审核后下达给选题学生,装订在设计(论文)首页
一.设计要求:
根据5个算法的具体含义,实现进程调度。
下面是5个算法的具体含义:
1.FCFS算法
FCFS算法是最简单的算法,每次调度是从就绪的进程队列中,选择一个最先进入该队列的进程,为之位置分配处理机,使之运行。
(1)先对各进程的提交顺序进行升序排列,选择最先提交的进程开始运行。
(2)对已运行结束的进程结束时间与下一个提交的进程时间比较,若大于下一个进程的提交时间,则下一个进程的开始运行时间就是上一个进程的结束时间,否则,下一个进程的开始运行时间就是自己的提交时间。
(3)依次向后运行。
2.SJF算法(非抢占式)
SJF算法是以作业的长短来计算优先级,作业越短优先级越高。
作业长短用所要求的运行时间来衡量。
(2)对已运行结束的进程结束时间与下一个提交的进程时间比较,若大于下一个进程的提交时间,则下一个进程的开始运行时间就是上一个进程的结束时间,再次对刚运行结束的进程的结束时间与下一个提交的进程时间进行比较;
若已运行结束的进程结束时间小于下一个提交的进程时间,则再找到刚刚运行结束的进程结束时间大于余下的的进程提交时间,在这两个进程之间对运行时间升序排列,找到运行时间最短的,开始投入运行。
然后对余下的进程的提交时间排序,按此操作循环进行。
3.SJF算法(抢占式)
非抢占式短作业优先算法与非抢占式法不同的地方是:
当有一些进程一个进入,比较这些进程的服务时间,包括正在运行的进程,如果正在运行得进程剩下所需的服务时间多于其他已经进入的进程服务时间,那么,就必须让出cpu,让服务时间最短的进程先运行。
随着时间的递增,按照上面的方式来运行,这就是抢占式SJF算法。
4.时间片轮转调度算法
时间片轮转法表示的是系统在给定的时间内,响应所有用户的要求。
(1)将所有进程按先来先服务的原则,排成一个队列,每次调度时,把CPU分配给队首进程,并令其执行一个时间片。
(2)执行时间片用完时,由一个计时器发出时钟中断请求,调度程序据此信号来停止该进程的执行,并把他送往就绪队列的末尾。
(3)把处理机分配给就绪队列中新的队首进程,同时也让他执行一个时间片。
这样就可以保证就绪队列中的所有进程在给定的时间内,均获得一时间片的处理执行时间。
5.高响应比优先调度算法
该算法综合考虑到先来先服务和短作业优先算法的优缺点,改善了处理机调度的性能。
从而引入了优先权,优先权越高,先运行。
优先权=(当前时间-提交时间)/运行时间+1
当前时间是刚刚运行的进程的结束时间,提交时间是准备运行的进程的提交时间。
(2)对已运行结束的进程结束时间与下一个提交的进程时间比较,若大于下一个进程的提交时间,则比较剩下的进程的优先权,优先权越大则先运行。
下一个进程的开始运行时间就是上一个进程的结束时间,再次对刚运行结束的进程的结束时间与下一个提交的进程时间进行比较;然后对余下的进程的提交时间排序,按此操作循环进行。
若已运行结束的进程结束时间小于下一个提交的进程时间,则找到最先提交的进程投入运行,再次比较优先权。
二.设计思想流程
三.设计所涉及的主要数据结构
1.二维数组a[][],一维数组resultMap[5],ArrayList[5]
a[i][j]中j表示一个进程,a[i][j]中的j表示每个进程的信息列
四.程序清单(核心代码)
(1)先来先服务核心代码
if(e.getSource()==brun)//点击运行触发的事件
{
if(bfcfs.isSelected())//------先来先服务
Util.createTabelData2(a,table);
for(r=0;r<5;r++)
try
if(r==0)//第一行特殊处理
arriveTime=Integer.parseInt(a[0][1]);
serviceTime=Integer.parseInt(a[0][2]);
endTime=arriveTime+serviceTime;
a[0][3]=a[0][1];
a[0][4]=String.valueOf(endTime);
a[0][5]=String.valueOf(serviceTime);
a[0][6]="1.00";
}
else
arriveTime=Integer.parseInt(a[r][1]);
serviceTime=Integer.parseInt(a[r][2]);
if(arriveTime{a[r][3]=a[r-1][4];//开始时间}else{a[r][3]=a[r][1];//开始时间}endTime=serviceTime+Integer.parseInt(a[r][3]);//结束时间=服务时间+到达时间a[r][4]=String.valueOf(endTime);turnTime=endTime-arriveTime;//周转时间a[r][5]=String.valueOf(turnTime);qTurnTime=Double.parseDouble(a[r][5])/Double.parseDouble(a[r][2]);//带权周转时间a[r][6]=String.valueOf((double)Math.round(qTurnTime*100)/100);}allTurnTime+=Double.parseDouble(a[r][6]);table.setValueAt(""+a[r][3],r,3);//把数据填到表格中table.setValueAt(""+a[r][4],r,4);table.setValueAt(""+a[r][5],r,5);table.setValueAt(""+a[r][6],r,6);}catch(Exceptionex){ex.printStackTrace();JOptionPane.showMessageDialog(null,"输入的进程到达时间和服务时间必须为整数!","提示",JOptionPane.INFORMATION_MESSAGE);}}//endforavgTurnTime=allTurnTime/5;avgTurnTime=(double)Math.round(avgTurnTime*100)/100;resultMap.put("先来先服务平均带权周转时间",avgTurnTime);//平均带权周转时间JOptionPane.showMessageDialog(null,"先来先服务平均周转时间:"+avgTurnTime,"结果",JOptionPane.INFORMATION_MESSAGE);(2)抢占式短作业算法核心代码elseif(bspf1.isSelected())//--------抢占式短作业优先算法{Util.createTabelData2(a,table);for(i=0;i<5;i++)//将开始时间及其后面的数据清空,为了下面的判断做准备{for(j=3;j<7;j++){a[i][j]="";}}intallTime=0,now,r2,index,beginTime3,endTime3,arriveTime3,serviceTime3,turnTime3;DoubleqTurnTime3,avgTurnTime3=0.0;intservice[]=newint[5];//保存服务时间Doublet1;for(i=0;i<5;i++){allTime+=Integer.parseInt(a[i][2]);service[i]=Integer.parseInt(a[i][2]);System.out.println(service[i]);}a[0][3]=a[0][1];//第一个进程先运行一次a[0][2]=String.valueOf(Integer.parseInt(a[0][2])-1);for(now=Integer.parseInt(a[0][1])+1;now<=allTime;now++)//随着时间循环{ArrayListrow2=newArrayList();for(r2=0;r2<5;r2++){if("".equals(a[r2][4])||a[r2][4]==null){if(Integer.parseInt(a[r2][1])<=now)//表示已到达{row2.add(r2);}}}if(row2.size()==0)continue;//最高响应比的下标index=Util.findShortTimeIndex(row2,a);if("".equals(a[index][3])||a[index][3]==null){a[index][3]=String.valueOf(now);//设置开始时间}a[index][2]=String.valueOf(Integer.parseInt(a[index][2])-1);if(Integer.parseInt(a[index][2])==0)//获够了服务的时间{a[index][4]=String.valueOf(now+1);//设置了结束时间continue;}}for(i=0;i<5;i++){endTime3=Integer.parseInt(a[i][4]);beginTime3=Integer.parseInt(a[i][3]);arriveTime3=Integer.parseInt(a[i][1]);turnTime3=endTime3-arriveTime3;qTurnTime3=Double.parseDouble(String.valueOf(turnTime3)/Double.parseDouble(String.valueOf(service[i]));table.setValueAt(a[i][3],i,3);//开始时间table.setValueAt(a[i][4],i,4);//结束时间table.setValueAt(String.valueOf(turnTime3),i,5);table.setValueAt(String.valueOf(qTurnTime3),i,6);}for(i=0;i<5;i++)avgTurnTime3+=Double.parseDouble(a[i][6]);avgTurnTime3/=5;avgTurnTime3=(double)Math.round(avgTurnTime3*100)/100;resultMap.put("短作业(抢占式)平均带权周转时间",avgTurnTime3);//平均带权周转时间JOptionPane.showMessageDialog(null,"短作业优先(抢占式)平均周转时间:"+avgTurnTime3,"结果",JOptionPane.INFORMATION_MESSAGE);}(3)其他算法核心代码省略五.运行结果及其说明(1)刚运行时的界面:(2)点击“随机生成数据”,观看右边的数据,初始化5个进程。(3)选择先来先服务,观看右边的表格,得出各个进程的信息:包括开始时间,结束时间,周转时间,带权周转时间,平均带权周转时间(弹出框)。 (4)再选择“抢占式短作业优先”,观看右边表格数据的变化,结果如下: (5)再选择“非抢占式短作业优先”,观看右边表格数据的变化,结果如下: (6)再选择“高响应比优先”,观看右边的表格数据变化,结果如下: (7)再选择“时间片轮转法(t=1)”,观看右边算法运行得结果,如下图:(8)为了比较各个算法的平均带权周转时间,点击“结果与比较”,结果如下: (9)附带功能:全部清除,点击“全部清除”,右边表格的数据将会被清空,如下图:(10)附带功能:手动添加进程的数据,在界面左上角输入:进程名,到达时间,服务时间,然后再点击“添加”,数据将会被加载到右边的表格中,如下图所示:(11)附加功能:“清空”,清空界面左上角的输入框信息,点击“清空”时,结果如下: (12)校验功能:当没有选择一个算法就点击运行时,会给出提示: (13)校验功能:没有输入完整的信息,给出提示:(14)校验功能:当没有输入数据时,就点击“结果与比较”,给出提示: 六.设计心得(1)在完成课设的过程中,我进一步了解进程调度的5个算法的原理,由于本人是利用java来实现的,在实现5个算法中,遇到很多问题,首先第一个问题就是做界面,由于java不像c#做界面那么的容易,所以,我几乎花了一半甚至超过一半的时间来完成,但是和构想不一样,因为我本来想构建5个表格,每个表格对于一个算法的信息,那样子比较起来就非常的清晰,直观,但是,由于实现起来比较麻烦,特别是布局,由于时间关系,就利用一个表格来实现上面的功能。(2)在实现抢占式短作业的时候,遇到了不少问题,第一个是算开始时间就算错,因为我用的时定长数组,不是每次都存满数组在里面,在遍历的时候就会出现空值比较的情况,会报错;第二就是求动态地球最短服务时间的进程的时候,下标容易出错,一旦出错,后面全部结果都会跟着错。(3)经过这次课程设计,让我懂得完成一个功能时,必须先要明确解答思路,再敲代码,然后运行,更加错误提示找出错误来源,如果分析不出来,就设置断点,进行调式,分析每步流程,每次运行得临时变量值是否正常,从其中找出原因七.参考文献[1]计算机操作系统,汤小丹等,西安电子科技大学出版社[2]操作系统实验指导书,傅秀芬,广东工业大学(自编)[3]计算机操作系统教程(第二版),张尧学、史美林,清华大学出版社[4]现代操作系统,A.S.Tanenbaum著,陈向群等译机械工业出版社[5]java技术及其应用李卫华编著[6]java语言程序设计(第三版)邹丽萍张后杨编著
a[r][3]=a[r-1][4];//开始时间
a[r][3]=a[r][1];//开始时间
endTime=serviceTime+Integer.parseInt(a[r][3]);//结束时间=服务时间+到达时间
a[r][4]=String.valueOf(endTime);
turnTime=endTime-arriveTime;//周转时间
a[r][5]=String.valueOf(turnTime);
qTurnTime=Double.parseDouble(a[r][5])/Double.parseDouble(a[r][2]);//带权周转时间
a[r][6]=String.valueOf((double)Math.round(qTurnTime*100)/100);
allTurnTime+=Double.parseDouble(a[r][6]);
table.setValueAt(""+a[r][3],r,3);//把数据填到表格中
table.setValueAt(""+a[r][4],r,4);
table.setValueAt(""+a[r][5],r,5);
table.setValueAt(""+a[r][6],r,6);
catch(Exceptionex)
ex.printStackTrace();
JOptionPane.showMessageDialog(null,"输入的进程到达时间和服务时间必须为整数!
","提示",JOptionPane.INFORMATION_MESSAGE);
}//endfor
avgTurnTime=allTurnTime/5;
avgTurnTime=(double)Math.round(avgTurnTime*100)/100;
resultMap.put("先来先服务平均带权周转时间",avgTurnTime);//平均带权周转时间
JOptionPane.showMessageDialog(null,"先来先服务平均周转时间:
"+avgTurnTime,"结果",JOptionPane.INFORMATION_MESSAGE);
(2)抢占式短作业算法核心代码
elseif(bspf1.isSelected())//--------抢占式短作业优先算法
for(i=0;i<5;i++)//将开始时间及其后面的数据清空,为了下面的判断做准备
for(j=3;j<7;j++)
a[i][j]="";
intallTime=0,now,r2,index,beginTime3,endTime3,arriveTime3,serviceTime3,turnTime3;
DoubleqTurnTime3,avgTurnTime3=0.0;
intservice[]=newint[5];//保存服务时间
Doublet1;
for(i=0;i<5;i++)
allTime+=Integer.parseInt(a[i][2]);
service[i]=Integer.parseInt(a[i][2]);
System.out.println(service[i]);
a[0][3]=a[0][1];//第一个进程先运行一次
a[0][2]=String.valueOf(Integer.parseInt(a[0][2])-1);
for(now=Integer.parseInt(a[0][1])+1;now<=allTime;now++)//随着时间循环
ArrayListrow2=newArrayList();
for(r2=0;r2<5;r2++)
if("".equals(a[r2][4])||a[r2][4]==null)
if(Integer.parseInt(a[r2][1])<=now)//表示已到达
row2.add(r2);
if(row2.size()==0)
continue;
//最高响应比的下标
index=Util.findShortTimeIndex(row2,a);
if("".equals(a[index][3])||a[index][3]==null)
a[index][3]=String.valueOf(now);//设置开始时间
a[index][2]=String.valueOf(Integer.parseInt(a[index][2])-1);
if(Integer.parseInt(a[index][2])==0)//获够了服务的时间
a[index][4]=String.valueOf(now+1);//设置了结束时间
endTime3=Integer.parseInt(a[i][4]);
beginTime3=Integer.parseInt(a[i][3]);
arriveTime3=Integer.parseInt(a[i][1]);
turnTime3=endTime3-arriveTime3;
qTurnTime3=Double.parseDouble(String.valueOf(turnTime3)/Double.parseDouble(String.valueOf(service[i]));
table.setValueAt(a[i][3],i,3);//开始时间
table.setValueAt(a[i][4],i,4);//结束时间
table.setValueAt(String.valueOf(turnTime3),i,5);
table.setValueAt(String.valueOf(qTurnTime3),i,6);
avgTurnTime3+=Double.parseDouble(a[i][6]);
avgTurnTime3/=5;
avgTurnTime3=(double)Math.round(avgTurnTime3*100)/100;
resultMap.put("短作业(抢占式)平均带权周转时间",avgTurnTime3);//平均带权周转时间
JOptionPane.showMessageDialog(null,"短作业优先(抢占式)平均周转时间:
"+avgTurnTime3,"结果",JOptionPane.INFORMATION_MESSAGE);
(3)其他算法核心代码省略
五.运行结果及其说明
(1)刚运行时的界面:
(2)点击“随机生成数据”,观看右边的数据,初始化5个进程。
(3)选择先来先服务,观看右边的表格,得出各个进程的信息:
包括开始时间,结束时间,周转时间,带权周转时间,平均带权周转时间(弹出框)。
(4)再选择“抢占式短作业优先”,观看右边表格数据的变化,结果如下:
(5)再选择“非抢占式短作业优先”,观看右边表格数据的变化,结果如下:
(6)再选择“高响应比优先”,观看右边的表格数据变化,结果如下:
(7)再选择“时间片轮转法(t=1)”,观看右边算法运行得结果,如下图:
(8)为了比较各个算法的平均带权周转时间,点击“结果与比较”,结果如下:
(9)附带功能:
全部清除,点击“全部清除”,右边表格的数据将会被清空,如下图:
(10)附带功能:
手动添加进程的数据,在界面左上角输入:
进程名,到达时间,服务时间,然后再点击“添加”,数据将会被加载到右边的表格中,如下图所示:
(11)附加功能:
“清空”,清空界面左上角的输入框信息,点击“清空”时,结果如下:
(12)校验功能:
当没有选择一个算法就点击运行时,会给出提示:
(13)校验功能:
没有输入完整的信息,给出提示:
(14)校验功能:
当没有输入数据时,就点击“结果与比较”,给出提示:
六.设计心得
(1)在完成课设的过程中,我进一步了解进程调度的5个算法的原理,由于本人是利用java来实现的,在实现5个算法中,遇到很多问题,首先第一个问题就是做界面,由于java不像c#做界面那么的容易,所以,我几乎花了一半甚至超过一半的时间来完成,但是和构想不一样,因为我本来想构建5个表格,每个表格对于一个算法的信息,那样子比较起来就非常的清晰,直观,但是,由于实现起来比较麻烦,特别是布局,由于时间关系,就利用一个表格来实现上面的功能。
(2)在实现抢占式短作业的时候,遇到了不少问题,第一个是算开始时间就算错,因为我用的时定长数组,不是每次都存满数组在里面,在遍历的时候就会出现空值比较的情况,会报错;第二就是求动态地球最短服务时间的进程的时候,下标容易出错,一旦出错,后面全部结果都会跟着错。
(3)经过这次课程设计,让我懂得完成一个功能时,必须先要明确解答思路,再敲代码,然后运行,更加错误提示找出错误来源,如果分析不出来,就设置断点,进行调式,分析每步流程,每次运行得临时变量值是否正常,从其中找出原因
七.参考文献
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1