1 实验内容
假如一个系统中有5个进程,它们的到达时间内如表1所示,忽略I/O以及其他开销时间。若分别按先来先服务(FCFS)、抢占的短作业优先(SJF)、时间片轮转(RR,时间片=1)进行CPU调度,请按照上述三个算法,编程计算出各进程的完成时间内、周转时间、带权周转周期、平均周转周期和平均带权周转时间。
进程 |
到达时间 |
服务时间 |
A |
0 |
3 |
B |
2 |
6 |
C |
4 |
4 |
D |
6 |
5 |
E |
8 |
2 |
2 算法描述
本程序模拟了六种进程调度算法,分别为:先来先服务、抢占和非抢占的短作业优先、时间片轮转、静态优先级、高响应比优先算法。
(1)定义PCB结构体,成员包含名称、到达时间、服务时间、开始时间、完成时间、周转时间、带权周转时间、标志是否运行结束的标记符、等待时间、剩余时间(用于抢占式算法)、静态优先级(用于静态优先级算法)、运行时间。然后构建全局变量模拟进程就绪队列。
(2)设计进程信息初始化函数。并在此函数中按到达时间对进程进行排序。
(3)设计进程信息输入函数,其中包含文件读取和手动输入两种方式。
(4)先来先服务(FCFS)调度算法
FCFS是一种最简单的调度算法, FCFS调度算法每次从就绪队列中选择最先进入该队列的进程,将处理机分配给它,使之投入运行,直到完成或因某种原因而阻塞时才释放处理机。
FCFS属于不可剥夺(抢占)算法。从表面上看,它对所有作业都是公平的,但是如果有一个长作业先到达系统,就会使后面许多短作业等待很长时间,因此这种方法肯定不能作为分时系统和实时系统的调度方法,但是它常被结合在其他调度策略使用。比如在使用优先级作为调度策略的系统中,往往对多个具有相同优先级的进程按FCFS原则处理。
特点分析:算法简单,但是效率低下;对长作业较为有利,对短作业不利;利于CPU繁忙型作业,不利于I/O繁忙型作业。
在我设计的模拟程序中,由于进程在初始化时就已经按照到达时间排序,因此只需要通过一个循环,依次模拟进程调度完成即可。
(5)非抢占式短作业优先(SJF)调度算法
非抢占式短作业优先(SPF)调度算法是从就绪队列中选择一个估计运行时间最短的进程,将处理机分配给它,使之立即执行,直到完成或发生某时间而阻塞时,才释放处理机。
但是这种算法有着不容忽视的缺点:
①该算法对长作业不利,SJF中长作业的周转时间会增加。更糟的是,若一旦有长作业进入系统的后备队列,由于调度程序总是优先调度那些短作业(即使是后来的短作业也会被优先安排给处理机),导致长作业长期不被调度,饿死在后备队列中。
②完全没有考虑作业的紧迫程度,因而不能保证紧迫的作业会被及时处理。
③由于作业的长短只是根据用户所提供的预估的执行时间而定的,而用户又可能会有意无意地缩短其作业的估计运行时间,使得算法不一定能真正做到短作业优先调度。
但该算法的优点也显而易见:平均等待时间、平均周转时间最少。
在我设计的模拟程序中,会先用一个循环找到当前未完成的进程中服务时间最短的,将其优先执行,再通过外层循环重复上述操作,直至所有进程调度完成。
(6)抢占式短作业优先调度算法
抢占式短作业优先调度算法的思想是在就绪队列中,在已到达的进程内挑选剩余执行时间最短的进程进行一个时间单元之后暂停,若有其它新的进程添加进来需要考虑是否剩余时间最短,若有进程比暂停进程更符合算法条件,则该进程抢占CPU进行一个时间片,直到所有的进程都进行完毕。
在本模拟程序中,将该算法的时间片默认为1,与非抢占式SJF不同的是,循环中比较的是当前时间下所有进程的剩余时间,而在每一个时间片过后都需要重新进行