操作系统实验:FCFS调度和SPF调度算法(C语言)

实验内容:

已知一组进程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
*/

实验结果:(截图)

在这里插入图片描述

实验总结:(心得体会)

通过此次实验,对进程的各个算法有了更深的理解,知道了各个进程算法的实现过程和代码书写,及完成时间、周转时间、带权周转时间等计算方法,更好的将理论和实践相结合,对以后操作系统学习更加容易。

  • 10
    点赞
  • 93
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Baal Austin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值