1、先来先服务FCFS和短作业优先SJF进程调度算法计算机操作系统实验报告班级:过控12-01姓名:邹锦程学号:541213470163实验一 先来先服务FCFS和短作业优先SJF进程调度算法一、 实验目的通过这次实验,加深对进程概念的理解,进一步掌握进程状态的转变、进程调度的策略及对系统性能的评价方法。二、 实验内容设计程序模拟进程的先来先服务FCFS和短作业优先SJF调度过程。假设有n个进程分别在T1, ,Tn时刻到达系统,它们需要的服务时间分别为S1, ,Sn。分别采用先来先服务FCFS和短作业优先SJF进程调度算法进行调度,计算每个进程的完成时间、周转时间和带权周转时间,并且统计n个进程的
2、平均周转时间和平均带权周转时间。三、 要求程序要求:1)进程个数n;每个进程的到达时间T1, ,Tn和服务时间S1, ,Sn;选择算法1-FCFS,2-SJF。2)要求采用先来先服务FCFS和短作业优先SJF分别调度进程运行,计算每个进程的周转时间和带权周转时间,并且计算所有进程的平均周转时间和带权平均周转时间;3)输出:要求模拟整个调度过程,输出每个时刻的进程运行状态,如“时刻3:进程B开始运行”等等;4)输出:要求输出计算出来的每个进程的周转时间、带权周转时间、所有进程的平均周转时间以及带权平均周转时间。实验要求1)上机前认真复习FCFS和SJF进程调度调度算法,熟悉进程调度的执行过程;2
3、)上机时独立编程、调试程序;3)根据具体实验要求,完成好实验报告(包括实验的目的、内容、要求、源程序、实例运行结果截图、发现的问题以及解决方法)。四、 源程序#include#includetypedef struct PCB /定义进程控制块 char name10; /进程名 char state; /运行状态 int ArriveTime; /到达时间 int StartTime; /进程开始时间 int FinishTime; /进程结束时间 int ServiceTime; /服务时间 float WholeTime; /周转时间 float WeightWholeTime; /带权
4、周转时间 double AverageWT_FCFS; /平均周转时间 double AverageWWT_FCFS; /带权平均周转时间 struct PCB *next; /指向下个进程pcb;double x=0,y=0;int i;int time;int n;pcb *head=NULL,*p,*q;void run_FCFS(pcb *p1) /运行未完成的进程 time=p1-ArriveTimetime?p1-ArriveTime:time; p1-StartTime=time; printf(n 时刻:%d,当前开始运行作业%snn,time,p1-name); time+=
5、p1-ServiceTime; p1-state=T; p1-FinishTime=time; p1-WholeTime=p1-FinishTime-p1-ArriveTime; p1-WeightWholeTime=p1-WholeTime/p1-ServiceTime; x+=p1-WholeTime; y+=p1-WeightWholeTime; p1-AverageWT_FCFS=p1-WholeTime/n; p1-AverageWWT_FCFS=p1-WeightWholeTime/n; printf( 到达时间 开始时间 服务时间 完成时间 周转时间 带权周转时间n); prin
6、tf(%6d %10d %10d %8d %10.1f %10.2f n,p1-ArriveTime,p1-StartTime,p1-ServiceTime,p1-FinishTime,p1-WholeTime,p1-WeightWholeTime); printf(n平均周转时间 平均带权周转时间 n); printf( %10.2f %10.2fn ,p1-AverageWT_FCFS,p1-AverageWWT_FCFS); void FCFS()/找到当前未完成的进程 int i; p=head; for(i=0;istate=F) q=p; /标记当前未完成的进程 run_FCFS(
7、q); p=p-next; void getInfo() /获得进程信息并创建进程 int num; printf(n进程个数:); scanf(%d,&n); for(num=0;numname,&p-ArriveTime,&p-ServiceTime); if(head=NULL) head=p;q=p;time=p-ArriveTime; if(p-ArriveTime ArriveTime; q-next=p; p-StartTime=0; p-FinishTime=0; p-WholeTime=0; p-WeightWholeTime=0; p-next=NULL; p-state=
8、F; q=p; int main() printf(先来先服务FCFS算法模拟n); getInfo(); p=head; FCFS(); #include#include #include#define MaxNum 100 using namespace std; struct Process_struct int Number; /进程编号 char NameMaxNum; /进程名称 int ArrivalTime; /到达时间 int ServiceTime; /开始运行时间 int FinishTime; /运行结束时间 int WholeTime; /运行时间 int run_f
9、lag; /调度标志 int order; /运行次序 double WeightWholeTime; /周转时间 double AverageWT_FCFS,AverageWT_SJF; /平均周转时间 double AverageWWT_FCFS,AverageWWT_SJF; /平均带权周转时间 ProcessMaxNum; int N; /实际进程个数int SJF(); /短作业优先 int SJF() /短作业优先算法 int temp_time=0; /当期那时间 int i=0,j; int number_schedul,temp_counter; /进程编号,当前已执行进程个
10、数 float run_time; run_time=Processi.WholeTime; j=1; while(jN)&(Processi.ArrivalTime=Processj.ArrivalTime) /判断是否有两个进程同时到达 if(Processj.WholeTimeProcessi.WholeTime) run_time=Processi.WholeTime; i=j; j+; /查找下一个被调度的进程 /对找到的下一个被调度的进程求相应的参数 number_schedul=i; Processnumber_schedul.ServiceTime=Processnumber_
11、schedul.ArrivalTime; Processnumber_schedul.FinishTime=Processnumber_schedul.ServiceTime+Processnumber_schedul.WholeTime; Processnumber_schedul.run_flag=1; temp_time=Processnumber_schedul.FinishTime; Processnumber_schedul.order=1; temp_counter=1; while(temp_counterN) for(j=0;jN;j+) if(Processj.Arriva
12、lTime=temp_time)&(!Processj.run_flag) run_time=Processj.WholeTime; number_schedul=j; break; for(j=0;jN;j+) if(Processj.ArrivalTime=temp_time)&(!Processj.run_flag) if(Processj.WholeTimerun_time) run_time=Processj.WholeTime; number_schedul=j; /查找下一个被调度的进程 /对找到的下一个被调度的进程求相应的参数 Processnumber_schedul.Ser
13、viceTime=temp_time; Processnumber_schedul.FinishTime=Processnumber_schedul.ServiceTime+Processnumber_schedul.WholeTime; Processnumber_schedul.run_flag=1; temp_time=Processnumber_schedul.FinishTime; temp_counter+; Processnumber_schedul.order=temp_counter; return 0;int Pinput(); /进程参数输入 int Poutput();
14、 /调度结果输出 main() system(cls); int option; printf( *主菜单*n); printf( * 1 使用短作业优先 *n); printf( * 0 退出 *n); printf( *n); / system(color 1f); scanf(%d,&option); switch(option) case 0: printf(运行结束。n); break; case 1: printf(对进程用短作业优先调度。nn); Pinput(); SJF(); Poutput(); break; int Pinput() /进程参数输入 int i; prin
15、tf(请输入进程个数:n); scanf(%d,&N); for(i=0;iN;i+) printf(*n); printf(请输入一个进程:n,i+1); printf(请输入进程名称:n); scanf(%s,Processi.Name); printf(请输入到达时间:n); scanf(%d,&Processi.ArrivalTime); printf(请输入服务时间:n); scanf(%d,&Processi.WholeTime); Processi.ServiceTime=0; Processi.FinishTime=0; Processi.WeightWholeTime=0;
16、Processi.order=0; Processi.run_flag=0; system(cls); return 0; int Poutput() /调度结果输出 int i; float turn_round_time=0,f1,w=0; printf( 进程名称 到达T 运行T 开始运行T 结束T 执行顺序 周转T 带权周转Tn); for(i=0;iN;i+) Processi.WeightWholeTime=Processi.FinishTime-Processi.ArrivalTime; f1=Processi.WeightWholeTime/Processi.WholeTime
17、; turn_round_time+=Processi.WeightWholeTime; w+=f1; printf(时刻%d :,Processi.ServiceTime,Processi.Name); printf( %s %d %d %d %d %d %f %fn,Processi.Name,Processi.ArrivalTime,Processi.WholeTime,Processi.ServiceTime,Processi.FinishTime,Processi.order,Processi.WeightWholeTime,f1); printf(average_turn_round_timer=%fn,turn_round_time/N); printf(weight_average_turn_round_timer=%fn,w/N); return 0; 五、 结果六 感悟FCFS是最简单的调度算法,该算法既可用于作业调度,也可用于进程调度。SJF在实际情况中,占很大比例,为了能够使他们比长作业优先执行,而产生了短作业。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1