先来先服务和短作业优先调度算法.docx
《先来先服务和短作业优先调度算法.docx》由会员分享,可在线阅读,更多相关《先来先服务和短作业优先调度算法.docx(24页珍藏版)》请在冰点文库上搜索。
![先来先服务和短作业优先调度算法.docx](https://file1.bingdoc.com/fileroot1/2023-5/6/fd21a244-3c26-495c-ae14-608e7634d3f7/fd21a244-3c26-495c-ae14-608e7634d3f71.gif)
先来先服务和短作业优先调度算法
《操作系统》实验一实验报告
【实验题目】:
先来先服务FCFS和短作业优先SJF进程调度算法
【实验目的】
通过这次实验,加深对进程概念的理解,进一步掌握进程状态的转变、进程调度的策略及对系统性能的评价方法。
【实验内容】
问题描述:
设计程序模拟进程的先来先服务FCFS和短作业优先SJF调度过程。
假设有n个进程分别在T1,…,Tn时刻到达系统,它们需要的服务时间分别为S1,…,Sn。
分别采用先来先服务FCFS和短作业优先SJF进程调度算法进行调度,计算每个进程的完成时间,周转时间和带权周转时间,并且统计n个进程的平均周转时间和平均带权周转时间。
程序要求如下:
1)进程个数n;每个进程的到达时间T1,…,Tn和服务时间S1,…,Sn;选择算法1-FCFS,2-SJF。
2)要求采用先来先服务FCFS和短作业优先SJF分别调度进程运行,计算每个进程的周转时间,带权周转时间,并且计算所有进程的平均周转时间,带权平均周转时间;
3)输出:
要求模拟整个调度过程,输出每个时刻的进程运行状态,如“时刻3:
进程B开始运行”等等;
4)输出:
要求输出计算出来的每个进程的周转时间,带权周转时间,所有进程的平均周转时间,带权平均周转时间。
【实验过程】
#include
usingnamespacestd;
#defineMaxNum100
intArrivalTime[MaxNum];
doubleServiceTime[MaxNum];
doubleFinishTime[MaxNum];
doubleWholeTime[MaxNum];
doubleAVEWholeTime[MaxNum];
doubleAVEWeightWholeTime[MaxNum];
doubleWeightWholeTime[MaxNum];
doubleAverageWT_FCFS,AverageWT_SJF;
doubleAverageWWT_FCFS,AverageWWT_SJF;
doubleAllTime,WeightAllTime;
doublea[MaxNum];
intb[MaxNum];
intc[MaxNum];
intd[MaxNum];
voidFCFS();
voidSJF();
voidFCFS()
{
intProcessNum;
cout<<"----------先来先服务算法----------"<cout<<"请输入进程个数:
";
cin>>ProcessNum;
cout<<"输入进程到达时间:
";
cout<for(inti=0;i{
cin>>ArrivalTime[i];
//cout<}
cout<cout<<"请输入进程服务时间:
";
cout<for(inti=0;i{
cin>>ServiceTime[i];
//cout<}
cout<for(inti=0;i{
FinishTime[i]=ServiceTime[i];
}
for(inti=0;i{
FinishTime[i+1]=FinishTime[i]+FinishTime[i+1];
}
for(inti=0;i{
cout<<"时刻"<第"<
"<}
cout<<"PCFS完成时间:
";
for(inti=0;i{
cout<}
cout<cout<<"PCFS周转时间:
";
for(inti=0;i{
WholeTime[i]=FinishTime[i]-ArrivalTime[i];
}
for(inti=0;i{
cout<}
cout<cout<<"PCFS平均周转时间:
";
for(inti=0;i{
AVEWholeTime[i]=WholeTime[i];
//cout<}
for(inti=0;i{
AVEWholeTime[i+1]=AVEWholeTime[i]+AVEWholeTime[i+1];
//cout<AllTime=AVEWholeTime[i+1];
}
cout<AverageWT_FCFS=AllTime/ProcessNum;
cout<<"平均周转时间"<cout<<"PCFS带权周转时间:
";
for(inti=0;i{
WeightWholeTime[i]=WholeTime[i]/ServiceTime[i];
}
for(inti=0;i{
cout<}
cout<cout<<"PCFS平均带权周转时间:
";
for(inti=0;i{
AVEWeightWholeTime[i]=WeightWholeTime[i];
//cout<}
for(inti=0;i{
AVEWeightWholeTime[i+1]=AVEWeightWholeTime[i]+AVEWeightWholeTime[i+1];
WeightAllTime=AVEWeightWholeTime[i+1];
//cout<}
AverageWWT_FCFS=WeightAllTime/ProcessNum;
cout<<"平均带权周转时间"<}
voidSJF()
{
intProcessNum;
cout<<"----------短作业优先算法----------"<cout<<"请输入进程个数:
";
cin>>ProcessNum;
cout<<"输入进程到达时间:
";
cout<for(inti=0;i{
cin>>ArrivalTime[i];
//cout<}
cout<cout<<"请输入进程服务时间:
";
cout<for(inti=0;i{
cin>>ServiceTime[i];
//cout<}
cout<for(inti=0;i{
a[i]=ServiceTime[i];
}
for(inti=1;i{
doubleexchange;
for(intj=i+1;j{
if(a[i]>a[j])
{
exchange=a[i];
a[i]=a[j];
a[j]=exchange;
}
}
}
FinishTime[0]=ServiceTime[0];
for(inti=1;i{
//b[0]=0;
for(intj=1;j{
if(a[i]==ServiceTime[j])
{
b[i]=j;
//cout<break;
}
}
}
for(inti=1;i{
//cout<//cout<
/**
***通过下边的转换,使得完成时间小于到达时间时
***下一个进程和下下一个进程顺序交换
**/
if(FinishTime[b[i-1]]{
//cout<
inttemp;
temp=b[i];
b[i]=b[i+1];
b[i+1]=temp;
}
//cout<
a[i]=ServiceTime[b[i]];
a[i]=a[i-1]+a[i];
//cout<FinishTime[b[i]]=a[i];
}
for(inti=0;i{
cout<<"时刻"<第"<
"<}
cout<<"SJF完成时间:
";
for(inti=0;i{
cout<}
cout<cout<<"SJF周转时间:
";
for(inti=0;i{
WholeTime[i]=FinishTime[i]-ArrivalTime[i];
}
for(inti=0;i{
cout<}
cout<cout<<"SJF平均周转时间:
";
for(inti=0;i{
AVEWholeTime[i]=WholeTime[i];
//cout<}
for(inti=0;i{
AVEWholeTime[i+1]=AVEWholeTime[i]+AVEWholeTime[i+1];
//cout<AllTime=AVEWholeTime[i+1];
}
//cout<AverageWT_SJF=AllTime/ProcessNum;
cout<<"平均周转时间"<cout<<"SJF带权周转时间:
";
for(inti=0;i{
WeightWholeTime[i]=WholeTime[i]/ServiceTime[i];
}
for(inti=0;i{
cout<}
cout<cout<<"SJF平均带权周转时间:
";
for(inti=0;i{
AVEWeightWholeTime[i]=WeightWholeTime[i];
//cout<}
for(inti=0;i{
AVEWeightWholeTime[i+1]=AVEWeightWholeTime[i]+AVEWeightWholeTime[i+1];
WeightAllTime=AVEWeightWholeTime[i+1];
//cout<}
AverageWWT_SJF=WeightAllTime/ProcessNum;
cout<<"平均带权周转时间"<}
voidmain()
{
charflag='Y';
charn;
cout<<"----------调度算法FCFS&&SJF-----------"<while(flag=='Y'||flag=='y')
{
cout<cout<<"1、先来先服务FCFS算法."<cout<<"2、短作业优先SJF算法."<cout<<"请您选择算法的序号:
"<cin>>n;
switch(n)
{
case'1':
FCFS();
break;
case'2':
SJF();
break;
default:
cout<cout<<"您输出有误!
"<break;
}
cout<cout<<"是否继续调度算法FCFS&&SJF,按'Y'or'y'钮继续,按照'N'or'n'键退出"<cin>>flag;
}
}
【实验结果】
先来先服务算法
短作业优先算法
#include
usingnamespacestd;
#defineMaxNum100
intArrivalTime[MaxNum];
doubleServiceTime[MaxNum];
doubleFinishTime[MaxNum];
doubleWholeTime[MaxNum];
doubleAVEWholeTime[MaxNum];
doubleAVEWeightWholeTime[MaxNum];
doubleWeightWholeTime[MaxNum];
doubleAverageWT_FCFS,AverageWT_SJF;
doubleAverageWWT_FCFS,AverageWWT_SJF;
doubleAllTime,WeightAllTime;
doublea[MaxNum];
intb[MaxNum];
intc[MaxNum];
intd[MaxNum];
voidFCFS();
voidSJF();
voidFCFS()
{
intProcessNum;
printf("----------先来先服务算法----------");
printf("请输入进程个数:
");
scanf("%d",&ProcessNum);
printf("输入进程到达时间:
");
printf("\n");
for(inti=0;i{
scanf("%d"&ArrivalTime[i]);
}
printf("\n");
cout<<"请输入进程服务时间:
";
printf("\n");
for(i=0;i{
cin>>ServiceTime[i];
}
printf("\n");
for(i=0;i{
FinishTime[i]=ServiceTime[i];
}
for(i=0;i{
FinishTime[i+1]=FinishTime[i]+FinishTime[i+1];
}
for(i=0;i{
cout<<"时刻"<第"<
"<}
cout<<"PCFS完成时间:
";
for(i=0;i{
cout<}
printf("\n");
cout<<"PCFS周转时间:
";
for(i=0;i{
WholeTime[i]=FinishTime[i]-ArrivalTime[i];
}
for(i=0;i{
cout<}
printf("\n");
cout<<"PCFS平均周转时间:
";
for(i=0;i{
AVEWholeTime[i]=WholeTime[i];
}
for(i=0;i{
AVEWholeTime[i+1]=AVEWholeTime[i]+AVEWholeTime[i+1];
AllTime=AVEWholeTime[i+1];
}
cout<AverageWT_FCFS=AllTime/ProcessNum;
cout<<"平均周转时间"<cout<<"PCFS带权周转时间:
";
for(i=0;i{
WeightWholeTime[i]=WholeTime[i]/ServiceTime[i];
}
for(i=0;i{
cout<}
printf("\n");
cout<<"PCFS平均带权周转时间:
";
for(i=0;i{
AVEWeightWholeTime[i]=WeightWholeTime[i];
}
for(i=0;i{
AVEWeightWholeTime[i+1]=AVEWeightWholeTime[i]+AVEWeightWholeTime[i+1];
WeightAllTime=AVEWeightWholeTime[i+1];
}
AverageWWT_FCFS=WeightAllTime/ProcessNum;
cout<<"平均带权周转时间"<}
voidSJF()
{
intProcessNum;
cout<<"----------短作业优先算法----------"<cout<<"请输入进程个数:
";
cin>>ProcessNum;
cout<<"输入进程到达时间:
";
printf("\n");
for(inti=0;i{
cin>>ArrivalTime[i];
}
printf("\n");
cout<<"请输入进程服务时间:
";
printf("\n");
for(i=0;i{
cin>>ServiceTime[i];
}
printf("\n");
for(i=0;i{
a[i]=ServiceTime[i];
}
for(i=1;i{
doubleexchange;
for(intj=i+1;j{
if(a[i]>a[j])
{
exchange=a[i];
a[i]=a[j];
a[j]=exchange;
}
}
}
FinishTime[0]=ServiceTime[0];
for(i=1;i{
for(intj=1;j{
if(a[i]==ServiceTime[j])
{
b[i]=j;
break;
}
}
}
for(i=1;i{
if(FinishTime[b[i-1]]{
inttemp;
temp=b[i];
b[i]=b[i+1];
b[i+1]=temp;
}
a[i]=ServiceTime[b[i]];
a[i]=a[i-1]+a[i];
FinishTime[b[i]]=a[i];
}
for(i=0;i{
cout<<"时刻"<第"<
"<}
cout<<"SJF完成时间:
";
for(i=0;i{
cout<