操作系统学习笔记(3)——处理器调度
1、处理器调度
调度原因:
- 在多道程序系统中,进程的数量往往多于处理机的个数,进程争用处理机的情况就在所难免。处理机调度是对处理机进行分配,就是从就绪队列中,按照一定的算法(公平、髙效)选择一个进程并将处理机分配给它运行,以实现进程并发地执行。 相当于快到假期了,你列举了很多你想完成计划,但是没有办法同时完成所有的事情,你需要列一个时间表,把各种事情进行规划,执行的过程中也可能会有突发情况,你再根据突发情况进行解决。
调度流程图:
处理器调度的实质:
- 在多道程序系统中,调度实质是一种资源分配,一个作业从获得处理机执行到作业运行完毕,可能会经历多级处理机调度。
处理器调度原则:
- 合理性:既要保证系统实现特殊功能要求,同时要对各个任务合理地分配到处理器份额;
- 有效性:处理器、内存和I/O设备得到合理有效的分配,使系统资源得到充分的利用
2、处理器调度层次:高级调度、中级调度、低级调度。
- 高级调度(作业调度):按照某种规则,从后背队列中选择合适的作业将其调入内存,并为其创建进程,发送频率最低;
- 中级调度(内存调度):按照某种规则,从挂起队列中农选择合适的进程将其数据调回内存;
- 低级调度(进程调度):按照某种规则,从就绪队列中选择一个进程为其分配处理机,发送频率最高。
作业调度(高级调度/长程调度)操作的对象是作业,此处的作业表示的是一个比程序更广泛的意义,它既包含了程序和数据,同时还配有一份作业说明书,系统就是根据说明书来对程序的运行进行控制。每当一个作业进入系统时,便会有“作业注册”程序为这个作业创建一个JCB(Job Control Block,作业控制块),JCB中包含了系统对作业管理和调度所需的全部信息,其中也包含了它的类型,系统就会根据这个类型将它放到相应的后备队列(外存)中等待作业调度。
作业调度就是按照一定的算法从后备队列中挑选一个或多个作业,给它们创建相应的进程(包括进程控制块PCB等)、分配内存等必要资源,然后将它们放入就绪队列(内存)中,以等待进程调度。
作业调度的主要任务就是接纳多少个作业,接纳哪些作业。接纳多少作业取决于内存中允许到少个作业同时运行,这个也成为作多道程序度;而接纳哪些作业就涉及到调度的算法。
作业调度主要用于多道批处理系统,在分时和实时系统中不设置作业调度。因为分时系统为了做到及时响应,用户通过键盘输入的命令或数据等会被直接送入内存,因而无需配置作业调度机制,但是它也需要设置某种接纳控制措施来限制进入系统的用户数目。类似地,实时系统中也不需要作业调度,但是必须要有接纳控制措施。
在批处理系统中,作业是从外存调入内存的基本单位。
常用的调度算法有:先来先服务(FCFS)、短作业优先(SJF)、优先级调度算法(PSA)、高响应比调度优先调度算法(HRRN)。
进程调度是运行频率最高的调度,分时系统中通常仅 10~100 ms 便进行一次,所以它也叫短程调度。进程调度操作的对象是进程(或内核级线程),它主要的功能是根据调度算法,决定就绪队列中的哪个进程应获得处理机,然后由分派程序将处理机分配给被选中的进程,因而它是最基本的一种调度,在多道批处理系统、分时、实时系统中都必须配置。
进程调度方式算法流程:
- 记住进程的状态;
- 决定进程什么时候获得处理器;
- 决定进程占用处理器多长时间;
- 把处理器分配给进程;
- 收回处理器。
进程调度方式
- 可剥夺式(可抢占式Preemptive):
- 比正在运行的进程优先级更高的进程就绪时,可强行剥夺正在运行进程的CPU,提供给具有更高优先级的进程使用,或是当运行进程时间片用完后被剥夺,抢占方式一般满足优先权原则、短进程优先原则、时间片原则等;
- 其优点是可以优先处理更紧急的进程,但是抢占方式比较复杂,系统开销大,适合分时操作系统、实时操作系统。
- 不可剥夺式(不可抢占式Non-preemptive):
- 某一进程被调度运行后,除非该进程终止或要求进入阻塞态,否则一直运行下去;
- 其优点是实现简单,系统开销小,但是却无法及时处理紧急任务,只适合早期批处理操作系统。
由于进程调度的频率之高,应当避免调度本身占用 CPU 太多时间,所以一般不用太过于复杂的调度算法。上述作业调度算法的思想也都可以用在进程调度上,除此之外,进程调度还有一些特有的调度算法,综合起来,常见的进程调度算法有:先来先服务(FCFS)、短进程优先(SPF)、优先级调度算法(PSA)、高响应比优先(HRRN)、时间片轮转调度算法(RR)、多级反馈队列(MFQ)。
内存调度也称为中级调度,它的主要目的是提高内存的利用率和系统吞吐量,把那些暂时不能运行的进程调至外存,进程处于挂起状态,当它们具备运行条件并且内存又有空闲的时候,再由中级调度调回就绪队列。
很显然进程一旦进入挂起状态(就绪挂起或阻塞挂起),就需要经过中级调度才能重新进入就绪队列,而且从图中我们也可很容易的看到,中级调度参与的双方是就绪挂起队列与就绪队列,那么如果一个进程从阻塞队列进入了阻塞挂起队列,它就必须等到相应事件出现并调入就绪挂起队列后,才能在下次事件出现时被调入就绪队列。
3、作业和进程
- 作业是用户向计算机提交的任务实体,而进程则是完成任务的执行实体,是系统分配资源的基本单位;
- 一个作业可由多个进程组成,且必须至少由一个进程组成,反之不成立;
- Linux等分时系统中,并不强调作业概念。
4、处理器调度的算法
调度算法的理想目标
- 单位时间内运行尽可能多的作业;
- 使处理器尽可能保持忙碌;
- 响应时间和周转时间能够尽可能短;
- 是各种I/O设备得以充分利用;
- 对所有的作业都是公平合理的。
调度算法的设计理念
- 调度算法应与系统设计目标保持一致;
- 主义系统资源均衡使用;
- 保持提交作业在截止时间内完成;
- 设法缩短作业平均周转时间。
大多数操作系统都采用比较简单的调度算法。
调度算法决策因素:
- 作业到达时间
- 预先为作业确定的优先级
- 作业所需的CPU时间
- 存储要求
- 其他的资源要求
性能衡量指标
- 作业平均周转时间
假定有那个作业,其中作业i进入系统时间为Si,它被选中执行得到结果的时间为Ei,其周转时间为:
Ti = Ei - Si
则这批作业平均周转时间为:
T = Σ(Ti / n)
- 平均带权周转时间
ri为作业i的实际执行时间:
W = Σ(Ti / (ri × n))
T:衡量不同调度算法对同一个作业流的性能
W:同一调度算法对不同作业流的性能衡量
5、作业调度和进程调度方式算法
- 先来先服务算法(FCFS,first come first serve)
- 算法思想:公平;
- 算法规则:按照作业/进程到达的先后顺序进行服务;
- 用于作业调度时,考虑的是哪个作业先到达后备队列;用于进程调度时,考虑的是哪个进程先到达就绪队列;
- 非抢占式的算法;
- 优点:公平,算法实现简单;
- 缺点:排在长作业(进程)后面的短作业需要等待很长时间,带权周转时间很大,对短作业来说用户体验不好。即FCFS对长作业有利,对短作业不利。
- 短作业优先算法(SJF,shortest job first)
- 算法思想:追求最少的平均等待时间最少的平均周转时间,最少的平均带权周转时间;
- 算法规则:最短的作业、进程优先得到服务(所谓“最短”,是指要求服务时间最短);
- 作业调度和进程调度都能使用,用于进程调度时被称为“短进程优先算法”(SPF,shortest process first);
- SJF和SPF是非抢占式算法,但也有抢占式的版本——最短剩余时间优先法则(SRTN,shortest remaining time next),在SRTF算法中,过程的执行可以在一段时间后停止。 在每个进程到来时,短期调度程序在可用进程列表和正在运行的进程中以最少的剩余突发时间安排进程。一旦所有进程都在就绪队列中可用,就不会执行抢占,并且该算法将作为SJF调度工作。 当进程从执行中被移除并且下一个进程被调度时,进程的上下文被保存在进程控制块中。 该PCB在下一次执行该过程时被访问;
- 优点:“最短的”平均等待时间和平均周转时间;
- 缺点:不公平。对短作业有利,对长作业不利。可能产生饥饿现象。另外,作业/进程的运行时间是由用户提供的,并不一定真实,不一定能做到真正的短作业优先。
- 高响应比优先算法(HRRN)
- 算法思想:综合考虑作业/进程的等待时间和要求服务的时间;
- 算法规则:在每次调度时先计算各个作业/进程的响应比,选择响应比最高的作业/进程为其服务;
- 响应比 = 作业周转时间 / 作业处理时间 = (作业处理时间 + 作业等待时间) / 作业处理时间 = 1 + (作业等待时间 / 作业处理时间)。
- 作业调度和进程调度都能使用;
- 是非抢占式算法,因此只有当前运行的作业/进程主动放弃处理机时,才需要调度,才需要计算响应比;
-
-
综合考虑了等待时间和运行时间(要求服务时间);等待时间相同时,要求服务时间短的优先(SJF的优点);要求服务时间相同时,等待时间长的优先(FCFS的优点);对于长作业来说,随着等待时间越来越久,其响应比也会越来越大,从而避免了长作业饥饿的问题。
-
- 时间片轮转算法(RR,round-robin)
- 算法思想:公平的,轮流地为各个进程服务,让每一个进程在一定时间间隔内都可以得到相应;
- 算法规则:按照各进程到达就绪队列的顺序,轮流让各个进程执行一个时间片(如100ms)。若进程未在一个时间片内执行完,则剥夺处理机,将进程重新放到就绪队列队尾重新排队;
- 用于进程调度(只有作业放入内存建立了相应的进程后,才能被分配处理机时间片);
- 可抢占式。若进程在时间片内运行完,将被强行剥夺处理机使用权,因此时间片轮转调度算法属于抢占式的算法。由时钟装置发出时钟中断来通知CPU时间已到;
- 优点:公平,响应快,适用于分时操作系统;
- 缺点:由于高频率的进程切换,因此有一定开销;不区分任务的紧急程度。
- 优先级调度算法
- 算法思想:随着计算机的发展,特别是实时操作系统的出现,越来越多的应用场景需要根据任务的紧急程度来决定处理顺序;
- 算法规则:每个作业/进程有各自的优先级,调度时选择优先级最高的作业/进程;
- 作业调度和进程调度都能使用,甚至可以用于I/O调度;
- 抢占/非抢占都有。区别在于非抢占式只需在进程主动放弃处理机时进行调度即可,而抢占式还需在就绪队列变化时,检查是否会发生抢占;
- 优点:用优先级区分紧急程度,重要程度,适用于实时操作系统。可灵活的调整对各种作业/进程的偏好程度;
- 缺点:若源源不断地有高优先级进程到来,则可能导致饥饿。
- 多级反馈队列算法
- 算法思想:对其他调度算法的折中权衡;
- 算法规则:设置多级就绪队列,各级队列优先级从高到低,时间片从小到大;新进程到达时先进入第一队列……;只有第k即队列为空时,才会为第 k+1 级对头的进程分配时间片;
- 用于进程调度;
- 抢占式的算法。在k级队列的进程运行过程中,若更上级的队列(1-【k-1】级)中进入了一个新进程,则由于新进程处于优先级更高的队列中,因此新进程会抢占处理机,原来运行的进程放回k级队列队尾;
- 对各类型进程相对公平(FCFS优点);每个新到达的进程都可以很快得到相应(RR的优点);短进程只用较少的时间就可完成(SPF的优点);不必实现估计进程的运行时间(避免用户作假);可灵活地调整对各类进程的偏好程度,比如CPU密集型进程,I/O密集型进程;