【操作系统】先来先服务
1.算法原理
作业调度算法先来先服务:作业个数n,每个作业的到达时间为t1,t2,...,tn,服务时间为s1,s2,...,sn.先到的作业先进入cpu处理,其他作业等待。每个作业的周转时间=完成时间-到达时间,带权周转时间=周转时间/服务时间。平均周转时间=所有作业的周转时间/作业个数,平均带权周转时间=所有作业的带权周转时间/作业个数。
2.模块分析
数据结构:
定义一个结构体表示JCB,其中包括:进程名,到达时间,开始时间,服务时间,完成时间,周转时间,带权周转时间。
利用3个函数模拟FCFS。输入函数,FCFS核心函数,输出函数。
3.流程图
4.代码实现
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 struct P{ 5 int num;//进程编号 6 int arrivedtime;//到达时间 7 int starttime;//开始时间 8 int servivetime;//服务时间 9 int finishtime;//完成时间 10 double zhouzhuantime;//周转时间 11 double avezztime;//带权周转时间 12 }; 13 P p[100]; 14 //按照到达时间升序排列 15 bool cmp(P p1,P p2){ 16 return p1.arrivedtime<p2.arrivedtime; 17 } 18 void inputP(int n){ 19 for(int i=0;i<n;i++){ 20 p[i].num=i+1; 21 cin>>p[i].arrivedtime>>p[i].servivetime; 22 p[i].starttime=0; 23 p[i].avezztime=p[i].finishtime=p[i].zhouzhuantime=0; 24 } 25 } 26 27 void FCFS(int n){ 28 //sort(p,p+n,cmp);//根据到达时间排序 29 int i; 30 for(i=0;i<n;i++){ 31 if(i==0){ 32 p[i].starttime=p[i].arrivedtime; 33 } 34 else { 35 p[i].starttime=p[i-1].finishtime; 36 } 37 p[i].finishtime=p[i].starttime+p[i].servivetime; 38 p[i].zhouzhuantime=p[i].finishtime-p[i].arrivedtime; 39 p[i].avezztime=p[i].zhouzhuantime/p[i].servivetime; 40 } 41 42 } 43 void printP(int n){ 44 int i; 45 double a=0,b=0; 46 cout<<"num"<<" "<<"到达时间"<<" "<<"服务时间"<<" "<<"开始时间"<<" "<<"完成时间"<<" "<<"周转时间"<<" "<<"带权时间"<<endl; 47 for(i=0;i<n;i++){ 48 cout<<p[i].num<<" "<<p[i].arrivedtime<<" "<<p[i].servivetime<<" "<<p[i].starttime<<" "<<p[i].finishtime<<" "<<p[i].zhouzhuantime<<" "<<p[i].avezztime; 49 a+=p[i].zhouzhuantime; 50 b+=p[i].avezztime; 51 cout<<endl; 52 } 53 cout<<"平均周转时间"<<a/n<<endl; 54 cout<<"平均带权周转时间"<<b/n<<endl; 55 } 56 57 58 int main(){ 59 int n; 60 cin>>n; 61 inputP(n); 62 FCFS(n); 63 printP(n); 64 return 0; 65 }
5.测试截图