先来先服务和高响应比优先调度算法C语言实现

1、进程调度与作业调度的区别:

作业调度:根据作业控制块(JCB)中的信息,检查系统中的资源是否满足作业对资源的需求,以及按照一定的调度算法,从外存的后备队列中选取某些作业调入内存,并为它们创建进程,分配必要的资源。然后再将新创建的进程排在就绪队列上等待调度。

进程调度:保存当前进程的处理机的现场信息,如程序计数器、多个通用寄存器中的内容等,然后按某种算法从就绪队列中选取一个进程,将其状态转换为运行状态,再把进程控制块内有关处理机现场的信息装入处理器相应的各个寄存器中,把处理器的控制权交予该进程,让它从上次的断点处恢复运行。

进程调度时让某个就绪状态的进程到处理机上运行,而作业调度只是使作业具有了竞争处理机的机会。

2、单道批处理系统与多道批处理系统的区别:

(1)单道批处理系统(Simple Batch Processing System):系统对作业的处理是成批进行的,但在内存中始终只保持一道作业。

特点:自动性、顺序性、单道性

主要问题:CPU与I/O设备忙闲不均,对计算为主的作业,外设空闲;对I/O为主的作业,CPU空闲。

多道批处理系统(Multiprogrammed Batch Processing System):在内存中同时存放几个作业,宏观上并行运行——都处于运行状态,但都没运行完;微观上串行运行——各作业交替使用CPU

特点:调度性、无序性、多道性

主要问题:①作业平均周转时间长:短作业的周转时间显著增长;

②无交互能力:整个作业完成后或者中间出错时,才与用户交互,不利于调试和修改。

3、用到的公式:

完成时间 = 开始时间 +需要运行时间

周转时间 = 完成时间 -到达时间

带权周转时间 = 需要运行时间/周转时间

等待时间 = 当前时间 -到达时间

优先权 = (等待时间 +需要运行时间) /需要运行时间

4、高响应比优先算法特点:

①当等待时间相同时,短进程的优先权高;

②当需要运行时间相同时,作业的优先权又取决于等待时间,相当于先到先服务;

③长作业的优先级可以随着等待时间的增加而提高,因此长作业等待一段时间后仍能得到调度。

5、源代码:

#include

#include

#include

#define WAIT "Wait"//就绪状态

#define RUN "Run"//运行状态

#define FINISH "Finish"//完成状态

#define JOBNUMBER 5 //设置进程测试数为5

typedef struct JCB{

char jobName[10];//作业名

int arriveTime;//到达时间

int runTime;//需要运行时间

int startTime;//开始时间

int endTime;//完成时间

int turnoverTime;//周转时间

float useWeightTurnoverTime;//带权周转时间

char processStatus[10];//进程状态

};

static int currentTime = 0;//当前时间

static int finishNumber = 0;//进程完成数量

char JobArray[JOBNUMBER][10];//存放数组名信息的二元数组

float priority[JOBNUMBER];//存放进程优先级的一元数组

//创建JCB

void createJCB(struct JCB* jcb){

freopen("input.txt","r",stdin);

printf("从文件中读入三个参数的数据:\n");

printf("作业号 到达时间 需要运行时间\n");

for(int i = 0; i < 5; i++){

scanf("%s", &jcb[i].jobName);//作业号

scanf("%d", &jcb[i].arriveTime);//到达时间

scanf("%d", &jcb[i].runTime);//需要运行时间

jcb[i].startTime = 0;

jcb[i].endTime = 0;

jcb[i].turnoverTime = 0;

jcb[i].useWeightTurnoverTime = 0.0;

strcpy(jcb[i].processStatus, WAIT);

printf("%s\t%d\t%d\n",jcb[i].jobName, jcb[i].arriveTime,jcb[i].runTime);

}

printf("---------------------------------------------\n");

freopen("CON", "r", stdin);

}

//打印用途

void printJob(struct JCB* jcb){

printf("当前时间为%d\n", currentTime);

printf("作业号 到达时间 需要运行时间 开始时间 完成时间 周转时间 带权周转时间 进程状态\n");

for(int i = 0; i < JOBNUMBER; i++){

if(strcmp(jcb[i].processStatus, FINISH) == 0)//如果进程为finish状态,这样输出

printf("%s\t%d\t%4d\t\t%d\t%d\t %d\t %.2f\t %s\n", jcb[i].jobName, jcb[i].arriveTime, jcb[i].runTime, jcb[i].startTime, jcb[i].endTime, jcb[i].turnoverTime, jcb[i].useWeightTurnoverTime, jcb[i].processStatus);

else if(strcmp(jcb[i].processStatus, RUN) == 0)//如果进程为run状态,这样输出

printf("%s\t%d\t%4d\t\t%d\t运行中\t none\t none %s\n", jcb[i].jobName, jcb[i].arriveTime, jcb[i].runTime, jcb[i].startTime, jcb[i].processStatus);

else //如果进程为wait状态,这样输出

printf("%s\t%d\t%4d\t\t未运行\tnone\t none\t none %s\n", jcb[i].jobName, jcb[i].arriveTime, jcb[i].runTime, jcb[i].processStatus);

}

printf("---------------------------------------------\n");

}

//计算平均带权周转时间

float weightTurnoverTimeCount(struct JCB* jcb){

float sum = 0.0;

for(int i = 0; i < JOBNUMBER; i++)

sum += jcb[i].useWeightTurnoverTime;

return sum / JOBNUMBER;

}

//计算平均周转时间

float turnOverTimeCount(struct JCB* jcb){

float sum = 0.0;

for(int i = 0; i < JOBNUMBER; i++)

sum += jcb[i].turnoverTime;

return sum / JOBNUMBER;

}

//比较各个进程之间的到达时间,按升序排列

void compare(struct JCB* jcb){

for(int i = 0; i < JOBNUMBER; i++){

int min = jcb[i].arriveTime, minIndex = i;

for(int j = i + 1; j < JOBNUMBER; j++){

if(jcb[j].arriveTime < min){

min = jcb[j].arriveTime;

minIndex = j;

}

}

struct JCB temp = jcb[i];

jcb[i] = jcb[minIndex];

jcb[minIndex] = temp;

}

}

//打印进程调度顺序,平均周转时间及平均带权周转时间

void printInfo(struct JCB* jcb){

printf("1、进程调度顺序为:%s -> %s -> %s -> %s -> %s\n", JobArray[0], JobArray[1], JobArray[2], JobArray[3], JobArray[4]);

printf("2、平均周转时间为:%.2f\n",turnOverTimeCount(jcb));

printf("3、平均带权周转时间为:%.2f\n", weightTurnoverTimeCount(jcb));

printf("------------------测试完毕 版权归邓钦艺所有---------\n");

}

//两算法共同循环遍历部分

void loop(struct JCB* jcb, int i){

jcb[i].startTime = currentTime;

jcb[i].endTime = jcb[i].startTime + jcb[i].runTime;

jcb[i].turnoverTime = jcb[i].endTime - jcb[i].arriveTime;

jcb[i].useWeightTurnoverTime = jcb[i].runTime * 1.0 / jcb[i].turnoverTime;

strcpy(jcb[i].processStatus, RUN);

while(true){

if(currentTime == jcb[i].endTime){

strcpy(jcb[i].processStatus, FINISH);

finishNumber++;

if(finishNumber == JOBNUMBER)

printJob(jcb);

currentTime--;

break;

}

else{

printJob(jcb);

currentTime++;

}

}

}

//先来先服务调度算法

void firstComeFirstServed(struct JCB* jcb){

createJCB(jcb);

compare(jcb);

int i = 0;

//进程调度currentTime每次加1,直到进程全部被调度完成为止

for(; finishNumber != JOBNUMBER; currentTime++){

if(currentTime < jcb[0].arriveTime)//当前时间小于第一个节点到来时间时,直接打印

printJob(jcb);

else{

strcpy(JobArray[i], jcb[i].jobName);

loop(jcb, i);

i++;

}

}

printInfo(jcb);//打印进程调度顺序,平均周转时间及平均带权周转时间

currentTime = 0;//静态变量当前时间置位

finishNumber = 0;//静态变量完成进程数量置位

}

//高响应比优先调度算法

void highestResponseRatioNext(struct JCB* jcb){

createJCB(jcb);

compare(jcb);

int i = 0, j = 0;

for(; finishNumber != JOBNUMBER; currentTime++){

float maxPriority = 0.0;

int indexPriority = 0;

if(currentTime < jcb[0].arriveTime)//当前时间小于第一个节点到来时间时,直接打印

printJob(jcb);

else{

for(int i = 0; i < JOBNUMBER; i++){

if(strcmp(jcb[i].processStatus, FINISH) != 0){

int waitTime = currentTime - jcb[i].arriveTime;

priority[i] = (waitTime + jcb[i].runTime) / jcb[i].runTime;

if(priority[i] > maxPriority){

maxPriority = priority[i];

indexPriority = i;

}

}

}

strcpy(JobArray[j++], jcb[indexPriority].jobName);

loop(jcb, indexPriority);

}

}

printInfo(jcb);//打印进程调度顺序,平均周转时间及平均带权周转时间

currentTime = 0;//当前时间置位

finishNumber = 0;//完成进程数量置位

}

//菜单函数

void menu(struct JCB* jcb){

int input;

while(true){

printf("------------3114005847 邓钦艺-----------------\n");

printf("| 1、先来先服务调度算法 |\n");

printf("| 2、响应比高者优先调度算法 |\n");

printf("| 3、退出 |\n");

printf("----------------------------------------------\n");

printf("请输入序号以继续程序:");

scanf("%d", &input);

switch(input){

case 1:firstComeFirstServed(jcb);

break;

case 2:highestResponseRatioNext(jcb);

break;

case 3:

exit(0);

default:printf("输入有误,请重新输入!!!\n");

break;

}

}

}

//主函数

int main(){

struct JCB jcb[JOBNUMBER];

menu(jcb);

system("pause");

return 0;

}

6、运行结果:

①测试用例:其中三个参数分别是作业名称,到达时间以及需要运行时间

②主菜单显示:

③先来先服务算法调度结果:

④高响应比优先算法调度:

c语言实现作业调度先来先服务和短进程优先,先来先服务和高响应比优先调度算法C语言实现...相关推荐

  1. 2.2.4 操作系统之作业/进程调度算法(FCFS先来先服务、SJF短作业优先、HRRN高响应比优先)

    文章目录 0.思维导图 1.先来先服务---FCFS 2.短作业优先---SJF 3.高响应比优先---HRRN 4.三种算法的对比和总结 0.思维导图 1.先来先服务-FCFS First come ...

  2. 调度算法——先来先服务(FCFS)、短作业优先(SJF)、高响应比优先(HRRN) 例题详细!!!

    文章目录 前言 知识总览 先来先服务(FCFS, First Come First Serve) 短作业优先(SJF, Shortest Job First) 对FCFS和SJF两种算法的思考 高响应 ...

  3. 先来先服务和高响应比优先调度算法C语言实现

    先来先服务和高响应比优先调度算法C语言实现 目录: 1.进程调度与作业调度的区别: 2.单道批处理系统与多道批处理系统的区别: 3.程序设计用到的公式: 4.高响应比优先算法特点: 5.源代码示例: ...

  4. 作业调度算法【平均周转时间、平均带权周转时间、先来先服务FCFS、短作业优先SJF、高优先权(级)算法FPF、高响应比优先算法HRRN】

    文章目录 先来先服务算法(FCFS) 短作业优先算法(SJF).短进程优先算法(SPF) 周转时间和带权周转时间 高优先权(级)调度算法FPF 高响应比优先调度算法HRRN 先来先服务算法(FCFS) ...

  5. 十一、FCFS(先来先服务)、SJF(短作业优先)、HRRN(高响应比优先)

    一.知识总览 二.先来先服务(FCFS) **注意:**针对于先来先服务算法某些作业(或进程)平均周转时间长的缺点,提出了短作业优先的算法(SJF) 三.短作业优先(SJF) 1.非抢占式的短作业优先 ...

  6. 【学习笔记】第二章——调度算法:先来先服务FCFS、短作业优先SJF、高响应比HRRN

    文章目录 一. 先来先服务(FCFS) 二. 短作业优先(SJF) 三. 高响应比优先 1. 对前面两种算法的思考 2. 描述 四. 一.二.三总结 例子都要手动写一遍哦-这三个是供早期的批处理系统使 ...

  7. 《操作系统》实验三:高响应比优先调度和时间片轮转RR进程调度算法

    [实验题目]:高响应比优先调度和时间片轮转RR进程调度算法 [实验学时]:4学时 [实验目的] 通过这次实验,加深对进程调度概念的理解,进一步掌握比FCFS和SJF更为复杂的进程调度算法的实现方法. ...

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

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

  9. 操作系统之进程管理:6、调度算法(先来先服务FCFS、最短作业优先SJF、最高响应比优先HRRN、时间片轮转法、优先级调度、多级反馈队列)

    6.调度算法 适用于早期批处理机系统的调度算法 思维导图 1.先来先服务FCFS 2.最短作业优先SJF 非抢占式最短作业优先 抢占式最短作业优先(最短剩余时间优先算法) 注 3.最高响应比优先HRR ...

  10. 先来先服务算法、运行时间最短者优先算法和最高响应比优先调度算法_CPU的调度器scheduler...

    处理器作为计算机系统里的一种资源,也是需要管理,从而调度分配给需要的程序以达到最高效率,所以调度器应运而生. 1. 调度器overview 调度器本身也是一个程序,目的是为了给执行用户的程序提供资源, ...

最新文章

  1. 努力就要晒出来,13周年订阅专栏送图书/T恤晒单集结号!!!
  2. Android使用ActionBar和ViewPager切换页面
  3. VTK:PolyData之ConnectivityFilter_LargestRegion
  4. 【翻译】.NET 5 Preview 1 发布
  5. Provisioning Services 7.8 入门系列教程之十一 通过版本控制自动更新虚拟磁盘
  6. check-lxdialog.sh: line 3: $'\r': command not found
  7. Python中添加中文注释报错SyntaxError: Non-UTF-8 code starting with '\xc1'
  8. citrix+netscaler配置第一次培训
  9. keil5中如何实时查看变量值
  10. Linux基础——怎么样从 Windows 通过 SSH 远程 Linux
  11. 10-08 长假结束
  12. java sun包无法引用_关于java包的问题,自己创建一个包,里面放了源文件,却包外无法引用:具体见问题补充...
  13. android ide 下载
  14. javaScript视频弹幕
  15. 【测绘程序设计】Excel度分秒(° ‘ “)转换度(°)模板附代码超实用版
  16. 奇偶数求和:输入任意个正整数(以输入负数表示结束输入),分别求出所有的奇数之和,所有的偶数之和。 示例: 输入格式:1 2 3 4 -1 输出格式:sumodd=4 sumeven=
  17. 宋祖至崖山--中华史19《风流南宋》读后记
  18. android多行文本输入,android EditText多行文本输入的若干问题
  19. C语言----隐藏代码文件
  20. java中super用来定义父类,定义子类必须使用的关键字是 在java中子类若要继承父类,需要使用的关键字是什么...

热门文章

  1. 苹果激活锁功能可被长字符串溢出
  2. 2020年MySQL数据库面试题(50道题含答案和思维导图总结)
  3. 二次规划_1_——Lagrange方法
  4. web前端、个人简历模板、个人简历_优秀个人简历模板
  5. Latex所有数学符号一览
  6. 黑群晖docker清理缓存_群晖Docker半洗白 不关机快速修改sn/mac方法
  7. dosbox详细安装级及使用
  8. 联想Y9000X Opencore引导黑苹果Catalina10.15.6安装教程
  9. java即时通讯源码 IM即时通讯源码 IM源码 安卓苹果原生APP源码 带音视频无标题】
  10. 测试金士顿固态硬盘软件,金士顿固态硬盘优化工具(Kingston Toolbox)