操作系统调度算法详解:先来先服务调度算法(FCFS)的C语言实现
创作时间:
作者:
@小白创作中心
操作系统调度算法详解:先来先服务调度算法(FCFS)的C语言实现
引用
CSDN
1.
https://m.blog.csdn.net/m0_69550216/article/details/143130598
操作系统调度算法是操作系统中非常重要的一个部分,其中先来先服务调度算法(FCFS)是最基本也是最简单的调度算法之一。本文将详细介绍FCFS调度算法的原理、特点以及其C语言实现。
一、算法原理
先来先服务调度算法按照作业或进程到达的先后次序来进行调度。具体过程如下:
作业调度:当作业调度中采用该算法时,每次调度都是从后备队列中选择一个最先进入该队列的作业,将它调入内存,为其创建进程、分配相应的资源,并将该作业的进程放入就绪队列。
进程调度:在进程调度中采用该算法时,每次调度是从就绪队列中选择一个最新进入该队列的进程,并给它分配处理机。进程会一直运行下去,直到该进程完成工作或者因为等待某事件发生而不能继续运行时才释放处理机。
二、算法特点
非抢占式:先来先服务调度算法是一种非抢占式的算法,即先进入就绪队列的进程先分配处理机运行。一旦一个进程占有了处理机,它就会一直运行下去,直到该进程完成工作或者因为等待某事件发生而不能继续运行时才释放处理机。
公平性:该算法相当公平,因为每个进程的请求都能依次得到处理,不会出现某一进程的请求长期得不到满足的情况。
简单易行:该算法只需要一个队列(FIFO),易于理解和实现。
三、算法时间计算
- 开始时间 = 如果提交时间早于等于上一个完成时间,则开始时间为上一个完成时间;(第一个作业的开始时间=提交时间,也就是下标为0)
- 完成时间 = 开始时间+运行时间 ;
- 周转时间 = 完成时间- 提交时间 ;
- 带权周转时间 = 周转时间 / 运行时间 ;
- 平均周转时间 = 周转时间总和 / 作业个数
- 平均带权周转时间 = 带权周转时间总和/ 作业个数
四、算法代码实现
1.结构体及结构体数组
struct JCB
{
int id; //作业号
double submittime; //提交时间
double runtime; //运行时间
double starttime; //开始时间
double finishtime; //完成时间
double cycletime; //周转时间
double qtt; //带权周转时间
};
struct JCB jcb[10];
2.排序算法函数
//直接插入排序
void InsertSort(int n)
{
for (int i = 0; i < n - 1; i++)
{
int end = i;
struct JCB tmp = jcb[end + 1];
while (end >= 0 && jcb[end].submittime > tmp.submittime)
{
jcb[end + 1] = jcb[end];//将大于要插入的数往后移
end--;
}
jcb[end + 1] = tmp;//插入到最后一位移动前的位置
}
}
3.FCFS算法函数
通俗易懂版:
//通俗易懂版本
void FCFS(int num)
{
for (int i = 0; i < num; i++)
{
if (i == 0)
{
jcb[i].starttime = jcb[i].submittime;//如果是第一个,则开始时间就等于提交时间
jcb[i].finishtime = jcb[i].starttime + jcb[i].runtime;//完成时间 =开始时间+运行时间 ;
jcb[i].cycletime = jcb[i].finishtime - jcb[i].submittime;//周转时间 = 完成时间- 提交时间 ;
jcb[i].qtt = jcb[i].cycletime / jcb[i].runtime;//周转时间 / 运行时间 ;
}
else
{
//如果提交时间早于等于上一个完成时间,则开始时间为上一个完成时间
if (jcb[i].submittime <= jcb[i - 1].finishtime)
{
jcb[i].starttime = jcb[i - 1].finishtime;
}
else
{
jcb[i].starttime = jcb[i].submittime;
}
jcb[i].finishtime = jcb[i].starttime + jcb[i].runtime;//完成时间 =开始时间+运行时间 ;
jcb[i].cycletime = jcb[i].finishtime - jcb[i].submittime;//周转时间 = 完成时间- 提交时间 ;
jcb[i].qtt = jcb[i].cycletime / jcb[i].runtime;//周转时间 / 运行时间 ;
}
}
}
简洁优化版:
//代码简洁优化版
void FCFS(int num)
{
for (int i = 0; i < num; i++)
{
if (i != 0 && jcb[i].submittime <= jcb[i - 1].finishtime)
{
jcb[i].starttime = jcb[i - 1].finishtime;
}
else
{
jcb[i].starttime = jcb[i].submittime;
}
jcb[i].finishtime = jcb[i].starttime + jcb[i].runtime;
jcb[i].cycletime = jcb[i].finishtime - jcb[i].submittime;
jcb[i].qtt = jcb[i].cycletime / jcb[i].runtime;
}
}
4.信息展示函数
void showinfo(int num)
{
double acycletime = 0.0;
double aqtt = 0.0;
printf("作业号\t提交时间\t运行时间\t开始时间\t完成时间\t周转时间\t带权周转时间\n");
for (int i = 0; i < num; i++)
{
printf("%d\t %0.2lf\t\t %0.2lf\t\t %0.2lf\t\t %0.2lf\t\t %0.2lf\t\t %0.2lf\n", jcb[i].id, jcb[i].submittime, jcb[i].runtime, jcb[i].starttime, jcb[i].finishtime, jcb[i].cycletime, jcb[i].qtt);
acycletime += jcb[i].cycletime;
aqtt += jcb[i].qtt;
}
printf("平均周转时间:%0.2lf\n", acycletime/num);
printf("平均带权周转时间:%0.2lf\n", aqtt/num);
}
5.main函数
int main()
{
int num;
printf("请输入进程个数:\n");
scanf("%d", &num);
printf("依次输入:\n作业号 到达时间 运行时间\n");
for (int i = 0; i < num; i++)
{
scanf("%d\t%lf\t%lf", &jcb[i].id, &jcb[i].submittime, &jcb[i].runtime);
}
InsertSort(num);
FCFS(num);
showinfo(num);
return 0;
}
五、实现效果
热门推荐
设计一个小型局域网方案(构建高效的局域网架构,实现无缝通信)
国债逆回购在哪里购买?元旦期间购买指南及最全教程
到千年古城肇庆,寻一座“砖的博物馆”
220V中间继电器接线图详解:原理、接线方法与工作判断
PHP集成环境大盘点:15款主流工具对比分析
全面对比:Steam Deck和Switch哪个更适合你?
如何定制个人数据库
挑选最佳运动耳机:品牌对比、佩戴舒适、防水耐用全攻略!
脑机启侦 | 神经元通过稳定的突触区域来保护及保存信息
【行为教育】5岁是建立安全意识好时机!专家建议:教孩子掌握5个危机处理方法
洞察股市趋势:均线系统背后的预测密码
2024中国创交会创新创业大赛发掘科创“潜力股”
如何理解货币基金的策略计算和风险控制?这种理解对理财规划有什么帮助?
水货是否违法?了解这些知识,避免踩坑
管理中如何给客户提建议
我的三角梅终于“不装树”,美呆了!诀窍:别惯着“多虐虐”
司美格鲁肽美国价格是欧洲的十倍多,中国即将进入价格战
玻璃房的安全性如何保障?玻璃房的结构设计对安全性的影响有哪些?
头面部推拿:缓解头晕头痛、改善睡眠质量的实用指南
200多度近视眼是否值得进行手术治疗?手术的必要性和结果分析
从古希腊到现代:犬儒主义的哲学之旅
如何选择适合的装修风格?这些风格的特点和适用场景是什么?
谜语育儿知识讲座
文本框长宽设置
排畸检查需要多少钱?大小排畸费用各不相同
Windows系统"CRITICAL_PROCESS_DIED"错误代码处理指南
在香港注册的企业是否属于居民企业?深度分析与适用指南
虚标续航,虚假宣传,任意锁车,经销商跑路……这些投诉引热议
从国民小轿车到停产:夏利汽车的兴衰史
呕吐太猛最后吐出血怎么修复