mapengpeng1999@163.com 操作系统4~处理机调度

处理机调度

1.三级调度体系

1.处理机调度主要是对处理机运行时间进行分配,即:按照一定算法或策略,将处理机运行时间分配给各个并发进程,同时尽量提高处理机的使用效率。
2.现代操作系统中,按调度所实现的功能分3种类型,高级调度、中级调度和低级调度,它们一起构成三级调度体系。
3.低级调度是该体系中不可缺少的最基本调度。

1.1 高级调度

1. 高级调度(high-level scheduling)

又称作业调度/长程调度,它根据某种算法将外存上、处于后备作业队列中的若干作业调入内存,为作业分配所需资源并建立相应进程。
2. 作业分为若干个相对独立又互相关联的加工步骤,每个步骤称为一个作业步。每个作业步可对应一个或多个进程。

  1. 作业一般要经历提交、后备、执行、完成四个状态。高级调度的基本单位是作业,不是进程。

在这里插入图片描述

在这里插入图片描述

为管理和调度作业,系统为每个作业设置了一个作业控制块(JCB),它记录作业的相关信息。JCB是作业在系统中存在的标志,只有作业执行完或中途退出时,JCB才会撤消。同时,OS根据JCB中的信息,对作业进行调试与管理。 JCB记录了作业所需资源及资源使用情况,但资源的分配和释放由存储管理、设备管理程序完成。

在这里插入图片描述

作业调试算法:

  • 先来先服务:把最先提交的作业调入内存;
  • 短作业优先:把CPU运行时间最短的作业最先调入内存。
  • 最短剩余时间优先:剩余运行时间最短的作业优先调入内存。
    高级调度通常出现在需进行大量作业处理的批处理系统中,这类系统的设计目标是最大限度提高系统资源利用率和保持各种系统活动的充分并行。
    分时操作系统和实时操作系统中,终端用户作业被直接送入内存,一般不需要作业调度。

1.2 中级调度

​ 中级调度(middle-level scheduling)又称内存调度,它是进程在内存和外存之间的对换。
​ 引入中级调度目的是:内存空间非常紧张或CPU无法找到可执行就绪进程时,就把某些晢时不能运行的进程换到外存上去等待(挂起),释放出其所占用的内存资源给其它进程使用。当这些进程重新具备运行条件且内存空闲时,不规则重新调入内存并修改其状态。
​ 具有中级调度的系统中,进程除3个基本状态外,还具有静止就绪和静止阻塞两个状态。

在这里插入图片描述

1.3 低级调度

低级调度(low-level scheduling):又称 进程调度 / 短程调度 / 底层调度,它决定哪个就绪态进程获得处理机,即: 选择某个进程从就绪态变为执行态。
低级调度是三级调度中的最终调度,又称。在这级调度中真正实现了处理机的分配,是系统不可缺少的最基本调度。 在仅具有进程调度的系统中,调度队列模型如下图所示:

在这里插入图片描述

通常出现以下情况,进程调度将被激活:
(1)新进程建立后,由调度程序决定运行父进程还是子进程。
(2)运行状态的进程正常结束或这被强行终止。
(3)正在执行的进程,因某种原因被阻塞。
(4)分配给运行进程的时间片用完。
(5)抢占调度方式下,优先级更高的进程申请运行。
进程调度功能主要包括:
① 选择就绪进程
② 进程切换:中心工作是两个进程执行现场的切换。

1.4 三级调度关系

分级调度系统中,各级调度分别在不同的时机进行。一个用户作业,通常要经历高级调度、中级调度、低级调度,才能完成整个作业程序的运行。
在系统中,不同状态的进程,会加入不同的队列,以便于调度和管理。

作业进入系统时,加入作业后备队列;

内存中的就绪进程,形成就绪队列;

阻塞态进程,形成阻塞队列;

在外存中处于挂起态的进程,形成就绪挂起/阻塞挂起队列。

在这里插入图片描述

2.进程调度目标和调度方式

2.1 进程调度目标

通用调度目标:
(1)公平性:保证每个进程得到合理的CPU时间及执行速度。
(2)高效率:保证CPU充分利用,防止空闲等待。
(3)低响应时间:保证交互命令的及时响应和执行。
(4)高吞吐量:实现系统高吞吐量,缩短每个进程等待时间。
(5)特殊应用要求:保证优先运行实时进程及特殊应用程序。

操作系统类型不同,调度目标也不同:
(1)多道批处理OS
强调高效利用系统资源及高作业吞吐量。进程提交给CPU后,即不再与外部进行交互。系统按照调度策略,安排它们运行,直到所有进程完成为止。
(2)分时OS
更关心多个用户的公平性+及时响应性,不允许某个进程长时间占用CPU。分时系统多采用时间片轮转调度算法,或在此基础上改进的其他算法。
分时OS中,CPU在各进程间频繁切换,会增加系统时空开销。此类系统最关注的是交互性+各进程均衡性,对进程的执行效率和系统开销,往往要求并不苛刻。

(3)实时OS
必须保证实时进程的请求,得到及时响应,往往不考虑处理机的使用效率。实时系统采取的调度算法,最大特点是可抢占性。
(4)通用OS
通用OS中,对进程调度没有特殊限制和要求,选择进程调度算法时,主要追求CPU使用的公平性以及使用各类资源的均衡性。

2.2 进程调度方式

(1)非抢占方式(Nonpreemptive)

某进程一旦获得CPU使用时间,其他进程就不能中断它的执行,即使当前等待的进程优先级更高,直到执行态进程完成或发生某个事件主动放弃CPU,才能调度其他进程。
此调度方式下,引起进程调度常见原因有:

  • 执行态进程执行完毕或因某事件无法继续执行;
  • 执行态进程提出I/O请求而暂停;
  • 在进程通信或同步中执行了某种原语而主动放弃CPU使用权,如P原语、阻塞原语等。
    这种调度方式实现简单、系统开销小,适用于大多数批处理系统。但它难以满足实时任务的要求。

(2)抢占方式(Preemptive)
在进程并发执行中,如就绪进程中,某个进程优先级比当前执行态进程的优先级更高,则无论当前进程是否结束,系统允许高优先级进程抢占当前进程的CPU并立即执行。
抢占式调度可确保高优先级进程立即获得处理机。支持抢占式调度的系统中,一般抢占原则如下:
①优先权原则:就绪的高优先权进程,有权抢占低优先权进程的CPU。
② 短作业优先原则:就绪的短作业,有权抢占长作业的CPU。
③ 时间片原则:一个时间片用完后,系统重新进程调度。

3.调度算法评价准则

3.1 面向用户的评价准则

(1) 作业周转时间
作业周转时间:指从作业被提交给系统开始,到作业完成为止的这段时间间隔,该指标越短越好。
此指标由四部分组成:在外存后备队列中的等待时间;进程在就绪队列上等待调度的时间;进程在CPU上的执行时间;进程在等待I/O操作完成的时间。后三项在整个作业过程中可重复发生。
常采用多个作业的平均周转时间进行评价:

  • 平均周转时间:系统中所有作业的周转时间之和 / 作业个数
  • 带权周转时间:某作业的周转时间 / 在CPU上运行时间。
    (2) 响应时间
    指从进程输入第一个请求,到系统给出首次响应的时间间隔,响应时间越短越好。
    响应时间由三部分组成:进程请求传送到处理机的时间、处理机对请求信息进行处理的时间、响应信息回送到显示器显示的时间。
    第一、三项很难减少,但第二项可通过合理调度算法减少。

(3)截止时间
截止时间指用户或其他系统对运行进程可容忍的最大延迟时间。在实时系统中,通常用该准则衡量一个调度算法是否合格。实际系统评价中,主要考核开始截止时间和完成截止时间。
(4) 优先权准则
在批处理、分时和实时系统中选择调度算法时,为保证某些紧急作业得到及时处理,必须遵循优先权准则。因此,系统对不同进程设立优先级,高优先级进程优先获得处理机的使用权。

3.2 面向系统的评价准则

面向系统的调度指标有4个:
(1)系统吞吐量:单位时间内系统完成的进程数目,反映系统的最大处理能力。影响该指标因素有:进程平均服务时间、系统资源利用率、进程调度算法等。
(2)处理机利用率:CPU有效工作时间/CPU总的运行时间。
(3) 各类资源均衡利用:最好让不同类型、不同需求的进程搭配运行,使CPU及其它资源均衡利用。
(4) 调度算法实现准则:算法的有效性和易实现性。

4.典型进程调度算法

4.1 先来先服务调度算法

​ FCFS( First Come First Service)算法按进程就绪的先后顺序调度进程,越早到达的进程,越先执行。FCFS算法的优缺点:
​ ① 有利于长进程,不利于短进程,排在长进程后边的短进程往往等待的时间较长,导致其周转时间过长,没有体现出短进程优先原则。
​ ② 有利于处理机繁忙进程,不利于输入输出繁忙进程。
​ ③ 算法简单,易于实现,系统开销小。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

4.2 短作业(进程)优先调度算法

1.短作业SJF(Shortest Job First)算法从后备队列中,选择一个或若干个估计运行时间最短的作业调入内存,并为它们创建进程运行。
2.短进程优先调度算法则从就绪队列中,选出一个估计运行时间最短的进程,将处理机分配给它,使它立即执行并一直到进程结束。
3.如进程在执行过程中,因某事件而阻塞并放弃处理机时,系统重新调度其他短进程。

算法优缺点:
优点:照顾了短进程,缩短了短进程的等待时间,提高了系统的总体吞吐量。
缺点:对长进程不利,甚至会导致长进程长时间无法得到关注而使得系统整体性能下降;完全未考虑进程的紧迫程度,不能保证紧迫进程被及时处理;进程运行时间很难精确估计,短进程不一定能被优先调度。

在这里插入图片描述

在这里插入图片描述

4.3 最短剩余时间优先调度算法

​ 最短剩余时间优先调度算法(SRTF,Shortest Remaining Time First),采用抢占式调度策略。当新进程加入到就绪队列中时,如它需要的运行时间<当前运行的进程所需的剩余时间,则执行切换。
​ 这种算法能保证新的短作业一进入系统就能得到服务。但是要不断统计各进程的剩余时间且进程切换较为频繁,系统开销较大。

4.4 时间片轮转调度算法

1.时间片轮转算法(RR,Round Robin)依据公平服务的原则,将处理机的运行时间划分成等长的时间片,轮转式分配给各就绪进程使用。
2.采用此算法的系统中,所有就绪进程按照先来先服务的原则排成一个队列,每次调度时将处理机分派给队首进程。
3.如进程在一个时间片内没执行完,则调度程序强行将该进程中止,进程由执行态变为就绪态并把处理机分配给下一个就绪进程。
4.该算法能保证就绪队列中的所有进程在一给定的时间段内均能获得处理机运行。

时间片分配方式有两种:
① 一次性时间片。 调度程序每次调度时,不管进程上次占用CPU时时间片是否用完,都为进程重新分配一个时间片。
② 累计时间片。如进程占用CPU时没有使用完时间片就发生了进程切换,则剩余时间片将作为下次调度的时间片。只有当该进程累计使用完时间片后,调度程序才为它重新分配一个时间片。这样能保证每个进程严格按照调度程序分配的时间片使用CPU,更好地控制进程的执行速度。

在这里插入图片描述

在这里插入图片描述

4.5 优先级调度算法

​ 优先级调度算法(Priority Scheduling)为每个进程赋予一个整数,表示其优先级。就绪进程按照优先级的大小顺序排队,调度程序选择优先级最高的进程获得CPU。该算法常被用于批处理系统中。
​ 优先级调度算法可以是抢占式或非抢占式。抢占式中,一旦就绪队列中出现了更高优先级的进程,则调度程序就进行一次抢占调度。非抢占式中,只有当前进程阻塞、时间片用完或执行结束,才把CPU让给其它高优先级进程。
​ 优先级调度算法总体又分为:静态/动态优先级调度。
​ ① 静态优先级调度:进程优先级在创建时确定,在进程的整个运行期间都不改变。此类调度中优先级是个常数。

② 动态优先级调度:进程在创建时被赋予的优先级可随进程执行或等待时间的增加而改变,这可防止低优先级进程长期得不到运行。
优先级调度算法的主要优缺点:
① 调度灵活,能适应多种调度需求。优先级的分配决定了进程的等待时间,也影响到系统吞吐量,动态优先级更是增加了系统调度的灵活性。
② 进程优先级的划分,确定每个进程优先级比较困难。
③ 抢占式调度增加了系统开销。抢占式调度增加了调度程序的执行频率,也增加了进程切换次数,加大了系统开销。

在这里插入图片描述

在这里插入图片描述

4.6 高响应比优先调度算法

一个作业或进程的响应比R定义为:
R = 响应时间/需运行时间
=(等待时间+需运行时间)/ 需运行时间
= I + 等待时间 / 需运行时间
HRRF调度程序开始调度时,首先计算各个后备作业或各个就绪进程的响应比 ,然后选择值最大的作业或进程。
OS每隔固定时间,会计算并修改所有进程的响应比R。如作业等待时间相同,则进程的运行时间越短,R越大,因而此算法有利于短作业。

​ 当执行时间相同时,进程等待时间越长,R越大,因而此算法体现了FCFS。
​ 对于长作业,作业的响应时间随等待时间增加而加大,因此此算法也照顾了长作业,避免长作业长时间无法获得CPU。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

4.7 多级反馈队列调度算法

多级反馈队列调度算法(MFQ,Multilevel Feedback Queue)综合了时间片轮转调度算法及优先级调度算法,并加以改进。

​ 该算法中设置多个调度队列,并为每个队列赋予不同的优先级和时间片。当新进程到达后,先放入优先级最高的队列中,按FCFS原则排队等待,若被调度程序选中则按时间片轮转算法被调度执行。当轮到它执行时,如它能在规定时间片内完成则撤离系统,如在规定时间片内未完成,调度程序就将它放入第二级队列的尾部……,如此下去,当它降到最低优先级队列后,便在该队列中按时间片流转算法运行,不再队列转换。
时间片的大小,与队列优先级成反比。第一级队列优先级最高,时间片最小。
调度时,仅当第一级队列空闲时,才调度第二级队列中的进程,依此类推….

在这里插入图片描述

在这里插入图片描述

5.线程调度算法

​ 支持线程技术的OS中,存在两个层面的并发活动:进程并发和线程并发,在此系统中,线程是低级调度的基本单位。

5.1 用户级线程调度

​ 用户级线程是在用户态下创建的,系统内核并不知道线程的存在。因此,系统内核只为进程服务,从就绪进程队列中选中一个进程,并分配给它一个CPU时间片。该进程内的线程调度程序,决定进程内哪个线程运行。
​ 假定获得时间片的线程是A1,因并发执行的多个线程不存在时钟中断,故A1执行时不受时钟中断干扰。如A1用完了进程A的时间片但未完成,系统内核会调度另一个进程执行。当进程A再次获得时间片时,线程A1恢复运行,如此反复直到A1完成。

在这里插入图片描述

5.2 核心级线程调度

在支持线程技术的系统中,内核直接调度线程。线程调度时,内核不考虑该线程属于哪个进程。
被选中的线程获得一个时间片,如它执行时间超过了此时间片,则它被系统强制挂起。
如线程在给定时间片内阻塞,内核线程调度程序就调度另一个线程运行。后者和前者可能属于或不属于同一个进程。

在这里插入图片描述

6.实时调度算法

6.1 实时调度目标和所需必要信息

1.在实时系统中,每个实时任务都有一个时间约束要求。实时调度(real-time scheduling)目标就是:合理安排这些任务的执行次序,使之满足各实时任务的时间约束要求。
2.通常,一个特定任务与一个截止时间相关联。截止时间包括:开始截止时间(任务在某时间以前,必须开始执行)、完成截止时间(任务在某时间以前必须完成)
3.实时调度策略主要考虑:如何使硬实时任务,在规定的截止时间内完成(或开始)。同时,尽可能使软实时任务也在规定截止时间内完成(或开始)。

多数操作系统都无法实现直接依据任务截止时间进行调度,它们一般通过提高响应速度来完成。
通常,实时系统中同时有多个周期性任务并发执行,形成任务流,它们都要求系统做出实时响应。
如:系统中有n个周期性任务,其中任务出现的周期为Pi,执行任务所需CPU时间为Ci,则系统能处理任务流条件是:(C1/P1 + C2/P2 + …… +Cn/Pn)<=1(可调度测试公式)
满足可调度测试公式的实时任务流才是可调度的。在考虑调度算法时,还需要以下信息:

(1)任务成为就绪态、准备执行的时间。
(2)开始/完成截至时间,通常不能二者都知道,只能知道第一个。
(3)任务执行需要的时间。
(4)任务执行时的资源要求。
(5)任务的优先级。通常硬实时任务优先级高。
(6)任务的分解成子任务的具体情况。

6.2 抢占调度和快速切换机制

严格的实时系统中,如硬实时系统,允许优先权高的实时任务,抢占优先权低的任务,从而满足实时任务对截止时间的要求。如一个实时任务不抢占就能够满足自己的截止时间,则不宜采取抢占调度。
实际应用中,系统判断能否满足截止时间并不容易。如系统小,需处理的任务较少,则容易判断;如系统较大,则很难判断。
快速切换机制可实现对实时任务的快速切换,此机制常用硬件装置实现快速中断。在软件实现上,可通过提高分派程序对任务切换的速度,来提高系统的性能。

6.3 典型实时调度算法

1.最早截止时间优先调度算法(EDF, Earliest Deadline First)
基本思想:根据实时任务的开始截止时间,确定任务的优先级,截止时间越早,优先级越高。调度程序把所有可运行的进程,按截止时间放在一个以表格形式存在的就绪队列中,队首任务截止时间最早。调度程序调度时,总是选队首进程。
对新到达的实时任务,系统查看其截止时间。如截止时间先于正在运行任务的截止时间,则新进程抢占当前进程的CPU使用权。
最早截止时间优先调度算法是抢占式调度算法,适用于周期性和非周期实时任务的调度。

在这里插入图片描述

2.速率单调调度算法(RMS, Rate Monotonic Scheduling)
算法面向周期性实时任务,它是非抢占式调度算法。RMS根据任务的周期大小给每个实时任务赋予不同的优先级,周期最短的任务具有最高的优先级。该算法广泛应用于工业实时控制系统的周期性任务调度。
RMS为每个任务赋予的优先级与该任务的任务速率成正比关系。任务速率越大,任务的优先级越高。任务速率是任务周期的倒数,以赫兹为单位。任务周期是指一个任务到达至下一个任务到达之间的时间范围,包括任务被CPU执行的时间和等待下一个任务到达的CPU空闲时间。所以,该算法又称为优先级随速率单调的调度算法。
RMS调度是非抢占式调度,相对于EDF调度更容易实现。两者在处理机利用率上差别不大,都可以达到90%左右。

7.Linux进程调度概述

Linux内核主要包括进程调度、内存管理、设备管理和驱动、虚拟文件系统和网络通信五部分。
1.调度方式
Linux根据进程调度策略(policy)将进程划分为实时进程和普通进程两类 。
实时进程优先于普通进程运行。实时进程采用时间片轮转和先进先出的调度策略。
普通进程则采用动态优先调度策略

Linux内核中的函数schedule()是实现进程调度的函数,它通过调用函数goodness()来选择最值得运行的进程获得CPU。Linux内核为每个进程都分配了一定的时间片和优先级,以保证CPU上始终是优先级最高的进程在运行。当选中一个进程后,之后的进程切换工作由函数schedule()调用switch_mm()和switch_to()来实现。其中,switch_mm()负责切换虚拟内存,switch_to()负责切换系统堆栈。
在Linux中,进程切换的方式有两种,一种是主动调度方式,进程自己通过系统调用,将自己转换成阻塞、僵死、暂停等状态;另一种是被动调度方式,进程由系统空间返回到用户空间,即从中断、系统调用或异常返回到用户空间执行时,其可执行的时间片已经用完,系统将转入schedule()函数重新调用进程。

2 调度时机
一般来讲,引起Linux系统中进程调度的原因主要有以下几种。

(1)CPU上正在运行进程的状态发生改变,不再占用CPU。
(2)就绪队列中增加了新进程。
(3)正在执行进程的时间片用完。
(4)执行系统调用的进程返回到用户态。
(5)系统内核结束中断处理返回到用户态。
(6)直接执行调度。

3 调度算法

(1)在调度算法的实现上,涉及到Linux进程控制块(task_struct结构)中的四个域:rt_priority、policy、priority(nice)和counter。调度程序根据这四个参数对进程进行调度,分配CPU。其中,policy的值表示不同类型进程的调度策略,其取值范围如下。
1)SCHED_OTHER(值为0):普通进程优先级轮转法。
2)SCHED_FIFO(值为1):实时进程先来先服务算法。
3)SCHED_RR(值为2):实时进程优先级轮转算法。
(2)Linux中的进程调度以进程的优先级为调度依据。调度算法所使用的数据结构相对简单,并将多种调度策略有机地结合起来,同时兼顾各类进程的特点。
(3)Linux中的内核线程采取了与进程一样的表示和管理方式,Linux使用进程调度统一处理进程和内核线程,通过进程调度可得知线程调度的情况。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值