典型的调度算法
1.先来先服务(FCFS)调度算法
最简单的调度算法,既可用于作业调度又可以用于进程调度。该算法每次从就绪队列中选择最先进入该队列的进程,将处理机分配个他,知道运行完毕或者由于某些愿意阻塞了。
FCFS算法属于不可剥夺算法,从表面上是公平的,但是如果一个长作业先到达系统,就会使得后面的短作业需要等待很长时间,因此难以胜任分时系统和实时系统的主要调度策略。但是他时常被结合在其他调度策略中使用。比如在优先级调度策略中,对于相同优先级的作业一般采用FCFS。
FCFS的特点是算法简单,但是效率比较低,对长作业比较有利但是对短作业不利
2.短作业优先(SJF)调度算法
短作业/进程优先调度算法是从后备队列中选择一个或者若干个预估运行时间最短的作业,将他们调入内存运行,而在进程调度上也同理。该算法的优点在于:平均等待时间、平均周转时间最少。
但是也有不可忽视的缺点:算法对长作业不利,该算法中长作业周转时间会变长,如果不断的有短作业进入,会导致长作业一直不被处理,这种现象被称为饥饿。该算法完全不考虑作业的紧迫程度,因此不能保证紧迫作业会被立即处理。作业是根据预估运行时间排序的,而用户可能会有意缩短作业预估运行时间。
3.优先级调度算法
优先级调度算法既可以用于作业调度也可以用于进程调度。该算法中的优先级用于描述作业的紧迫程度。在作业调度中,会选择优先级最高的作业创建进程并且放入就绪队列;而在进程调度中,会将处理机分配个优先级最高的进程。
根据新的更高优先级的进程能否抢占正在执行的进程,可以讲调度算法分为非抢占式优先级调度算法和抢占式优先级调度算法。而根据进程创建后优先级是否可以改变又可以分为静态优先级和动态优先级。
进程优先级的设计参考以下原则:
系统进程>用户进程
交互型进程>非交互型进程
IO型进程>计算型进程
4.高响应比优先调度算法
该算法主要用于作业调度,是对FCFS和SJF的一种综合,同时考虑了作业的等待时间和预估运行时间,通过计算响应比求出最高响应比的作业优先推入就绪队列
响应比Rp = (等待时间+要求服务时间)/要求服务时间
根据公式可以知道,作业等待时间相同,那么要求服务时间越短响应比越高,有利于短作业;而要求服务时间相同的时候,等待时间越长其响应比越高。并且只要长作业等到足够长时间,响应比就会上升,最终也会被处理,从而避免了饥饿现象。
5.时间片轮转调度算法
主要是用于分时系统,在该算法中,系统将所有就绪进程按照FCFS排成就绪队列,逐个获得处理机使用权,但是引入了分片的概念,在时间片耗尽之后,会强制将中断当前进程,使得当前进程回到队尾排队,将处理机使用权交给下一个进程。类似于一堆小朋友排队吃饭,每个小朋友只能在饭桌前吃1分钟,1分钟后自动回到队尾重新排队,吃饱的自动离队。
6.多级队列调度算法
确实该算法在系统中设置多个就绪队列,可以将不同类型或者性质的进程固定分配到不同的就绪队列中,每个队列可以试试不同的调度算法,因此系统针对不同用户进程的需求,很容易可以提供多种调度策略,更为灵活。多级队列调度算法一般和其他调度算法混用
7.多级反馈队列调度算法
该算法是时间片轮转调度算法恶化优先级调度算法的综合,通过动态调整进程优先级和时间片大小,以兼顾多方面的系统目标。该算法的实现思想如下:
- 设置多个就绪队列,并且为每个队列设置优先级
- 赋予各个队列的时间片大小不一致,优先级越高的时间片越大,方便高优先级进程分配到更多处理机使用时间。
- 每个队列采用FCFS。