实验内容:
已知一组进程P1、P2、P3……,及其到达时间和服务时间(参考下图),分别采用FCFS调度算法和SPF调度算法,求各个进程的完成时间、周转时间、带权周转时间、平均周转时间和平均带权周转时间。
实验目的:
熟悉FCFS调度算法的实现过程,熟练掌握FCFS算法的代码书写
实验原理:问题分析及算法设计(流程图)
1、问题分析:
问题一:对进程进行排序,先到达的排前面
可以存入数组中,使用插入法,每次将进程插入到对应数组位置
问题二:计算完成时间,周转时间, 带权周转时间。
完成时间 = 上一进程完成时间和当前进程到达时间的最大值+服务时间
周转时间 = 当前进程完成时间-当前进程到达时间
带权周转时间 = 当前进程周转时间/当前进程服务时间
平均周转时间 = 所有周转时间之和/进程数
2、流程图:
实验代码:
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
typedef struct project{
char name[20];//进程名
double arrive_time;//到达时间
double serve_time;//服务时间
double finish_time;//完成时间
double cycling_time;//周转时间
double weighted_cycling_time;//带权周转时间
}Pro;
//FCFS算法
void FCFS(){
int n;//进程数
printf("输入进程数: ");
scanf("%d",&n);
getchar();
Pro pro[50];//进程项
for(int i = 0 ; i < n; i++){
Pro pro_cur;//当前进程
printf("输入进程名: ");
scanf("%s",&pro_cur.name);//输入进程名
printf("输入到达时间: ");
scanf("%lf",&pro_cur.arrive_time);//输入进程到达时间
printf("输入服务时间: ");//输入进程服务时间
scanf("%lf",&pro_cur.serve_time);
printf("\n");
int j = i-1;
while(j >= 0&&pro_cur.arrive_time < pro[j].arrive_time){//先到先执行,插入当前进程到对应位置
pro[j+1] = pro[j];
j--;
}
pro[j+1] = pro_cur;
}
printf("进程名\t到达时间\t服务时间\n");
for(int i = 0; i < n; i++){
printf("%s\t%0.2lf\t%0.2lf\n",pro[i].name,pro[i].arrive_time,pro[i].serve_time);
}
double cur_time = 0;//当前时间
for(int i = 0; i < n; i++){//计算 完成时间, 周转时间, 带权周转时间
if(cur_time >= pro[i].arrive_time)
{
pro[i].finish_time = cur_time+pro[i].serve_time;
}else
{
pro[i].finish_time = pro[i].arrive_time+pro[i].serve_time;
}
pro[i].cycling_time = pro[i].finish_time-pro[i].arrive_time;
pro[i].weighted_cycling_time = pro[i].cycling_time/pro[i].serve_time;
cur_time = pro[i].finish_time;
}
printf("进程名\t到达时间\t服务时间\t完成时间\t周转时间\t带权周转时间\n");
for(int i = 0; i < n; i++){
printf("%s\t%0.2lf\t%0.2lf\t%0.2lf\t%0.2lf\t%0.2lf\n",pro[i].name,pro[i].arrive_time,pro[i].serve_time,pro[i].finish_time,pro[i].cycling_time,pro[i].weighted_cycling_time);
}
}
int main(){
FCFS();
return 0;
}
/*
5
A 0 4
B 1 3
C 2 5
D 3 2
E 4 4
*/
实验结果:(截图)
实验总结:(心得体会)
通过此次实验,对进程的各个算法有了更深的理解,知道了各个进程算法的实现过程和代码书写,及完成时间、周转时间、带权周转时间等计算方法,更好的将理论和实践相结合,对以后操作系统学习更加容易。