搜索
您的当前位置:首页正文

FCFS与SJF算法实验报告

来源:哗拓教育
FCFS与SJF算法实验报告

先来先服务FCFS和短作业优先SJF进程调度算法学⽣姓名:学⽣学号:专业班级:指导⽼师:2013年6⽉20⽇1、实验⽬的:

通过这次实验,加深对进程概念的理解,进⼀步掌握进程状态的转变、进程调度的策略及对系统性能的评价⽅法。2、问题描述:

假设有n个进程分别在T1, … ,T n时刻到达系统,它们需要的服务时间分别为S1, … ,S n。分别采⽤先来先服务FCFS和短作业优先SJF 进程调度算法进⾏调度,计算每个进程的完成时间、周转时间和带权周转时间,并且统计n个进程的平均周转时间和平均带权周转时间。3、需求分析

(1) 输⼊的形式和输⼊值的范围输⼊值:进程个数Num 范围:0依次输⼊Num个进程的服务时间范围:

输⼊要使⽤的算法范围:1或者2 (2) 输出的形式(X表⽰变量)时刻X:进程X开始运⾏。其完成时间:X周转时间:X带权周转时间:X…(省略(Num-1)个)

平均周转时间:X平均带权周转时间:X(3) 程序所能达到的功能

输⼊进程个数Num,每个进程到达时间ArrivalTime[i],服务时间ServiceTime[i]。采⽤先来先服务FCFS或者短作业优先SJF进程调度算法进⾏调度,计算每个进程的完成时间、周转时间和带权周转时间,并且统计Num个进程的平均周转时间和平均带权周转时间。4、概要设计

(1)程序中进程调度时间变量描述如下:

(2)程序流程变量初始化;

接收⽤户输⼊n,T1, … ,T n,S1, … ,S n;算法选择1-FCFS,2-SJF;按照选择算法进⾏进程调度,计算进程的完成时间、周转时间和带权周转时间;计算所有进程的平均周转时间和平均带权周转时间;按格式输出调度结果。5、详细设计先来先服务算法:

//******************************************************************// 先到先服务算法

//******************************************************************void FCFS() //找最早到达的。{

cout<<\"--------------------------------------------------------------\"cout<<\"--------------------------------------------------------------\"if(ArrivalTime[i]>NowTime) //假如进程到达的时间⽐现在已经运⾏的时间NowTime⼤,说明在NowTime时刻进程未到达{

NowTime=ArrivalTime[i]; //把进程的到达时间赋给NowTime}

NowTime+=ServiceTime[i]; //把进程的服务时间加到NowTime上FinishTime[i]=NowTime; //计算完成时间

WholeTime[i]=FinishTime[i]-ArrivalTime[i]; //计算周转时间=完成时间-到达时间

WeightWholeTime[i]=(double)WholeTime[i]/ServiceTime[i]; //计算带权周转时间=周转时间/服务时间SumWT+=WholeTime[i]; //计算总的周转时间

SumWWT+=WeightWholeTime[i]; //计算总的帯权周转时间

}

AverageWT_FCFS=SumWT/Num; //平均周转时间AverageWWT_FCFS=SumWWT/Num; //平均帯权周转时间for(i=0;i{

cout<<\"时刻\"<}

cout<<\"平均周转时间:\"短进程优先算法:

//******************************************************************// 短进程优先算法

//******************************************************************

void SJF() //找已经到达的且服务时间最短的进程(假定输⼊的进程是按照到达时间先后输⼊的){cout<<\"--------------------------------------------------------------\"cout<<\"--------------------------------------------------------------\"NowTime=ArrivalTime[0]+ServiceTime[0]; //计算第⼀次的NowTImeFinishTime[0]=NowTime; //计算第⼀个进程的完成时间ServiceTime_SJF[0]=1000; //赋初值。cout<<\"时刻\"k=1;min=0;

if(allin==0) //找到已经到达的进程个数{j=0;

while(ArrivalTime[j]<=NowTime && j{j++;if(j>=Num){

allin=1;}}}else{j=Num;}

j=j-1; //j是已经到达的进程数

while(k<=j) //从已经到达的进程⾥找到服务时间最短的进程{

if(ServiceTime_SJF[k]==0) //进程的服务时间如果等于0,则跳过该进程k++;else{

if(ServiceTime_SJF[min]>ServiceTime_SJF[k]) //⽐较,找到服务时间最短的进程min=k;k++;}}

ServiceTime_SJF[min]=0; //找完后置零,便于下⼀次循环时使⽤NowTime+=ServiceTime[min]; //累加当前时间FinishTime[min]=NowTime; //完成时间}for(i=0;i{

WholeTime[i]=FinishTime[i]-ArrivalTime[i];

WeightWholeTime[i]=(double)WholeTime[i]/ServiceTime[i];SumWT+=WholeTime[i];

SumWWT+=WeightWholeTime[i];}

AverageWT_SJF=SumWT/Num; //平均周转时间AverageWWT_SJF=SumWWT/Num; //平均带权周转时间cout<<\" 其完成时间:\"{

cout<<\"时刻\"<}

cout<<\"平均周转时间:\"实现程序模块的具体调⽤:void FCFS(){fcfs算法}

void SJF(){sjf算法}

void input(){

输⼊进程个数

输⼊每个进程的到达时间输⼊每个进程的服务时间}

void main() //主函数{

输⼊choice,选择使⽤哪个算法if(choice==1){

FCFS();//调⽤FCFS算法}

else if(choice==2){

SJF();//调⽤SJF}}

6、调试分析

(1)调试过程中遇到的问题以及解决⽅法,设计与实现的回顾讨论和分析:

○1开始的时候没有判断进程是否到达,导致短进程优先算法运⾏结果错误,后来加上了判断语句后就解决了改问题。○2基本完成的设计所要实现的功能,总的来说,FCFS编写容易,SJF需要先找到已经到达的进程,再从已经到达的进程⾥找到进程服务时间最短的进程,再进⾏计算。

(2)算法的改进设想:即使⽤户输⼊的进程到达时间没有先后顺序也能准确的计算出结果。(就是再加个循环,判断各个进程的到达时间先后,组成⼀个有序的序列)。7、⽤户使⽤说明(1)输⼊进程个数Num

(2)依次输⼊Num个进程的到达时间(3)依次输⼊Num个进程的服务时间(4)选择要使⽤的算法8、测试结果

①选择FCFS算法运⾏结果:

②选择SJF算法运⾏结果:

③不合法的输⼊运⾏结果:

9、存在问题

两种算法(FCFS算法与SJF算法)不能够连续选择,选择其⼀得到运⾏结果后,若要使⽤另⼀种算法则需要重新调试运⾏程序,输⼊⽐较⿇烦。10、⼼得体会

通过使⽤C++程序设计语⾔对先到先服务(FCFS)算法和短作业优先(SJF)算法进⾏编程设计,使我对这两种算法有了更深的了解和更完整的掌握,也在编程过程中对这两种算法的优缺点有了体会,并且加强了⾃⼰的编程能⼒。11、附录程序源代码:

//*******************************************************************//** FCFS和SJF进程调度算法张迪 1025116022 **//*******************************************************************#include#include

using namespace std;static const int Max=100;int ArrivalTime[Max]; //到达时间int ServiceTime[Max]; //服务时间int FinishTime[Max]; //完成时间int WholeTime[Max]; //周转时间

double WeightWholeTime[Max]; //帯权周庄时间

double AverageWT_FCFS,AverageWT_SJF; //平均周转时间

double AverageWWT_FCFS,AverageWWT_SJF; //平均帯权周转时间int ServiceTime_SJF[Max]; //在SJF算法中使⽤到int Num=0;

int NowTime=0; //记录当前时间

double SumWT=0,SumWWT=0; //SumWT⽤来计算总的周转时间,SumWWT⽤来计算总的帯权周转时间int i;

int choice; //记录选择

//******************************************************************// 先到先服务算法

//******************************************************************void FCFS() //找最早到达的。{

cout<<\"--------------------------------------------------------------\"cout<<\"--------------------------------------------------------------\"if(ArrivalTime[i]>NowTime) //假如进程到达的时间⽐现在已经运⾏的时间NowTime⼤,说明在NowTime时刻进程未到达{

NowTime=ArrivalTime[i]; //把进程的到达时间赋给NowTime}

NowTime+=ServiceTime[i]; //把进程的服务时间加到NowTime上FinishTime[i]=NowTime; //计算完成时间

WholeTime[i]=FinishTime[i]-ArrivalTime[i]; //计算周转时间=完成时间-到达时间

WeightWholeTime[i]=(double)WholeTime[i]/ServiceTime[i]; //计算带权周转时间=周转时间/服务时间SumWT+=WholeTime[i]; //计算总的周转时间

SumWWT+=WeightWholeTime[i]; //计算总的帯权周转时间}

AverageWT_FCFS=SumWT/Num; //平均周转时间AverageWWT_FCFS=SumWWT/Num; //平均帯权周转时间for(i=0;i{

cout<<\"时刻\"<\"<}

cout<<\"平均周转时间:\"//******************************************************************// 短进程优先算法

//******************************************************************

void SJF() //找已经到达的且服务时间最短的进程(假定输⼊的进程是按照到达时间先后输⼊的){

cout<<\"--------------------------------------------------------------\"cout<<\"--------------------------------------------------------------\"NowTime=ArrivalTime[0]+ServiceTime[0]; //计算第⼀次的NowTImeFinishTime[0]=NowTime; //计算第⼀个进程的完成时间ServiceTime_SJF[0]=1000; //赋初值。cout<<\"时刻\"k=1;min=0;

if(allin==0) //找到已经到达的进程个数{j=0;

while(ArrivalTime[j]<=NowTime && j{j++;if(j>=Num){allin=1;}}}else{j=Num;

}

j=j-1; //j是已经到达的进程数

while(k<=j) //从已经到达的进程⾥找到服务时间最短的进程{

if(ServiceTime_SJF[k]==0) //进程的服务时间如果等于0,则跳过该进程k++;else{

if(ServiceTime_SJF[min]>ServiceTime_SJF[k]) //⽐较,找到服务时间最短的进程min=k;k++;}}

ServiceTime_SJF[min]=0; //找完后置零,便于下⼀次循环时使⽤NowTime+=ServiceTime[min]; //累加当前时间FinishTime[min]=NowTime; //完成时间}for(i=0;i{

WholeTime[i]=FinishTime[i]-ArrivalTime[i];

WeightWholeTime[i]=(double)WholeTime[i]/ServiceTime[i];SumWT+=WholeTime[i];

SumWWT+=WeightWholeTime[i];}

AverageWT_SJF=SumWT/Num; //平均周转时间AverageWWT_SJF=SumWWT/Num; //平均带权周转时间cout<<\" 其完成时间:\"cout<<\"时刻\"<}

cout<<\"平均周转时间:\"//******************************************************************

// 输⼊函数

//******************************************************************void input(){

cout<<\"请输⼊进程个数:\";cin>>Num;

while(Num>100||Num<=0){

cout<<\"进程个数必须⼤于0且⼩于等于100!请重新输⼊进程个数:\";cin>>Num;}

cout<<\"-----------------------------------------\"cout<<\"请输⼊第\">ArrivalTime[i];}

cout<<\"-----------------------------------------\"int data=0;cout<<\"请输⼊第\">data;

ServiceTime[i]=data;ServiceTime_SJF[i]=data;}

cout<<\"-----------------------------------------\">choice;}

//******************************************************************// 主函数

//******************************************************************void main(){

cout<<\"*******************************************************************\"NowTime=0;SumWT=0;SumWWT=0; //参数初始化input(); //输⼊if(choice==1)

FCFS(); //调⽤FCFS算法else if(choice==2)SJF(); //调⽤SJF算法else //输⼊有误,则重新选择{while(1){

cout<<\"您的选择有误!请重新选择!\"<

cout<<\"请选择要使⽤的算法(1-FCFS,2-SJF): \";cin>>choice;if(choice==1){FCFS();break;}

else if(choice==2){SJF();break;}}}}

因篇幅问题不能全部显示,请点此查看更多更全内容

Top