算法介绍

  1. 先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调度,也可用于进程调度。当在作业调度中采用该算法时,每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业,将它们调入内存,为它们分配资源、创建进程,然后放入就绪队列。在进程调度中采用FCFS算法时,则每次调度是从就绪队列中选择一个最先进入该队列的进程,为之分配处理机,使之投入运行。该进程一直运行到完成或发生某事件而阻塞后才放弃处理机。

  2. 短作业优先(SJF)算法是以进入系统的作业所要求的CPU时间为标准,是指对短作业或者短进程优先调度的算法,将每个进程与其估计运行时间进行关联选取估计计算时间最短的作业投入运行。

内容概括

设计程序模拟进程的先来先服务FCFS和短作业优先SJF调度过程。假设有n个进程分别在T1, … ,Tn时刻到达系统,它们需要的服务时间分别为S1, … ,Sn。分别采用先来先服务FCFS和短作业优先SJF进程调度算法进行调度,计算每个进程的完成时间,周转时间和带权周转时间,并且统计n个进程的平均周转时间和平均带权周转时间。

步骤及代码实现

  1. 定义进程(作业)结构体
#include<stdio.h>
#include<string.h>struct job
{char name[10];      //作业的名字int starttime;      //作业到达系统时间int needtime;       //作业服务时间int runtime;        //作业周转时间int endtime;        //作业结束时间double dqzz_time;    //带权周转时间};
  1. 定义调用调度函数和结果输出函数。
void fcfs(struct job jobs[50],int n);
void sjf(struct job jobs[50],int n);
void print(struct job jobs[50],int n);
  1. 通过main选择调度算法,并实现所需数据的输入,main函数中调用调度函数和结果输出函数。
void main()
{struct job jobs[50];int n,i; //n个作业int flag;printf("请选择调度算法,1:先来先服务 2:短作业优先:");scanf("%d",&flag);printf("请输入作业个数:");scanf("%d",&n);printf("请输入各作业的信息(格式:作业名 到达时间 服务时间):\n");for(i=0;i<n;i++){scanf("%s",jobs[i].name); //作业名scanf("%d",&jobs[i].starttime);//到达时间scanf("%d",&jobs[i].needtime);//运行(服务时间)时间}printf("\n");if(flag==1){fcfs(jobs,n);printf("先来先服务(FCFS)算法运行结果:\n");print(jobs,n);}else{sjf(jobs,n);printf("最短作业优先算法(SJF)运行结果:\n");print(jobs,n);}
}
  1. 通过先来先服务算法实现定义的fcfs函数,先按照达到时间对作业进行排序,再计算每个作业的结束时间、周转时间及带权周转时间。
void fcfs(struct job jobs[50],int n)
{int i=0,j=0;char t_name[10];int t_time;            for(i=0;i<n;i++) //按作业到达系统时间进行排序,最早到达的排在最前面 {for(j=i;j<n;j++) //按作业到达系统时间进行排序,最早到达的排在最前面 {if(jobs[j].starttime<jobs[i].starttime){   //把到达时间早的赋值到t_timet_time=jobs[j].starttime;jobs[j].starttime=jobs[i].starttime;jobs[i].starttime=t_time;//把到达时间早的赋值到t_timet_time=jobs[j].needtime;jobs[j].needtime=jobs[i].needtime;jobs[i].needtime=t_time;strcpy(t_name,jobs[j].name);strcpy(jobs[j].name,jobs[i].name);strcpy(jobs[i].name,t_name);//在t_name数组中排序}} }  for(i=0;i<n;i++){if(i==0) {      //第一个进程jobs[i].runtime=jobs[i].needtime;          //周转时间=服务时间jobs[i].endtime=jobs[i].starttime+jobs[i].needtime;     //结束时间=到达时间+服务时间    }else if(jobs[i].starttime>jobs[i-1].endtime){  //第i个进程到达系统时,第i-1个进程已运行完毕jobs[i].runtime=jobs[i].needtime;  jobs[i].endtime=jobs[i].starttime+jobs[i].needtime;  }else{                              //第i个进程到达系统时,第i-1个进程未运行完毕jobs[i].runtime=jobs[i].needtime+jobs[i-1].endtime-jobs[i].starttime; //周转时间=服务时间+前一个的结束时间-到达时间jobs[i].endtime=jobs[i].starttime+jobs[i].runtime;  //结束时间=到达时间+周转时间}jobs[i].dqzz_time=jobs[i].runtime*1.0/jobs[i].needtime;//带权周转时间=周转时间/服务时间}
}
  1. 通过短作业优先算法实现定义的sjf函数,先按照达到时间对作业进行排序,确定第一个作业,再根据其他作业所需要的服务时间确定下一个作业,然后计算每个作业的结束时间、周转时间及带权周转时间。
void sjf(struct job jobs[50],int n)
{int i=0,j=0;char t_name[10];int t_time;            for(i=0;i<n;i++) //按作业到达系统时间进行排序,最早到达的排在最前面 {for(j=i;j<n;j++) //按作业到达系统时间进行排序,最早到达的排在最前面 {if(jobs[j].starttime<jobs[i].starttime){   //把到达时间早的赋值到t_timet_time=jobs[j].starttime;jobs[j].starttime=jobs[i].starttime;jobs[i].starttime=t_time;//把到达时间早的赋值到t_timet_time=jobs[j].needtime;jobs[j].needtime=jobs[i].needtime;jobs[i].needtime=t_time;strcpy(t_name,jobs[j].name);strcpy(jobs[j].name,jobs[i].name);strcpy(jobs[i].name,t_name);//在t_name数组中排序}} }                      jobs[0].endtime=jobs[0].starttime+jobs[0].needtime;//结束时间=到达时间+服务时间jobs[0].runtime=jobs[0].needtime;//周转时间=服务时间jobs[0].dqzz_time=jobs[0].runtime*1.0/jobs[0].needtime;//带权周转时间=周转时间/服务时间for(i=1;i<n;i++){for(j=i;j<n;j++){          if(jobs[i-1].endtime>jobs[j].starttime&&jobs[j].needtime<jobs[i].needtime){ t_time=jobs[i].starttime;jobs[i].starttime=jobs[j].starttime;jobs[j].starttime=t_time;t_time=jobs[i].needtime;jobs[i].needtime=jobs[j].needtime;jobs[j].needtime=t_time;strcpy(t_name,jobs[i].name);   //将第二个参数的值复制给第一个参数,返回第一个参数strcpy(jobs[i].name,jobs[j].name);strcpy(jobs[j].name,t_name);}                 //按最短运行时间排序}if(jobs[i].starttime>jobs[i-1].endtime){                                      //第i个进程到达系统时,第i-1个进程已运行完毕jobs[i].endtime=jobs[i].starttime+jobs[i].needtime; jobs[i].runtime=jobs[i].needtime;}else{jobs[i].endtime=jobs[i-1].endtime+jobs[i].needtime;jobs[i].runtime=jobs[i].endtime-jobs[i].starttime; }jobs[i].dqzz_time=jobs[i].runtime*1.0/jobs[i].needtime;}
}
  1. 输出函数实现
void print(struct job jobs[50],int n)
{int i;double avertime;double dqzz_avertime;int sum_runtime=0;double  sum_time=0.00;printf("作业名  到达时间 运行时间 完成时间 周转时间 带权周转时间\n");for(i=0;i<n;i++){printf("%s       %2d        %2d        %2d        %2d        %.2f\n",jobs[i].name,jobs[i].starttime,jobs[i].needtime,jobs[i].endtime,jobs[i].runtime,jobs[i].dqzz_time);sum_runtime=sum_runtime+jobs[i].runtime;sum_time=sum_time+jobs[i].dqzz_time;}avertime=sum_runtime*1.0/n;dqzz_avertime=sum_time*1.000/n;printf("平均周转时间:%.2f \n",avertime);printf("平均带权周转时间:%.3f \n",dqzz_avertime);printf("\n");
}

样例展示



参考:https://blog.csdn.net/Hiroomi/article/details/107819906

先来先服务和短作业优先调度算法-C语言实现相关推荐

  1. 短作业优先算法c语言实现,OS短作业优先调度算法C语言

    OS短作业优先调度算法C语言 采用短作业优先调度算法调度程序 学 号: 姓 名: 专 业: 指导老师: 日 期: 目录 一.实验题目3 二.课程设计的目的3 三.设计内容3 四.设计要求3 五.主要数 ...

  2. 先来先服务和短作业优先调度算法

    先来先服务调度算法:系统按照作业到达的先后次序来进行调度,或者说它优先考虑在系统中等待时间最长的作业,而不管该作业所需执行时间的长短,从后备作业队列中选择几个最先进入该队列的作业,将它们调入内存,为它 ...

  3. 操作系统:先来先服务调度算法以及短作业优先调度算法C语言实现

    FCFS(先来先服务)和SJF(短作业优先)调度算法 先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调度,也可用于进程调度.当在作业调度中采用该算法时,每次调度都是从后备作业 ...

  4. 操作系统第一次实验-短作业优先调度算法

    一.实验目的: 目的:了解并掌握作业调度的功能,熟悉并掌握各种作业调度算法. 任务:模拟实现先来先服务或者短作业优先调度算法. 二.实验内容: 模拟实现SJF调度. 设置作业体:作业名,作业的到达时间 ...

  5. 软件测试——进程调度(短作业优先调度算法+先来先服务算法)测试

    源代码 被测代码 Schedule package net.mooctest;import java.util.ArrayList; import java.util.List;public clas ...

  6. 设有 4道作业,它们的提交时间及执行时间如下,试计算在单道程序环境下,采用先来先服务调度算法和短作业优先调度算法时的平均周转时间和平均带权周转时间,并指出它们的调度顺序。

    处理机调度算法 题目: 设有 4道作业,它们的提交时间及执行时间如下: 试计算在单道程序环境下,采用先来先服务调度算法和短作业优先调度算法时的平均周转时间和平均带权周转时间,并指出它们的调度顺序. 先 ...

  7. C#进程调度的模拟实现:模拟先来先服务调度算法、短作业优先调度算法和优先级调度算法(考虑非抢占式和抢占式),进行算法评价,输出调度结果和算法评价指标。

    没什么水平,希望能帮到你 环境:visual studio 2019 附带工程资源:C#进程调度的模拟实现附带资源-C#文档类资源-CSDN下载 先来先服务的调度算法:是一种非抢占式的算法,先来先服务 ...

  8. 计算机操作原理进程调度算法---先来先服务,短进程优先(C语言)

    目录 先来先服务调度算法: 短进程优先调度算法: 两种进程调度算法优缺点 思维导图 程序代码: 先来先服务调度算法: 先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调度,也可 ...

  9. 操作系统进程调度算法(先来先服务,短作业优先算法(SJF))linux下(附源码)

    先来先服务算法(FCFS) FCFS是最简单的调度算法,既可以用作作业调度,也可以用作进程调度 这种算法优先考虑系统中等待时间最长的作业(进程),而不管作业所需执行时间长短, 做法是从后备队列中选择几 ...

最新文章

  1. 怎样才不浪费IP的价值?
  2. 2018-2019-1 20165335 《信息安全系统设计基础》第六周学习总结
  3. J - 哈密顿绕行世界问题
  4. lab 常用配置参数 代码片段
  5. [前台]---js重复上传一张图片两次,第二次失败的解决办法和思路
  6. Spring3集成Swagger2遇到问题总结
  7. vue报错问题记录1-Cannot read property '0' of null
  8. poj 1696 Space Ant
  9. 2021年文山州一中高考成绩查询,云南文山第一中学2021年录取分数线
  10. Pwn-10月25-Hitcon(三)
  11. 湖南工大计算机学院大一分班,大一新生入学计算机分级教学考试会影响分班吗?...
  12. 1月15日云栖精选夜读 | 重磅公开!阿里语音识别模型端核心技术,让你“听”见未来...
  13. TSL2591STM32固件库开发
  14. 黑盒测试方法之错误推测法概述
  15. 语料标注平台BRAT安装说明
  16. 白杨SEO:从百度一下到抖音搜索关键词进行查找信息,挖掘用户需求的新机会你知道吗?
  17. Flutter 使用自定义 fluro 路由转场动画实现个性化页面切换
  18. 通俗地讲解目标检测中AP指标
  19. android H264(3): 流媒体播放器设计方案
  20. JL-03-Q9 自动气象站 常见气象9参数 空气温湿度 风速风向 雨量光照 大气压力 土壤温湿度

热门文章

  1. Linx常见基本指令
  2. Android自定义view --之--仿“滴滴打车”等车倒计时
  3. 基于dockerfile制作apache镜像
  4. linux 运行asf云挂卡,Linux下使用ASF工具 Steam 挂卡的配置使用
  5. error: RPC failed; HTTP 502 curl 22 The requested URL returned error: 502 Proxy Error fatal: 报错
  6. 拿不到大厂offer ?简历你就写错了!(另附面试官微信)
  7. 未来已来!马斯克宣布:脑机交互实现重大突破!
  8. LiveGBS国标GB/T28181视频平台支持级联到海康平台大华宇视等第三方国标平台对接政务公安内网国标视频平台
  9. 制作自己的Linux系统与启动光盘(3)
  10. JavaScript Sanitizer API:原生WEB安全API出现啦