FCFS调度算法与SJF调度算法(C语言实现)
- FCFS调度算法的思想就是谁先来就谁先受到服务,这与餐厅排队买饭是一个道理。
- SJF调度算法是谁的服务时间短谁就先来。(举个例子,一个人山人海的餐厅里,都在那抢饭吃,很混乱,没人排队,谁吃的快谁就先吃)
代码
首先需要定义一个结构体
typedef struct pcb{int id; //进程idint come; //进程到达时间int deal; //进程服务时间int finish; //进程完成时间int cycleTime; //周转时间float powerTime; //带权周转时间
}PCB;
- 完成时间=服务时间+等待时间
- 周转时间=完成时间-到达时间
- 带权周转时间=周转时间/服务时间
因此需要得到服务时间、到达时间与等待时间才可以得到上面的所有内容,但等待时间可以通过本次服务进程的开始时间与上次服务进程的完成时间得到,因此需要有的是开始时间与服务时间就可以得出所有内容
FCFS调度算法需要对数组按come值进行从小到大排序(这里为了省事采用冒泡排序的思想,也可以用其他比较快的排序方法)
for(i = 0;i < n - 1; i++){for(j = i + 1; j < n; j++){if(pr[i].come > pr[j].come){temp = pr[i];pr[i] = pr[j];pr[j] = temp;}}}
排序完成后,对数组的第一个值进行计算(因为下一个进程的完成时间需要用到上一个进程的完成时间)
pr[0].finish = pr[0].come + pr[0].deal;pr[0].cycleTime = pr[0].finish - pr[0].come;pr[0].powerTime = pr[0].cycleTime * 1.0 / pr[0].deal * 1.0;
for(i = 1; i < n; i++){if(pr[i].come < pr[i-1].finish) //本次进程需要与上一个进程的完成时间进行比较pr[i].finish = pr[i-1].finish + pr[i].deal;elsepr[i].finish = pr[i].come + pr[i].deal;pr[i].cycleTime = pr[i].finish - pr[i].come;pr[i].powerTime = pr[i].cycleTime * 1.0 / pr[i].deal * 1.0;}
SJF调度算法需要注意到的是一开始需要找到先到达的进程(此时没进程需要处理,谁先来就先服务谁),需要找到come的最小值
PCB temp;for(i = 1; i < n; i++){if(pr[0].come > pr[i].come)k = i;}temp = pr[0];pr[0] = pr[k];pr[k] = temp;
接下来与FCFS调度算法类似,也是排序,不过这次是根据deal值排序
for(i = 1;i < n - 1; i++){ //第一个已经服务过了,从第二个开始for(j = i + 1; j < n; j++){if(pr[i].deal > pr[j].deal){temp = pr[i];pr[i] = pr[j];pr[j] = temp;}}}
完整代码
#include<stdio.h>
#include<stdlib.h>
typedef struct pcb{int id;int come;int deal;int finish;int cycleTime;float powerTime;
}PCB;
void fcfs(PCB pr[],int n){int i,j;PCB temp;for(i = 0;i < n - 1; i++){for(j = i + 1; j < n; j++){if(pr[i].come > pr[j].come){temp = pr[i];pr[i] = pr[j];pr[j] = temp;}}}pr[0].finish = pr[0].come + pr[0].deal;pr[0].cycleTime = pr[0].finish - pr[0].come;pr[0].powerTime = pr[0].cycleTime * 1.0 / pr[0].deal * 1.0;for(i = 1; i < n; i++){if(pr[i].come < pr[i-1].finish)pr[i].finish = pr[i-1].finish + pr[i].deal;elsepr[i].finish = pr[i].come + pr[i].deal;pr[i].cycleTime = pr[i].finish - pr[i].come;pr[i].powerTime = pr[i].cycleTime * 1.0 / pr[i].deal * 1.0;}for(i = 0; i < n; i++){printf("第%d个服务的是进程%d,开始服务时间%d,服务时间%d,结束时间%d,周转时间%d,带权周转时间%.2f\n",i + 1,pr[i].id,pr[i].come,pr[i].deal,pr[i].finish,pr[i].cycleTime,pr[i].powerTime);}
}
void sjf(PCB pr[], int n){int i,j,k = 0;PCB temp;for(i = 1; i < n; i++){if(pr[0].come > pr[i].come)k = i;}temp = pr[0];pr[0] = pr[k];pr[k] = temp;pr[0].finish = pr[0].come + pr[0].deal;pr[0].cycleTime = pr[0].finish - pr[0].come;pr[0].powerTime = pr[0].cycleTime * 1.0 / pr[0].deal * 1.0;for(i = 1;i < n - 1; i++){for(j = i + 1; j < n; j++){if(pr[i].deal > pr[j].deal){temp = pr[i];pr[i] = pr[j];pr[j] = temp;}}}for(i = 1; i < n; i++){if(pr[i].come < pr[i-1].finish)pr[i].finish = pr[i-1].finish + pr[i].deal;elsepr[i].finish = pr[i].come + pr[i].deal;pr[i].cycleTime = pr[i].finish - pr[i].come;pr[i].powerTime = pr[i].cycleTime * 1.0 / pr[i].deal * 1.0;}for(i = 0; i < n; i++){printf("第%d个服务的是进程%d,开始服务时间%d,服务时间%d,结束时间%d,周转时间%d,带权周转时间%.2f\n",i + 1,pr[i].id,pr[i].come,pr[i].deal,pr[i].finish,pr[i].cycleTime,pr[i].powerTime);}
}
int main(){int n,i,choose,flag = 1;PCB pr[20];printf("请输入进程个数:");scanf("%d",&n);for(i = 0; i < n; i++){printf("请输入第%d个的进程id与开始服务时间与服务时间",i + 1);scanf("%d%d%d",&pr[i].id,&pr[i].come,&pr[i].deal);}while(flag){printf("1、先来先服务\n2、短作业优先\n3、退出\n请输入选择:");scanf("%d",&choose);switch(choose){case 1:fcfs(pr,n); break;case 2:sjf(pr,n); break;default:flag = 0; break;}}return 0;
}
FCFS调度算法与SJF调度算法(C语言实现)相关推荐
- 处理机调度算法模拟实验——FCFS算法,SJF调度算法
处理机调度算法模拟实验 一.实验目的 本实验模拟在单处理机情况下的处理机调度算法,用某种编程语言实现先来先服务和最短作业优先调度算法的模拟. 二.实验原理 1.先来先服务调度算法原理: 先来先服务调度 ...
- c语言实现FCFS SJF算法,实现FCFS和SJF调度算法.docx
操作系统实验报告 实验一:作业调度 学院: 软件学院 专业: 软件工程 班级: 软件工程12-01 姓名: *** 学号:541213460157 实验一:作业调度 实现FCFS和SJF调度算法 [实 ...
- 实现FCFS和SJF调度算法(电梯调度算法详解)
实现FCFS和SJF调度算法 操作系统实验报告 实验一:作业调度 学院:软件学院 专业:软件工程 班级:软件工程12-01 姓名:*** 学号:541213460157 实验一:作业调度 实现FCFS ...
- sjf调度算法_如何通过静态方法预测SJF调度中未来过程的突发时间?
sjf调度算法 In SJF Scheduling, CPU is assigned to the process having the smallest burst time but it can ...
- c语言实现进程调度优先权调度算法和时间片轮转调度算法
** 1.算法原理 ** 时间片轮转调度算法 a.在时间片轮转调度算法中,系统根据先来先服务的原则,将所有的就绪进程排成一个就绪队列,并且每隔一段时间产生一次中断,激活系统中的进程调度程序,完成一次处 ...
- java语言实现的时间片轮转调度算法和动态优先级调度算法
java语言实现的时间片轮转调度算法和动态优先级调度算法 一.代码: 二.程序运行演示 总结 贪方便用java实现老师的作业,虽然写的乱七八糟的,但是也想发出来给人看看,评论喷我吧!. 一.代码: 作 ...
- 3.处理机调度——作业调度算法与进程调度算法
1.作业调度与进程调度算法 作业调度算法: 先来先服务调度算法(FCFS) 短作业优先调度算法(SJF) 优先级调度算法 高响应比优先调度算法 进程调度算法: 先来先服务调度算法(FCFS) 短进程优 ...
- 2.2.5 操作系统之调度算法(时间片轮转调度算法、优先级调度算法、多级反馈队列调度算法)
文章目录 0.思维导图 1.时间片轮转---RR 2.优先级调度算法 3.多级反馈队列调度算法 4.三种算法的对比总结 0.思维导图 1.时间片轮转-RR Round-Robin 时间片为2举例 以时 ...
- FCFS算法和SJF算法
FCFS算法和SJF算法(非抢占式) 此处主要说一下SJF算法,FCFS算法仅仅按到达时间选择或者排序即可 SJF算法设计思路: 我看了看大多数人写的SJF算法,有些用的是排序算法,虽然能做出来,但是 ...
最新文章
- [javaSE] 网络编程(URLConnection)
- 如何制止OpenSSH漏洞?
- linux编辑文本文件aa的命令,linux入门必须掌握的命令--文本文件编辑
- 详解 height 和 width 属性
- jsp+左间距_交互规范:栅格系统让页面元素间距更统一
- windows 架设SVN服务器
- java MD5完整加解密工具类
- citrix终端linux,Citrix XenDesktop发布Centos 7.2桌面(六)--安装Linux VDA
- 全球最大照片网站 Unsplash 开放图片检索数据集
- 某土豪公司很糟糕的面试体验
- 北京计算机暑期培训,北京暑期计算机培训心得体会.doc
- 关于textarea打印问题
- 鸟哥的linux私房菜_linux磁盘与文件系统管理
- 怎样更换手机壁纸?2022更换手机壁纸软件大全
- 静音计算机方案,如何解决计算机突然静音的问题
- (二十四) 单链表的逆置(java)
- 应用程序如何使用驱动程序
- ESP8266/ESP32 网络温控器监控 Web服务器-基于温度控制输出
- 提笔忘字低龄化 电脑难辞其咎
- 为什么cfg文件打开是乱码