from《计算机操作系统》第四版
逢考必过!冲冲冲!

<>3.1 处理机调度的层次和调度算法的目标

调度实质是一种资源分配。处理机调度是对处理机的资源分配。

<>3.1.1 处理机调度的层次

*
高级调度(High Scheduling)= 作业调度 = 长程调度

调度对象:作业;主要用于多道批处理系统,在分时和实时系统中不设置高级调度。

*
低级调度(Low Scheduling)= 进程调度 = 短程调度

调度对象:进程(内核级线程)。三种OS都要配置该调度。

*
中级调度 (Intermediate Scheduling)= 内存调度

当挂起状态的进程已具备运行条件且内存又有空闲时,由中级调度来决定,把外存上的那些已具备运行条件的就绪进程再重新调入内存,并修改其为就绪状态,挂在就绪队列上等待。实际上存储器管理的对换功能。

<>3.1.2 处理机调度算法的目标

<>1. 处理机调度算法的共同目标

* 资源利用率
CPU利用率=CPU有效工作时间/(CPU有效工作时间+CPU空闲等待时间)
* 公平性
* 平衡性
* 策略强制执行
<>2. 批处理系统的目标

*
平均周转时间短

周转时间:指从作业被提交给系统开始,到作业完成为止的这段时间间隔,称为作业周转时间。
周转时间=作业在外存后备队列上等待(作业)调度时间 + 进程在就绪队列上等待进程调度的时间 + 进程在CPU执行时间 +
进程等待I/O操作完成时间(后三项在一次作业中可能发生多次)

平均周转时间:

带权的周转时间:(作业周转时间Ti、系统为他服务时间Ts)

*
系统吞吐量高

吞吐量:单位时间内系统所完成的作业数
与批处理作业的平均长度有关,尽可能选择短作业。

*
处理机利用率高
使用计算量大的作业,尽可能使用处理机

<>3. 分时系统

*
响应时间快

响应时间:从用户通过键盘提交一个请求开始,知道屏幕上显示出处理结果为止的一段时间间隔。
响应时间 = 请求信息从键盘输入开始,直至到处理机的时间 + 处理机对请求信息进行处理的时间 + 所形成的响应信息回送到处理机的时间

*
均衡性
均衡性:系统响应时间的快慢应与用户请求服务的复杂性相适应

<>4. 实时系统

*
截止时间的保证

截止时间:某任务必须开始执行的最迟时间或必须完成的最迟时间。

*
可预测性

<>3.2 作业与作业调度

<>3.2.1 批处理系统中的作业

<>1. 作业和作业步

*
作业

作业 = 程序 + 数据 + 作业说明书,批处理系统以作业为基本单位从外存调入内存

*
作业步

作业运行期间,每个作业都必须经过若干相对独立又相互关联的顺序加工步骤才能得到结果。把其中每一个加工步骤称为一个作业步。如“编译”作业步,“链接装配”作业步,“运行”作业步。

<>2. 作业控制块JCB

<>3. 作业运行的三个阶段和三种状态

* 收容阶段—后备状态
* 运行阶段—运行状态(作业第一次进入就绪状态直到它运行结束)
* 完成阶段—完成状态
<>3.2.2 作业调度的主要任务

作业调度主要任务是,根据JCB的信息,检查系统中的资源是否满足作业对资源的需求,以及按照一定的调度算法,从外存的后备队列中选取某些作业调入内存,并为他们创建进程、分配必要的资源。然后再将新创建的进程排在就绪队列上等待调度。

* 接纳多少作业
* 接纳哪些作业
只有批处理系统需要作业调度,因为只有批处理系统作业先驻留在外存的作业后备队列

<>3.2.3 先来先服务FCFS和短作业(进程)优先SJF调度算法

<>1. 先来先服务调度算法FSFS【P96】

既可用于作业调度,也可用于进程调度。

系统按照作业到达的先后次序进行调度,或者说是优先考虑在系统中等待时间最长
的作业,而不管该作业所需执行的时间长短,从后备队列中选择几个最先进入该队列的作业,将它们调入内存,为它们分配资源和创建进程,然后放入就绪队列。

<>2. 短作业优先调度算法SJF【P97】

既可用于作业调度,也可用于进程调度。

SJF是以作业的长短来计算优先级,作业越短,其优先级越高。作业长短是以作业所要求的运行时间来衡量。将外存的作业后备队列中选择若干个估计运行时间最短的作业,优先将他们调入内存运行。

<>3.2.4 优先级调度算法PSA和高响应比优先调度算法HRRN【P97】

<>1. 优先级调度算法PSA

既可用于作业调度,也可用于进程调度。

基于作业的紧迫程度,由外部赋予作业相应的优先级,调度算法根据该优先级进行调度。系统从后备队列中选择若干个优先级最高的作业装入内存。

<>2. 高响应比优先调度算法HRRN

由于等待时间与服务时间之和,就是系统对该作业的响应时间,故该优先权又相当于响应比RP

优先权 =(等待时间+要求服务时间)/要求服务时间 = 响应时间/要求服务时间

<>3.3 进程调度

三种类型的OS都有进程调度

<>3.3.1 进程调度的任务、机制和方式

<>1. 进程调度的任务:保存、选择、分配

* 保存处理机的现场信息
* 按某种算法选取算法
* 把处理器分配给进程
<>2. 进程调度机制:排队器、分派器、上下文切换器

<>3.进程调度方式

*
非抢占方式

一旦把处理机分配给某进程后,就一直让他运行下去,绝不会因为时钟中断或任何其他原因去抢占当前正在运行进程的处理机,直至该进程完成,或发生某事情而被阻塞,才把处理机分配给其他进程。

不适合分时系统和大多数的实时系统。

*
抢占方式

允许调度程序根据某种原则,去暂停某个正在执行的进程,将已分配给该进程的处理机重新分配给另一进程。有以下原则:
(1)优先权原则:当新进程到达时,…
(2)短进程优先原则:当新进程到达时,…
(3)时间片原则:各进程按时间片轮转运行时,当正在执行的进程的一个时间片用完后,便停止该进程的执行而重新进行调度。

<>3.3.2 轮转调度算法RR【P100】

分时系统,就绪队列n个进程,每个进程每次获得1/n的处理时间

<>1. 轮转的基本原理

在RR中,系统根据FCFS,将所有就绪进程排成一个就绪队列,并可设置每隔一段时间间隔即产生一次中断,激活系统中的进程调度程序,完成一次调度,将CPU分配给队首进程,令其执行。当该进程的时间片耗尽或运行完毕,系统将CPU分配给新的队首进程(或新到达的紧迫进程)。

<>2. 进程切换时机

* 时间片未用完,进程完成:激活调度程序,将它从就绪队列删除,再调度就绪队列中队首进程运行,启动新的时间片
* 时间用完:计时器中断处理程序被激活。进程未完成:送到就绪队列末尾。
<>3. 时间片大小的确定

时间片大小略大于一次典型的交互所需时间

周转时间 = 完成时间 - 到达时间

带权周转时间 = 周转时间 / 服务时间

<>3.3.3 优先级调度算法【P102】

<>1. 优先级调度算法的类型

非抢占式
抢占式

<>2. 优先级的类型

(1)静态优先级
创建进程时确定的,在进程的整个运行期间保持不变。依据:进程类型、进程对资源需求、用户要求
(2)动态优先级
在创建进程之初,先赋予其一个优先级,然后其值随进程的推进或等待时间的增加而改变,以便获得更好的调度性能。

<>3.3.4 多队列调度算法

将系统中的进程就绪队列从一个拆分为若干个,将不同类型或性质的进程固定分配在不同的就绪队列,不同的就绪队列采用不同的调度算法,一个就绪队列中的进程可以设置不同的优先级,不同的就绪队列本身也可设置不同的优先级。

<>3.3.5 多级反馈队列调度算法【P103】

(1) 设置多个就绪队列,并为各个队列赋予不同的优先级。
第一个队列的优先级最高,第二个队列次之,其余各队列的优先权逐个降低。该算法赋予各个队列中进程执行时间片的大小也各不相同,
在优先权愈高的队列中,为每个进程所规定的执行时间片就愈小
。例如,第二个队列的时间片要比第一个队列的时间片长一倍,……,第i+1个队列的时间片要比第i个队列的时间片长一倍。

(2) 每个队列都采用FCFS算法
。当一个新进程进入内存后,首先将它放入第一队列的末尾,按FCFS原则排队等待调度。当轮到该进程执行时,如它能在该时间片内完成,便可准备撤离系统;如果它在一个时间片结束时尚未完成,调度程序便将该进程转入第二队列的末尾,再同样地按FCFS原则等待调度执行;如果它在第二队列中运行一个时间片后仍未完成,再依次将它放入第三队列,……,如此下去,当一个长作业(进程)从第一队列依次降到第n队列后,在第n队列中便采取按时间片轮转的方式运行。

(3) 按队列优先级调度。仅当第一队列空闲时,调度程序才调度第二队列中的进程运行; 仅当第1~(i-1)
队列均空时,才会调度第i队列中的进程运行。如果处理机正在第i队列中为某进程服务时,又有新进程进入优先权较高的队列(第1~(i-1)中的任何一个队列),则此时新进程将抢占正在运行进程的处理机,即由调度程序把正在运行的进程放回到第i队列的末尾,把处理机分配给新到的高优先权进程。

<>2. 多级反馈队列调度算法的性能

终端型作业用户
短批处理作业用户
长批处理作业用户

<>3.3.6 基于公平原则的调度算法

<>1. 保证调度算法

保证处理机分配的公平性,即N个相同类型的进程同时运行,须保证每个进程获得相同的处理机时间1/N。

<>2.公平分享调度算法

针对用户而言,使所有用户获得相同的处理机时间,或者所要求的时间比例。

执行强制调度序列。如用户1有ABCD进程,用户2有E进程,则序列为AEBECEDEAE…。若要求用户1获得的处理机时间是用户2的两倍,则序列为ABECDEABECDE…

<>3.4 实时调度

<>3.4.1 实现实时调度的基本条件

<>1. 提供必要的信息

* 就绪时间
* 处理时间
* 优先级
* 开始截止时间和完成截止时间
* 资源要求
<>2. 系统处理能力强

在实时系统中,通常都有着多个实时任务。若处理机的处理能力不够强,则有可能因处理机忙不过来而使某些实时任务不能得到及时处理, 从而导致发生难以预料的后果。
假定系统中有m个周期性的硬实时任务,它们的处理时间可表示为Ci,周期时间表示为Pi,则在单处理机情况下,必须满足下面的限制条件:

解决的方法是提高系统的处理能力,其途径有二:其一仍是采用单处理机系统, 但须增强其处理能力,
以显著地减少对每一个任务的处理时间;其二是采用多处理机系统。假定系统中的处理机数为N,则应将上述的限制条件改为:

<>3. 采用抢占式调度机制

<>4. 具有快速切换机制

* 对外部中断的快速响应能力
* 快速的任务分派能力
<>3.4.2 实时调度算法的分类

<>1. 非抢占式调度算法

* 非抢占式轮转调度算法
* 非抢占式优先调度算法
<>2. 抢占式调度算法

*
基于时钟中断的抢占式优先权调度算法:某实时任务到达后,若它的优先级高于当前任务的优先级,此时不立即抢占当前任务的处理机,而等到时钟中断发生是,调度程序才剥夺当前任务的执行。
* 立即抢占(Immediate Preemption)的优先权调度算法

<>3.4.3最早截止时间优先算法EDF【P107】

<>1. 非抢占调度方式用于非周期性实时任务

<>2. 抢占式调度方式用于周期性实时任务

为了保证任务在每个周期都能顺利完成,必须采用抢占式调度方式。(为什么?)

<>3.4.4 最低松弛度优先即LLF(Least Laxity First)算法

松弛度=必须完成时间-其本身的运行时间-当前时间

根据任务紧急(或松弛)的程度,来确定任务的优先级。任务的紧急程度愈高,为该任务所赋予的优先级就愈高,
以使之优先执行。例如,一个任务在200ms时必须完成,而它本身所需的运行时间就有100ms,因此,调度程序必须在100
ms之前调度执行,该任务的紧急程度(松弛程度)为100 ms。

假如在一个实时系统中,有两个周期性实时任务A和B,任务A要求每 20 ms执行一次,执行时间为 10 ms;任务B只要求每50 ms执行一次,执行时间为
25 ms。

<>3.4.5 优先级倒置

<>1. 优先级倒置的形成

高优先级进程被低优先级进程延迟或阻塞。
例如:进程优先级P1>P2>P3,P1和P3共享一个临界资源。
P1….P(mutex); CS-1; V(mutex);…
P2….program2….
P3….P(mutex); CS-3; V(mutex);….

<>2. 优先级倒置的解决方法

* 高优先级进程不能抢占已进入临界区进程的处理机
* 动态优先级继承
<>3.5 死锁概述

<>3.5.1 资源问题

<>1.可重用性资源和消耗性资源

* 可重用:设备、文件
* 不可重用:进程间通信的消息
<>2.可抢占性资源和不可抢占性资源

* 可抢占:CPU和主存
* 不可抢占:光盘、磁带机、打印机
<>3.5.2 计算机系统中的死锁

死锁的起因:源于多个进程对资源的争夺,不仅对不可抢占资源进行争夺时会引起死锁,对可消耗资源进行争夺时,也会引起死锁。

<>1. 竞争不可抢占资源引起死锁

<>2. 竞争可消耗资源引起死锁

<>3. 进程推进顺序不当引起死锁

<>3.5.3 死锁的定义、必要条件和处理方法

<>1. 死锁的定义

如果一组进程的每一个进程都在等待仅有改组进程中的其它进程才能引发的时间,那么改组进程是死锁的。

<>2. 产生死锁的必要条件

以下四种条件缺一不可

* 互斥条件
* 请求和保持条件
* 不可抢占条件
* 循环等待条件
<>3. 处理死锁的方法

* 预防死锁
* 避免死锁
* 检测死锁
* 解除死锁
<>3.6 预防死锁

破坏产生死锁的四个必要条件避免死锁。(互斥条件不可改变)

<>3.6.1 破坏“请求和保持”条件

* 第一种协议:所有进程开始前必须一次性申请全部资源
* 第二种协议:允许一个进程只获得运行初期所需的资源后开始运行,运行过程中逐步释放已分配给自己的且已用毕的全部资源,然后再请求新的所需资源
<>3.6.2 破坏“不可抢占”条件

当一个以保持了某些不可被抢占资源的进程,提出新的资源请求而不能得到满足时,它必须释放已经保持的所有资源,等以后需要时再重新申请。

<>3.6.3摒弃“循环等待”条件

对系统所有资源类型进行线性排序并赋予不同的序号。

<>3.7 避免死锁

避免死锁同样属于事先预防的策略,但不是事先采取某种措施破坏死锁的必要条件,而是在资源动态分配过程中,防止系统进入不安全状态,以避免发生死锁。目前常用此方法。

<>3.7.1 系统安全状态

<>1. 安全状态

在避免死锁的方法中,允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次资源分配的安全性。若此次分配不会导致系统进入不安全状态,则将资源分配给进程;
否则,令进程等待。
所谓安全状态,是指系统能按某种进程顺序(P1, P2, …,Pn)(称〈P1, P2, …,
Pn〉序列为安全序列),来为每个进程Pi分配其所需资源,直至满足每个进程对资源的最大需求,使每个进程都可顺利地完成
。如果系统无法找到这样一个安全序列,则称系统处于不安全状态。

<>2. 安全状态之例

我们通过一个例子来说明安全性。假定系统中有三个进程P1、
P2和P3,共有12台磁带机。进程P1总共要求10台磁带机,P2和P3分别要求4台和9台。假设在T0时刻,进程P1、P2和P3已分别获得5台、2台和2台磁带机,尚有3台空闲未分配,如下表所示:

<>3. 由安全状态向不安全状态的转换

<>3.7.2 利用银行家算法避免死锁

<>1. 银行家算法中的数据结构

*
可利用资源向量Available。含有m个元素的数组,其中的每一个元素代表一类可利用的资源数目,其初始值是系统中所配置的该类全部可用资源的数目,其数值随该类资源的分配和回收而动态地改变
*
最大需求矩阵Max。这是一个n×m的矩阵,它定义了系统中n个进程中的每一个进程对m类资源的最大需求。如果Max[i,j]=K,则表示进程i需要Rj类资源的最大数目为K
*
分配矩阵Allocation。这也是一个n×m的矩阵,它定义了系统中每一类资源当前已分配给每一进程的资源数。如果Allocation[i,j]=K,则表示进程i当前已分得Rj类资源的数目为K
*
需求矩阵Need。这也是一个n×m的矩阵,用以表示每一个进程尚需的各类资源数。如果Need[i,j]=K,则表示进程i还需要Rj类资源K个,方能完成任务。
Need[i,j]=Max[i,j]- Allocation[i,j]

<>2. 银行家算法

<>4. 银行家之例

<>3.8 死锁的检测与解除

<>3.8.1 死锁的检测

<>1. 资源分配图(Resource Allocation Graph)

<>2. 死锁定理

S为死锁的充分条件:当且仅当S状态的资源分布图是不可完全简化的

<>3. 死锁检测中的数据结构

<>3.8.2 死锁的解除

* 抢占资源
* 撤消进程

技术
下载桌面版
GitHub
Gitee
SourceForge
百度网盘(提取码:draw)
云服务器优惠
华为云优惠券
腾讯云优惠券
阿里云优惠券
Vultr优惠券
站点信息
问题反馈
邮箱:[email protected]
吐槽一下
QQ群:766591547
关注微信