1实验一先来先服务FCFS和短作业优先SJF进程调度算法Word格式文档下载.docx
《1实验一先来先服务FCFS和短作业优先SJF进程调度算法Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《1实验一先来先服务FCFS和短作业优先SJF进程调度算法Word格式文档下载.docx(13页珍藏版)》请在冰豆网上搜索。
3
4
服务时间
5
FCFS
完成时间
7
12
14
18
周转时间
6
10
11
9
带权周转时间
5.5
3.5
2.8
SJF
13
8
16
2.67
3.2
1.5
2.25
2.1
也可看下面截图的测试结果
二:
概要设计
程序包括主函数、FCFS算法函数、SJF算法函数、输出函数;
主函数流程:
输入文件中的数据—显示各进程数据—选择算法—调用相应算法的函数—输出结果
三:
详细设计
算法流程图:
FCFS先来先服务算法流程图:
SJF算法流程图:
四:
调试分析
(1):
调试过程中遇到的问题以及解决方法,设计与实现的回顾讨论和分析;
开始的时候没有判断进程是否到达,导致短进程优先算法运行结果错误,后来加上了判断语句后就解决了改问题。
(2):
算法的性能分析及其改进设想;
即使用户输入的进程到达时间没有先后顺序也能准确的计算出结果。
(加循环,判断各个进程的到达时间先后,组成一个有序的序列)
(3):
经验和体会。
通过本次实验,深入理解了先来先服务和短进程优先进程调度算法的思想,培养了自己的动手能力,通过实践加深了记忆。
五:
用户使用说明
在同一目录下的.txt文件中按输入要求输入相关数据,并且根据提示选择相应的算法。
六:
测试结果
测试数据:
输出结果:
七:
附录
源程序:
#include<
iostream>
iomanip>
//格式化输出结果
sstream>
//读取文件
fstream>
usingnamespacestd;
constintMaxNum=100;
intArrivalTime[MaxNum];
//到达时间
intServiceTime[MaxNum];
//服务时间
intFinishTime[MaxNum];
//完成时间
intWholeTime[MaxNum];
//周转时间
doubleWeightWholeTime[MaxNum];
//带权周转时间
doubleAverageWT_FCFS,AverageWT_SJF;
//平均周转时间
doubleAverageWWT_FCFS,AverageWWT_SJF;
//平均带权周转时间
voidFCFS(intn);
//先来先服务
voidSJF(intn);
//短作业优先
voidprint(intn,intarray[]);
voidprint(intn,doublearray[]);
voidprintproceed(intn);
//输出FCFS进程运行状态
voidmain()
{
intn,i,j;
//n:
进程数;
i、j:
循环计数变量
ifstreamin("
text.txt"
);
//读文件
strings;
for(i=0;
i<
3,getline(in,s);
i++)
{//当i=0读入进程数n;
i=1读入各进程到达时间;
i=2读入各进程服务时间
istringstreamsin(s);
switch(i)
{
case0:
sin>
>
n;
break;
case1:
for(j=0;
j<
j++)
sin>
ArrivalTime[j];
case2:
ServiceTime[j];
}
}
//显示各进程数据
cout<
<
setfill('
'
)<
setw(7)<
"
进程名"
setw
(1)<
;
charch='
A'
cout<
setw(3)<
char(ch+i);
endl<
到达时间"
ArrivalTime[i];
服务时间"
ServiceTime[i];
endl;
//选择算法:
先来先服务FCFS-->
1短作业优先SJF-->
2关闭-->
请选择算法:
FCFS-->
1SJF-->
2退出-->
0"
选择:
intchoice;
cin>
choice;
while(choice!
=0)//直到输入值为0跳出循环,结束程序
{
while(choice!
=1&
&
choice!
=2&
choice!
=0)
cout<
Pleaseenter0,1or2!
cin>
if(choice==0)
return;
if(choice==1)
FCFS(n);
//进行先来先服务FCFS算法
else
SJF(n);
//进行短作业优先服务SJF算法
请选择:
cin>
return;
}
//------------------先来先服务----------------------------------------
voidFCFS(intn)
//第一个进程先服务
FinishTime[0]=ArrivalTime[0]+ServiceTime[0];
WholeTime[0]=FinishTime[0]-ArrivalTime[0];
WeightWholeTime[0]=double(WholeTime[0])/double(ServiceTime[0]);
for(inti=1;
{
if(FinishTime[i-1]>
ArrivalTime[i])
FinishTime[i]=FinishTime[i-1]+ServiceTime[i];
//如果上一个进程的完成时间大于下一个进程的到达时间,
//那么下一个进程的开始时间从上一个进程的完成时间开始
FinishTime[i]=ArrivalTime[i]+ServiceTime[i];
//否则,下一个进程的开始时间从它本身的到达时间开始
WholeTime[i]=FinishTime[i]-ArrivalTime[i];
WeightWholeTime[i]=double(WholeTime[i])/double(ServiceTime[i]);
doubletotalWT=0,totalWWT=0;
for(intj=0;
{//循环累加,求总的周转时间,总的带权周转时间
totalWT+=WholeTime[j];
totalWWT+=WeightWholeTime[j];
AverageWT_FCFS=totalWT/double(n);
AverageWWT_FCFS=totalWWT/double(n);
//输出各结果
---------先来先服务FCFS--------------"
完成时间分别为:
print(n,FinishTime);
周转时间分别为:
print(n,WholeTime);
带权周转时间分别为:
print(n,WeightWholeTime);
平均周转时间:
AverageWT_FCFS<
平均带权周转时间:
AverageWWT_FCFS<
printproceed(n);
//------------------短作业优先--------------------------------
voidSJF(intn)
intShort;
//存放当前最短作业的序号
intFinish=0;
//存放当前完成时间
for(inta=0;
a<
a++)//初始化完成时间为0
FinishTime[a]=0;
inti;
//循环计数累加变量
inttag=0;
//用于标记当前完成时间内,是否找到短作业
intMax=10000;
for(intj=0;
if(FinishTime[j]==0&
ArrivalTime[j]<
=Finish&
ServiceTime[j]<
=Max)
{
Max=ServiceTime[j];
Short=j;
tag=1;
}
if(tag==1)
{//找到短作业
FinishTime[Short]=Finish+ServiceTime[Short];
if(tag==0)
{//未找到
for(intk=0;
k<
n,FinishTime[k]==0;
k++)
{//直接进入下一未完成进程
Short=k;
break;
FinishTime[Short]=ArrivalTime[Short]+ServiceTime[Short];
Finish=FinishTime[Short];
{//计算周转时间、带权周转时间
{//计算总的周转时间、总的带权周转时间
//输出各值
---------短作业优先SJF--------------"
完成时间:
周转时间:
带权周转时间:
voidprint(intn,intarray[])
{//打印int型数组
for(inti=0;
array[i]<
"
voidprint(intn,doublearray[])
{//打印double型数组
voidprintproceed(intn)
{//打印各时刻各进程的运行情况
intStartTime=FinishTime[i]-ServiceTime[i];
时刻"
StartTime<
:
进程"
char(ch+i)<
开始运行"
FinishTime[i]<
停止运行"