标签:class 提交 运行时间 ext 高级 而且 请求 ack 引入
本文主要参考《计算机操作系统(第四版)》(西安电子科技大学出版社)以及清华大学操作系统公开课(向勇、陈渝),整理操作系统的基本概念,供自己复习查阅。
内存中进程的数目往往多于处理机的数目,这就要求操作系统按照某种算法把处理机动态地分配给处于就绪状态的某个进程,这就是处理机调度(Process Scheduling)。调度的实质就是一种资源分配。
调度算法的选择和设计取决于操作系统的类型,在批处理系统、分时系统和实时系统中,调度算法往往不同。
平均周转时间短。周转时间即从作业提交到作业完成经过的时间。从用户角度,用户希望自己的作业周转时间最短,但计算机系统管理者总是希望平均周转时间最短。平均周转时间可以表示为:
\[
T={1\over n}\sum_{i=1}^n T_i
\]
为了更好地描述调度的性能,往往采用带权周转时间,即周转时间\(T_i\)和运行时间\(T_s\)的比值。平均带权周转时间可以表示为:
\[
W={1\over n}\sum_{i=1}^n{T_i\over T_s}
\]
系统吞吐量高,处理机利用率高,吞吐量即单位时间系统完成的作业数,显然长度短的作业更容易完成,而处理机利用率高则要求作业尽可能长。这两个目标是存在一定矛盾的,需要调度算法做出权衡。
类似地,每个作业也有一个对应的数据结构存储作业的各种运行时信息,这就是作业控制块(Job Control Block,JCB)。作业调度的主要任务是根据JCB中的信息监测资源是否能满足作业的需求,并按照一定的算法从外存后备队列中选取作业进入内存,故其又称接纳调度。每次调度都需决定:1.接纳多少作业;2.接纳哪些作业。
先来先服务(First-come First-served,FCFS)算法是最容易想到也是最容易实现的算法。它既可用于作业调度,又能用于进程调度。顾名思义,该算法按作业到达的时间次序进行调度,即等待时间为优先级评判的唯一标准。
由于实际情况中短作业往往占大多数,为了让短作业尽快执行,便有了短作业优先(Short Job First,SJF)算法。显然该算法按作业运行时间的长短进行调度。缺点是:
事实上,前两种算法都不能优先处理紧迫程度高的作业,由此也就诞生了优先级调度算法(Priority-scheduling Algorithm,PSA),该算法的优先级基于作业的紧迫程度,紧迫程度由外部衡量。
FCFS算法只考虑作业的等待时间,而SJF只考虑作业的运行时间,对优先级的解释都比较片面。高响应比优先调度(Highest Response Ratio Next)算法则综合考虑了这两点,其规定:
\[
优先权R_p={系统对作业的响应时间\over 要求服务时间}={等待时间+要求服务时间\over 要求服务时间}
\]
当作业的等待时间相同时,要求服务时间越短,优先级越高,类似SJF;当要求服务时间相同时,等待时间越长,优先级越高,类似FCFS;对于长作业,其优先级也会随着等待时间慢慢提高,不至于最后执行。可见该算法实现了较好的平衡。但不可忽视的是,响应比是需要动态更新的,这无疑会增加系统开销。
进程调度是操作系统中不可或缺的一级调度,也是对处理机性能影响最大的一种处理机调度。进程调度的主要任务是:保护处理机的现场信息;按某种算法选取进程;把处理机分配给进程。
主要分为抢占方式和非抢占方式。
非抢占方式(Nonpreemptive Mode)即一旦把处理机分配给某个进程,就让它一直运行直到其完成,不会因为任何原因去抢占当前正在运行进程的处理机。它的优点是实现简单,系统开销小,适用于批处理系统。
抢占方式(Preemptive Mode)即调度程序会根据某种原则去暂停某个正在执行的进程,把已分配给该进程的处理机重新分配给其他进程。采用抢占方式才能在分时系统实现人机交互,在实时系统满足实时任务的需求。抢占不是任意性行为,必须遵循一定的原则:
在分时系统中最简单的也是最常用的,就是基于时间片的轮转(Round Robin,RR)调度算法。在这个算法中,系统把所有就绪进程按FCFS排成一就绪队列,并让队首进程轮流出队,把CPU分配给出队进程并让它执行一个时间片。系统可以设置每隔一定时间产生依次中断,以激活调度程序进行重新调度。
进程切换的时机有两个:一个时间片结束之前该进程就已经完成时,立即激活调度程序重新调度,启动一个新时间片;一个时间片用完时,计时器中断处理程序会被激活,此时若进程未完成,则会被送入就绪队列尾。
时间片的大小也是需要确定的一个重要参数。时间片过短则利于短作业,但也意味着会频繁地进行进程调度和进程上下文切换,增加系统开销。时间片过长,极端情况下每个进程都能在一个时间片内完成,RR算法也就退化成了FCFS算法。较可取的时间片长度是略长于一次典型交互所需的时间。
在时间片轮转调度算法中,其实隐含了一个假设:所有进程的紧迫程度相同。但实际情况肯定并非如此,为了满足实际情况,需要在调度算法中引入优先级,进而形成优先级调度算法。优先级调度又可以分为抢占式和非抢占式,抢占式常用于对实时性要求较高的系统中。优先级又可以分为静态优先级和动态优先级。
前述的各种调度算法均是基于一个就绪队列的,即进程(低级)调度算法是单一的,多队列调度算法能在一定程度上弥补这个缺点。多队列调度把就绪队列拆分为多个,把类型或性质不同的进程分配到不同的队列,不同的队列还可以采用不同的调度算法。
如果未指明进程长度,则短进程优先和基于进程长度的抢占式调度都无法实现。而多级反馈队列(Multilevel Feedback Queue)调度算法则无须事先知道各进程的执行用时,是目前公认的一种较好的进程调度算法。该算法大致实现如下:
以上各种算法都只是保证优先运行,并没有考虑调度的公平性。常用的可保证公平性的算法有两种:保证调度算法和公平分享调度算法。保证调度算法会保证每个进程都获得同等的处理机时间。公平分享调度算法则会保证每个用户都获得同等的处理机时间。
在实时系统中,实时调度必须能满足实时任务对截止时间的要求。为了实现实时调度,调度程序需要了解有关任务的信息:就绪时间、开始截止时间和完成截止时间、处理时间、资源要求、优先级等。
实时系统对处理机的要求也比较高,对于有N个处理机系统,假设有m个硬实时任务,第i个任务的处理时间为\(C_i\),周期为\(P_i\),则系统必须满足下面的条件才能调度这些任务:
\[
\sum_{i=1}^m {C_i\over P_i} \le N
\]
按调度方式可以把实时调度算法分为非抢占式和抢占式两类。
非抢占式又可以分为两类。其中非抢占式轮转调度则按队列轮转,任务完成则入队尾,该调度用于要求不太严格的实时系统;而非抢占式优先调度则允许某些进程具有较高的优先级,这些任务到达时可以直接入队首,该调度用于有一定要求的实时系统。
基于抢占发生时间的不同又可以细分为两类:基于时钟中断的抢占(抢占等到下一时钟中断发生)和立即抢占(只要当前任务不处于临界区则立即抢断)。
最早截止时间优先(Earliest Deadline First,EDF)即根据任务的截止时间确定优先级,截止时间越早,在队列的位置越靠前,调度程序总是选择队首进程执行。
最低松弛度优先(Least Laxity First,LLF)则根据任务的紧急(松弛)程度确定优先级,紧急程度则根据必须完成时间、运行时间和当前时间综合考量。假设一个任务必须在时刻200ms时完成,而执行这个任务需要100ms,则这个任务在0时刻的紧急程度就是100ms,在100ms时刻的紧急程度为0(此时再不执行则无法按时完成)。松弛度的计算为:
\[
松弛度=必须完成时间-本身运行时间-当前时间
\]
Operating System: Process Scheduling
标签:class 提交 运行时间 ext 高级 而且 请求 ack 引入
原文地址:https://www.cnblogs.com/Li-F/p/11904843.html