目录
一、实验要求
二、实验内容
三、实验过程
1、实验过程中的存储结构和关键函数
2、主要程序段分析
四、实验结果展示
四、实验分析
编程完成对先来先服务、短作业优先和高响应比优先三种作业调度算法,并在实验报告中分析这三种方法的特性。
1、模拟系统随时都可能会收到作业,在执行作业的过程中也是要实时能够接收到新提交的作业,并更新加入作业后备队列中。
2、模拟系统作业调度的流程,在系统空闲时,有作业来会触发调度,完成一个作业后,也会触发调度。
3、模拟三种调度算法的调度过程,以时间顺序展示整个调度过程中系统正在进行的操作,计算各个作业完成的时间、周转时间、带权周转时间等等,同时在这个过程中允许有新的作业提交。
4、比较分析这三种作业调度算法的特点。
存储结构:
在作业JCB的存储结构上选择了结构体的形式,方便对一个JCB信息的管理,以及在写代码的过程中对信息内容的修改等。
由于作业被系统执行后会从后备队列中删除,所以此处是为了后面分析,保存一下完成的作业的信息。
关键函数:
void FCFS() //先来先服务调度函数
void SJF() //短作业优先调度函数
void HRRN() //高响应比调度函数
void get_backup() //这一时刻如果有新提交的作业,则存入后备队列
void remove(int k) //从后备队列中移除选择执行的作业
int get_HRR(float ft) //计算ft时刻后备队列中所有作业的响应比
void get_donejob(char n,float at,float rt,float ft)//记录已经完成的作业信息
void getjob() //模拟随时提交随机的作业
void createJCB() //为作业创建JCB
①这个函数并不是创建一个后备作业队列,而是随机产生一些作业的内容,随机产生一个这些作业被提交给系统的时间t,然后在后续模拟作业调度时,采用按照系统时间T推进的方式,当T=t的时候表示向系统提交新作业,然后系统再进行对这个作业的读取和放入后备队列等操作,用随机函数生成时间t来模拟系统随时可能收到新提交的作业的情况。
②T时刻如果有新作业提交,则加入作业后备队列,并输出提示和更新后的作业后备队列。
③作业后备队列中的作业一旦被系统开始执行,就要移出后备队列。
④在作业被执行完之后存储它执行的过程中产生的信息。
⑤先来先服务调度算法
算法思想:按时间展示整个调度过程。首先先查看此时作业后备队列中是否有就绪的作业,如果没有则输出此时系统空闲,时间继续流逝,直到后备作业队列有就绪的作业。由于作业后备队列就是按照作业来到的时间依次存储的,所以只需要每次调度后备队列的第一个作业执行,然后将这个作业从后备队列中移出,如果执行完一个作业之后后备队列为空则重复输出等待提示的操作,循环执行这个过程即可。但在这个过程中T每次增加都会调用get_backup()表示系统在执行作业的同时也能够随时接收新提交的作业,每次调用下一个作业前都会调用get_donejob函数存储刚执行完毕的作业的信息。
在这个程序中,我将第一个执行的作业单独操作,没有放入循环内只是为了在系统每次调用下一个作业的时候输出分隔提示开始执行下一个作业,实际上放入循环内执行也是可以的(以下两个算法均做了同样的处理)。
⑥短作业优先调度
首先定义一个函数,每次遍历后备队列找到最短的作业。
算法思想:实现SJF的算法思想和FCFS的是完全一样的,只是在每次选取下一个作业的时候不是直接取后备队列中的第一个,而是调用find_shortest()找到最短作业的在后备队列中的下标取出。同样地,这个过程中每个时刻也是允许有新作业提交的。
⑦高响应比算法
首先定义一个函数计算ft时刻,后备队列中每个作业的响应比。
算法思想:实现HRRN的算法思想也和FCFS的是基本一样的,只是在每一个作业运行完毕后存储了改作业完成的时间,然后调用get_HRR函数,计算此时后备队列中每个作业的响应比,返回其中响应比最高的作业在后备队列中的数组下标,作为下一个调度的作业。同样地,这个过程中每个时刻也是允许有新作业提交的。
⑧主函数
①FCFS作业调度算法
平均周转时间:10.25
平均带权周转时间:1.81
②SJF算法
平均周转时间:11.6
平均带权周转时间:2.432
③HRRN算法
平均周转时间:7.8
平均带权周转时间:3.981
针对三种算法分别分析:
FCFS调度算法实现起来非常简单,但总体效率不高,排在长作业之后的作业就需要等待很长的时间,从而导致它的带权周转时间很大,对这样的短作业用户体验非常不好。对长作业有利,对短作业不利。
SJF调度算法能够有效降低作业的平均等待时间,因此缩短了平均周转时间,但显然这种算法对长作业是不利的,一个长作业可能要等待很久才能够被执行,并且没有考虑作业的紧迫程度。除此之外,实际上的作业需要的运行实际是估计出来的,所以这种算法虽然算法上容易实现,但现实中是不容易实现的。
HRRN调度算法既考虑了作业的等待时间,又考虑了作业的运行时间,是一种动态优先级调度算法(每一个时刻的响应比都是不同的)。它实际上是均衡使用了SJF算法和FCFS算法,在等待时间相同时,则需要运行的时间越短的作业优先权越高(SJF);在需要运行的时间相同时,等待时间越短的作业优先权越高(FCFS)。所以对于长作业来说,如果等待的时间足够长,那么它的优先权也会很高。
综合三个算法,从每次运行的平均周转时间以及平均带权周转时间来看,HRRN是介于FCFS于SJF之间的,好于FCFS,次于SJF。