【操作系统】第三章 处理机调度与死锁

1.处理机调度相关基本概念
处理机调度:多道程序环境下,动态的把处理机分配给就绪队列中的一个进程使之执行。
(1)作业进入系统驻留在外存的后备队列上,再至调入内存运行完毕,可能要经历下述三级调度。
高级调度(High Scheduling)(又称作业调度或长程调度(Long-Term Scheduling),接纳调度(Admission Scheduling))
主要在早期批处理阶段,处理在外存上的作业。
接纳多少作业——取决于多道程序度。
接纳哪些作业——取决于采用的调度算法。
系统运行并不一定存在高级调度

低级调度(Low Level Scheduling)(也称为进程调度、微观调度或短程调度(Short-Term Scheduling))
**是最基本的一种调度,在三种基本OS中都有。**运行频率最高,算法不能太复杂
进程调度方式: 调度的时机
—————————————————————————————————
非抢占方式 程序完成;
发生某事件阻塞;
————————————————————————————————
抢占方式 程序完成;
发生某事件阻塞;
新进程就绪;
PCB记录系统中所有进程的有关情况
中级调度(Intermediate-Level Scheduling)(又称交换调度或中程调度(Medium-Term Scheduling))

在这里插入图片描述(2)三类调度队列模型
1)仅有进程调度的调度队列模型
常见情况:分时系统。
调度对象:处于就绪状态的进程。
组织形式:栈、树或一个无序链表

分时系统中把就绪进程组织成FIFO队列形式:按时间片轮转方式运行。
每个进程在执行时按规定的时间片算法,在给定时间片内任务有三种执行情况:
a.完成工作,释放处理机进入完成状态
b.未完成,将该任务再放入就绪队列末尾
c.因某事件而被阻塞,被OS放入阻塞队列
2)具有高级和低级调度的调度队列模型
批处理系统中,还需要作业调度
3)同时具有三级调度的调度队列模型
引入中级调度后,进程的状态变化:
a.就绪状态:分为内存就绪和外存就绪。
b.阻塞状态:分为内存阻塞和外存阻塞。
中级调度使进程在上述状态间变化,并使数据在内外存间互换。
(3)选择调度方式和调度算法的若干准则
1)面向用户的准则
a.周转时间短:
CPU执行用时Ts
总的等待时间Tw = 在后备队列中等待 + 就绪队列上等待+ 阻塞队列中等待(等待I/O操作用时)
周转时间T=Ts+Tw
带权周转时间W= T/Ts
平均周转时间、平均带权周转时间(n个作业求平均)
b.响应时间快
c.均衡性
d.截止时间的保证
e优先权准则
2)面向系统的准则
系统吞吐量高:批处理系统的重要指标。
2.常用调度算法
(1)调度的实质就是一种资源分配。
批处理系统为照顾为数众多的短作业,应采用短作业优先的调度算法;
分时系统为保证系统具有合理的响应时间,应采用轮转法进行调度。
a.先来先服务调度算法FCFS(First Come First Service) 不利于短作业
按先后顺序进行调度。既可用于作业调度,也可用于进程调度。
b.短作业(进程)优先调度算法SJF/SPF
1)优点:SJF/SPF调度算法能有效的降低作业的平均等待时间,提高系统吞吐量。
分抢占和非抢占两种方式
2)SJF/SPF的不足:
1. 对短作业有利,但同时造成了对长作业的不利。
2.由于作业(进程)的长短含主观因素,不一定能真正做到短作业优先。
3.未考虑作业的紧迫程度,因而不能保证紧迫性作业(进程)的及时处理。
c.高优先权优先调度算法HPF Highest Priority First
1)分两种方式:
非抢占式优先权算法
抢占式优先权算法 关键点:新作业产生时
2)优先权的类型
静态优先权:创建进程时确定,整个运行期间保持不变。一般利用某一范围的一个整数来表示,又称为优先数。
动态优先权:创建进程时赋予的优先权可随进程的推进或随其等待时间的增加而改变。
d.高响应比优先调度算法HRRN Highest Response Raito Next
HRRN为每个作业引入动态优先权
优先权 =(等待时间+要求服务时间)/要求服务时间
= 响应时间 / 要求服务时间
c.基于时间片的轮转调度算法RR (Round Robin)
分时系统新需求:及时响应用户的请求;采用基于时间片的轮转式进程调度算法。
(1)时间片轮转算法
a.将系统中所有的就绪进程按照FCFS原则,排成一个队列。
b.每次调度时将CPU分派给队首进程,让其执行一个时间片。时间片的长度从几个ms到几百ms。
c.在一个时间片结束时,发生时钟中断。
d.调度程序据此暂停当前进程的执行,将其送到就绪队列的末尾,并通过上下文切换执行当前就绪的队首进程。
进程阻塞情况发生时,未用完时间片也要出让CPU
(2)多级反馈队列算法FB (Multiple-level Feed Back Queue)
a.设置多个就绪队列,各队列有不同的优先级,优先级从第一个队列依次降低。
b. 赋予各队列进程执行时间片大小不同, 优先权越高,时间片越短。
当一个新进程进入内存,引发的调度过程
准备调度:先将它放入第一个队列的末尾,按FCFS原则排队等待调度。
IF时间片内完成,便可准备撤离系统;
IF时间片内未能完成,调度程序便将该进程转入第二队列的末尾等待再次被调度执行。
当第一队列中的进程都执行完,系统再按FCFS原则调度第二队列。在第二队列的稍放长些的时间片内仍未完成,再依次将它放入第三队列。
依次降到第n队列后,在第n队列中便采取按时间片轮转的方式运行。

在这里插入图片描述
3.实时调度
(1)实时系统:指系统能够在限定的响应时间内提供所需水平的服务
实时任务:具有明确时间约束的计算任务,有软/硬,随机/周期性之分。
硬实时任务:必须满足任务对截止时间的要求
软实时任务:联系着一个截止时间,但不严格,可偶尔错过,不会对系统造成大的影响。
(2)实时调度算法的分类:
根据实时任务的性质
硬实时调度算法
软实时调度算法;

按调度方式
非抢占调度算法
抢占调度算法;

根据调度时间不同
静态调度算法
动态调度算法。

多处理机环境下
集中式调度
分布式调度

(3)常用的几种实时调度算法:
a.最早截止时间优先EDF(Earliest Deadline First)算法
根据任务的开始截止时间来确定任务的优先级。截止时间越早,其优先级越高。
b.最低松弛度优先LLF(Least Laxity First)算法
松弛度= 截止完成时间 – 还需执行时间 - 当前时间
松弛度越小,越紧急
4.产生死锁的原因和必要条件
(1)死锁(Deadlock): 指进程之间无休止地互相等待!
饥饿(Starvation):指一个进程无休止地等待!
(2)产生死锁的必要条件(必须四个同时具备)
a.互斥条件
b.请求和保持条件
c.不剥夺条件
d.环路等待条件
5.预防死锁的方法
摒弃“请求和保持”条件
摒弃“不剥夺”条件
摒弃“环路等待”条件
6…避免死锁
只要使系统始终处于安全状态,便可避免发生死锁。
不是所有的不安全状态都是死锁状态。
银行家算法:
向量Available :(i1,i2,…,im),含m个元素,每个元素代表一类可利用的资源数目。
最大需求矩阵Max
已分配矩阵Allocation:nm,定义系统中每一进程已获得的每类资源数量。
还需求的矩阵Need:n
m,表示每一进程尚需的各类资源数。
三者之间的关系:Max【i,j】= Allocation【i,j】+Need【i,j】
算法过程:
进程Pi发出资源请求后,系统按下述步骤进行检查:
首先是两个基本判断:
(1)IF Requesti[j]<= Need[i,j]
THEN 转向步骤2;
ELSE 认为出错,所需资源数超过宣布的最大值(自我矛盾)
(2)IF Requesti[j]<= Available[j]
THEN 转向步骤3;
ELSE 表示尚无足够资源,Pi需等待(现实不满足)
如果上面两步判断都通过了,进入实质的资源分析
(3)系统试探着把资源分配给进程Pi ,并修改相应数据结构的值(假设性操作):
Available【j】 =Available【j】 - Requesti【j】;
Allocation【i,j】=Allocation【i,j】+ Requesti【j】;
Need【i,j】= Need【i,j】 - Requesti【j】;
(4)系统执行安全性算法,判断新的资源分配状态是否是安全的。
即:找一个安全序列,使这些进程按顺序执行完)如果能够找到,则将假设操作真正实施完成资源分配。
7.死锁的检测与解除
当发现进程死锁时,便应立即把它们从死锁状态中解脱出来。常采用的方法是:
剥夺资源。从其他进程剥夺足够数量的资源给死锁进程以解除死锁状态。
撤销进程。最简单的是让全部进程都死掉;温和一点的是按照某种顺序逐个撤销进程,直至有足够的资源可用,使死锁状态消除为止。
8.
(1)若要使当前运行进程总是优先级最高的进程,则应选择:可抢占优先级调度算法。
(2)在分时系统中,进程调度经常采用:时间片轮转调度算法。
(3)不让死锁发生的策略可分为静态和动态两种,死锁避免属于:动态策略。
(4)预先静态分配法可以破坏:占有且等待条件。
(5)某系统中有3个并发进程,都需要同类资源4个,该系统绝对不会发生死锁的最少资源个数是:
使3个并发进程都分配到了3个资源,在加1个便可 3*3+1=10

猜你喜欢

转载自blog.csdn.net/sun_sxq/article/details/83310423