“ 你讲了这么多,可还是没说是怎么调度的。”
我们知道,调度分为三种:
作业调度:也叫高级调度,从外存到内存,操作的是作业;
中级调度:也叫内存调度,操作的是进程;
进程调度:也叫低级调度,操作的也是进程;
进程的调度还分为:
非剥夺式调度:大家排队,别想插队。
剥夺式调度:一些人可以插队,一些人继续排队。
剥夺式调度里面,到底谁可以插队,谁不能插队?
那也要按规矩来!
这个规矩就是调度算法。
01
—
先来先服务调度算法
先来先服务(FCFS)调度算法,顾名思义,
就是 谁先来,处理机就先处理谁的任务。
英文缩写记住! FCFS!!
它既可用于作业调度,又可用于进程调度。
在作业调度中,算法每次从后备作业队列中选择最先进入该队列的一个或几个作业,将它们调入内存,分配必要的资源,创建进程并放入就绪队列。
在进程调度中,调度算法每次从就绪队列中选择最先进入该队列的进程,将处理机分配给它,使之投入运行,直到完成或因某种原因而阻塞时才释放处理机。
FCFS调度算法属于 不可剥夺算法。
从表面上看,它对所有作业都是公平的,
但若一个长作业先到达系统,就会使后面的许多短作业等待很长时间,
因此它不能作为分时系统和实时系统的主要调度策略。
但它常被结合在其他调度策略中使用。
FCFS调度算法的特点是算法简单,但效率低;对长作业比较有利,但对短作业不利(相对SJF和高响应比);
有利于CPU繁忙型作业,不利于I/O繁忙型作业。
02
—
短作业优先调度算法
短作业(进程)优先调度算法是指对短作业(进程)优先调度的算法。英文缩写记住!!!
短作业优先叫做 SJF;
短进程优先叫做 SPF;
短作业优先(SJF)调度算法从后备队列中选择一个或若干估计运行时间最短的作业,将它们调入内存运行;
短进程优先(SPF)调度算法从就绪队列中选择一个估计运行时间最短的进程,将处理机分配给它,使之立即执行,直到完成或发生某事件而阻塞时,才释放处理机。 怎么定义短作业? 啥是短作业?
每个进程在执行的时候,自己都设置一个预期运行时间,
运行时间预估短的就是短作业。
假如有100个短作业,每个执行1秒钟,1个长作业执行10秒钟,
这个长作业等了100秒才执行到。
100个作业排队吃饭,
短作业一个个都吃到了饭,
唯一一个天选之子 · 长作业等了特别久才吃上,饿坏了,
经过漫长的等待,终于吃上了饭。
所以作业长期得不到调度,也叫做饥饿。
注意, 饥饿,是等的时间太久了,但是 总归能等到。
还有另一个情况是 死锁,也就是这个进程,食堂没菜了,这进程就一直死等,这种情况是 等不到。
另外,短作业优先算法完全没考虑作业的紧迫程度,不能保证紧迫性作业会被及时处理。
还有就是,
作业的运行长短,是谁给的?
是根据用户所提供的估计执行时间给定的,
而用户又可能会有意或无意地缩短其作业的估计运行时间,致使该算法不一定能真正做到短作业优先调度。
总结一下缺点就是:
长作业会饥饿;
没考虑作业间的紧迫程度;
作业运行时间的估计不一定准确;
但是! SJF调度算法的平均等待时间、平均周转时间最少。
03
—
优先级调度算法
优先级调度算法又称优先权调度算法,它既可用于作业调度,又可用于进程调度。该算法中的优先级用于描述作业运行的紧迫程度。
在作业调度中,优先级调度算法每次从后备作业队列中选择优先级最高的一个或几个作业,将它们调入内存,分配必要的资源,创建进程并放入就绪队列。
在进程调度中,优先级调度算法每次从就绪队列中选择优先级最高的进程,将处理机分配给它,使之投入运行。
优先级又可以细分两种优先级:
1、 非剥夺式优先级调度算法
处理机在处理进程A,就绪队列里面有BCD,
这时候来了个优先级很高的E,E会在BCD当中插个队,
等A运行完了,就处理E。我插队,但是我还是得等。
2、 剥夺式优先级调度算法 。
处理机在处理进程A,就绪队列里面有BCD,
这时候来了个优先级很高的E,
处理机立马停下了手中的活,
不执行A了,直接执行E。 我连队我都不排,直接轮到我 。
当然,优先级可以有两种:静态优先级,动态优先级。
很好理解,
静态优先级:我优先,我就一直优先,一开始就定好了我优先。
优先级定好了之后就不变了。
动态优先级:我这次优先,但是下次我就不一定优先了。
优先级定好了,但是随着程序运行,可以变。
都可以商量嘛~
04
—
高响应比优先调度算法
高响应比优先调度算法主要用于作业调度,
是对FCFS调度算法和SJF调度算法的一种综合平衡,
同时考虑了每个作业的等待时间和估计的运行时间。
在每次进行作业调度时,先计算后备作业队列中每个作业的响应比,从中选出响应比最高的作业投入运行。
啥是 响应比? 公式要记住!!!明显会考!!!
显然,
作业的等待时间相同时,要求服务时间越短,响应比越高,
这就怎么样?
有利于短作业。
如果要求服务时间相同时,
作业的响应比由其等待时间决定,
等待时间越长,其响应比越高,因而它实现的是先来先服务。
对于长作业,作业的响应比可以随等待时间的增加而提高,
等待时间足够长时,其响应比便可升到很高,从而也可获得处理机。
因此,这就克服了饥饿状态,兼顾了长作业。
05
—
还有两个常见的调度算法
第一个是 时间片轮转调度算法,主要适用于分时系统。
系统将所有就绪进程按到达时间的先后次序排成一个队列,进程调度程序总是选择就绪队列中的第一个进程执行,即先来先服务的原则,
但一个进程仅能运行一个时间片, 时间片又是啥?
把一段时间,切割成等长的若干份,
比如我规定,1秒钟切成10份,一份0.1s,
进程ABCDEF,按顺序,每个依次执行0.1s,
如果一个时间片还没执行完,
就等下一轮,再给你0.1s来执行。
在时间片轮转调度算法中,时间片的大小对系统性能的影响很大。
若时间片足够大,以至于所有进程都能在一个时间片内执行完毕,则时间片轮转调度算法就退化为先来先服务调度算法。
若时间片很小,则处理机将在进程间过于频繁地切换,使处理机的开销增大,而真正用于运行用户进程的时间将减少。
因此,时间片的大小应选择适当。
时间片的长短通常由以下因素确定:
系统的响应时间、
就绪队列中的进程数目、
系统的处理能力。
第二个是 多级反馈队列调度算法,它融合了前面几种算法的优点,
在真正的操作系统中,就用的是这个。
1、设置多个队列,每个队列有各自的优先级,
队列之间,就用 优先级调度。
2、队列里面就有多个进程等待执行,
同一个队列里面的多个进程,就用 先来先服务的方式来调度,
3、每个队列给的进程执行 时间片又不一样,
在优先级越高的队列中,每个进程的运行时间片越小。
多级反馈队列的优势有以下几点:
1)、终端型作业用户:短作业优先。
2)、短批处理作业用户:周转时间较短。
3)、长批处理作业用户:经过前面几个队列得到部分执行,不会长期得不到处理。 关注小冰计算机考研!
各种408解题法、各种划重点!
更多文章陆续更新中!
如果觉得有用,不点个再看么少年?↓
[]~( ̄▽ ̄)~*