【调度算法】
先来先服务调度算法(FCFS)
每次从就绪队列选择最先进入队列的进程,然后一直运行,直到进程退出或被阻塞,才会继续从对列中选择第一个进程接着运行。
这种算法虽然看上去公平,但是如果有一个长作业需要处理,则后面的短作业需要处理很长时间。
先来先调度算法的特点是算法简单,对长作业比较有利,对短作业不利,适用于CPU繁忙型作业的系统,而不适用于I/O繁忙性作业的系统(IO密集型:任务执行过程中会频繁等待 IO 操作(如磁盘读写、网络请求、用户输入等),实际占用 CPU 的时间很短,大部分时间处于阻塞状态。)
最短作业优先调度算法(SJF)
最短作业优先调度算法从就绪队列中选择一个估计运行时间最短的作业,将之调入到内存中运行,这有利于提高系统的吞吐量。
但这对长作业十分不利,由于调度程序总是优先调度短作业,将会导致长作业长期不被调度,此外该算法也没有考虑到作业的紧迫程度,因此不能保证紧迫性作业会被即使处理。
高响应比优先调度算法
每次进行调度时,先计算响应比优先级,然后把响应比优先级最高的投入运行
- 作业等待时间相同时,如果要求服务时间越短,则响应比更高,有利于短作业执行
- 当要求服务时间相同时,响应比由等待时间决定,等待时间越长,则响应比越高
- 对于长作业,作业的响应比随着等待时间的增加而提高
时间片轮转调度算法
每个进程被分配一个时间段,称为时间片,即允许该进程在该时间段中运行。
- 如果时间片用完,进程还在运行,那么将会把此进程从CPU释放出来,并把CPU分配给另一个进程
- 如果该进程在时间片结束前阻塞或结束,则CPU立即进行切换
还需要注意一个关键点:
- 如果时间片设得太短会导致过多的进程上下文切换,降低了CPU效率
- 如果设的太长又可能引起对短作业进程的响应时间变长,一般为20ms---50ms
最高优先级调度算法
从就绪队列中选择最高优先级的进程进行运行,但进程的优先级可以分为静态优先级和动态优先级
- 静态优先级:优先级在创建进程时已经确定,在进程运行期间保持不变,确定静态优先级的主要依据有进程类型,对资源的要求,用户要求。
- 动态优先级:进程运行过程中,根据进程运行时间和等待时间等原因调整进程的优先级
但这种算法可能会导致低优先级的进程永远不被执行
多级队列调度算法
上面的各种调度算法是固定且单一的,无法满足系统中不同用户对进程调度策略的不同要求,多级队列调度算法在系统中设置多个就绪队列,将不同类型或性质的进程固定分配到不同的就绪队列,每个队列可以实施不同的调度算法
多级反馈队列调度算法
多级反馈队列调度算法融合了时间片轮转调度算法和优先级调度算法,通过动态调整进程的优先级和时间片大小,多级反馈队列调度算法可以兼顾多方面的系统目标
多级反馈队列调度算法的实现思想如下:
- 设置多个就绪对列,并为每个队列赋予不同的优先级。第一队列的优先级最高,第二队列次之.....
- 赋予各个队列的进程运行时间片的大小个不相同,在优先级越高的队列中,每个进程的时间片就越小。
- 每个队列都采用FCFS算法。当新进程进入内存后,首先将它放在第一级队列的末尾,按FCFS原则等待调度。当论到该进程执行时,如果它能在该时间片内完成,便可撤离系统。若他在一个时间片结束时尚未完成,调度程序将其转入第二级队列的莫尾等待调度,若它在第二级队列中运行一个时间片后仍未完成,再将他放入第三级队列......
- 按队列优先级调度。仅当第一队列为空时,才调度第二级队列中的进程运行,当第一二级队列为空时,才调度第三级队列.....若处理机正在执行第i级队列中的某个进程时,又有新进程进入任一优先级较高的队列,此时须立即把正在运行的进程放回到i级队列的末尾,而把处理机分配给到新的高级优先级进程。
优势有以下几点:
- 终端型作业用户:短作业优先
- 短批处理作业用户:周转时间较短
- 长批处理作业用户:经过前面几个队列得到部分执行,不会长期得不到处理