处理机调度与死锁

 

处理机调度:多道程序环境下,动态的把处理机分配给就绪队列中的一个进程使之执行。

提高处理机的利用率、改善系统性能,很大程度上取决于处理机调度的性能

处理机调度便成为OS设计的中心问题之一。分配的任务由处理机调度程序完成。

一、处理机调度的基本概念

作业进入系统驻留在外存的后备队列上,再至调入内存运行完毕,可能要经历下述三级调度。

高级调度(High Scheduling)

 

又称作业调度或长程调度(Long-Term Scheduling),接纳调度(Admission Scheduling)
主要在早期批处理阶段,处理在外存上的作业
决定外存后备队列中的哪些作业调入内存;
为它们创建进程、分配必要的资源;
将新创建的进程排在就绪队列上,准备执行。
管理的方面比较多。
* 系统运行并不一定存在高级调度
批处理系统:作业进入系统后先驻留外存,故需要有作业调度。
分时系统:为及时响应,作业由终端直接送入内存,故不需作业调度。
实时系统中,通常也不需作业调度。 

 

中级调度(Intermediate-Level Scheduling)

 

也称为进程调度、微观调度或短程调度(Short-Term Scheduling)
决定内存就绪队列中的哪个进程获得处理机,进行分配工作。是最基本的一种调度,在三种基本OS中都有。
进程调度方式
1)非抢占方式(Non-preemptive Mode)
一旦处理机分配给某进程,该进程一直执行。决不允许其他进程抢占已分配运行进程的处理机。
2)抢占方式(Preemptive Mode)
允许调度程序根据某种原则,暂停某个正在执行的进程,将处理机重新分配给另一进程。
进程调度方式比较

 

低级调度(Low Level Scheduling)

 

又称交换调度或中程调度(Medium-Term Scheduling)
引入目的:提高内存利用率和系统吞吐量。根据条件将一些进程调出或再调入内存。

 

三种调度的频率和复杂度
进程调度:运行频率最高,算法不能太复杂,以免占用太多的CPU时间。分时系统通常10~100ms便进行一次。
作业调度:一个作业运行完毕退出系统时即触发重新调度一个新作业入内存,周期较长,大约几分钟一次。因而也允许作业调度算法花费较多的时间。
中级调度:运行频率基本上介于上述两种调度之间。

4、调度队列模型
不论高级、中级或者低级调度,都涉及到进程队列,由此形成了三类调度队列模型。从这三种方式中体验调度的过程。
1)仅有进程调度的调度队列模型
常见情况:
分时系统。
通常仅设置进程调度,用户键入的命令和数据,都直接送入内存。
调度对象:
处于就绪状态的进程。
组织形式:
栈、树或一个无序链表
用何种形式取决于OS类型和采用的调度算法。

每个进程在执行时按规定的时间片算法,在给定时间片内任务有三种执行情况:
完成工作,释放处理机进入完成状态
未完成,将该任务再放入就绪队列末尾
因某事件而被阻塞,被OS放入阻塞队列
2)具有高级和低级调度的调度队列模型
 批处理系统中,还需要作业调度
3)同时具有三级调度的调度队列模型
引入中级调度后,进程的状态变化:
 就绪状态:分为内存就绪和外存就绪。
阻塞状态:分为内存阻塞和外存阻塞。
中级调度使进程在上述状态间变化,并使数据在内外存间互换。

 

 

5.选择调度方式和调度算法的若干准则
什么算法是好算法?
不同的情况和对象需求不同,适用的方式和算法也不同。

1)面向用户的准则
周转时间短:
针对批处理系统的性能指标。作业从提交到完成所经历的时间。
CPU执行用时Ts
总的等待时间Tw=在后备队列中等待+就绪队列上等待
阻塞队列中等待(等待I/O操作用时)
周转时间T=Ts+Tw
带权周转时间W=T/Ts
平均周转时间、平均带权周转时间(n个作业求平均)

2)面向系统的准则
系统吞吐量高:批处理系统的重要指标。
单位时间内所完成的作业数,跟作业本身(与作业平均长度密切相关)和调度算法都有关系;
处理机利用率好(主要针对大中型主机)
各类资源的平衡利用(主要针对大中型主机)


不同系统需求各有侧重
批处理系统
平均周转时间短
系统吞吐量高
处理机利用率好
分时系统
响应时间快
均衡
实时系统
截至时间的保证
可预测性

二、常用的调度算法

 

 

多级反馈队列调度算法是一种性能较好的作业低级调度策略,能够满足各类用户的需要。对于分时交互型短作业,
系统通常可在第一队列(高优先级队列)规定的时间片内让其完成工作,使终端型用户都感到满意;对短的批处理理作业,
通常,只需在第一或第一、第二队列(中优先级队列)中各执行一个时间片就能完成工作,周转时间仍然非常短;对长的批处理作业,
它将依次在第一、第二、……,各个队列中获的时间片并运行,决不会出现得不到处理的情况。

三、实时调度

什么是实时系统?
指系统能够在限定的响应时间内提供所需水平的服务。
指计算的正确性不仅取决于程序的逻辑正确性,也取决于结果产生的时间,如果系统的时间约束条件得不到满足,将会发生系统出错。
实时任务:具有明确时间约束的计算任务,有软/硬,随机/周期性之分。

硬实时任务:必须满足任务对截止时间的要求

软实时任务:联系着一个截止时间,但不严格,可偶尔错过,不会对系统造成大的影响。
实时系统的任务往往带有某种程度的紧迫性,因而实时系统的调度有某些特殊要求。

为此引入适合的实时调度算法
为保证系统正常工作,调度应具备下列条件
提供必要的信息
系统处理能力足够强
采用抢占式调度机制
具有快速切换机制

 实时调度算法的分类

3. 常用的几种实时调度算法
目前有许多实时调度算法,在常用的算法中简单介绍两种实时调度算法:
最早截止时间优先EDF(Earliest Deadline First)算法
最低松弛度优先LLF(Least Laxity First)算法

 

四、产生死锁的原因和必要条件 

死锁(Deadlock):指多个进程在运行过程中,因争夺资源而造成的一种僵局。
当进程处于这种状态时,若无外力作用,它们都将无法再向前推进。
死锁(Deadlock): 指进程之间无休止地互相等待!
饥饿(Starvation):指一个进程无休止地等待!
死锁发生:双方都拥有部分资源,同时在请求对方已占有的资源。
产生死锁的原因可归结为如下两点:
竞争资源。系统中供多个进程共享的资源如打印机、公用队列等的数目不满足需要时,
会引起资源竞争而产生死锁。
进程间推进顺序非法。进程在运行过程中,请求和释放资源的顺序不当,同样会导致死锁。
3、 产生死锁的必要条件
形成死锁的四个必要条件(四个条件都具备就会死锁,缺一就不会死锁)

五、预防死锁的方法 

预防死锁
摒弃“请求和保持”条件
所有进程开始运行前,必须一次性的申请其在整个运行过程所需的全部资源(AND)
资源浪费严重
摒弃“不剥夺”条件
允许进程先运行,但当提出的新要求不被满足时必须释放它已保持的所有资源,待以后需要时再重新申请。
反复申请和释放
摒弃“环路等待”条件

采用避免死锁的方法则是只施加较弱限制条件,从而获得令人满意的系统性能。
安全状态:系统能按某种进程顺序为每个进程分配所需资源,直至满足每个进程对资源的最大需求,并能顺利完成。
不安全状态:系统无法找到一种使多个进程能够顺利分配资源执行完的安全序列。

银行家算法避免死锁
随时对系统中的所有资源信息进行统计,包括每种资源的数量、已分配给各进程的数量;每当进程提出某种资源请求时判断该请求分配后是否安全,如果安全才分配。对每个资源请求的处理都要保证系统始终从一个安全状态到另一个安全状态。
算法实现:
首先:需要的一些数据结构
再次:算法过程
核心:安全性判断算法
1)银行家算法中的数据结构
(1)各类可利用资源的数量
向量Available :(i1,i2,…,im),含m个元素,每个元素代表一类可利用的资源数目。
动态变化的,初始值是系统配置的该类资源的全部数目,值随资源的分配与回收而动态的改变。
实现:一维数组。Available【j】=K,表示系统中Rj类资源现有可用数量为K个。
(2)每个进程对每类资源的需求
最大需求、已获得的、还需要的
最大需求矩阵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个,方能完成任务。

 

六、死锁的检测与解除

 

 

 

 

posted @ 2018-11-28 19:45  Endless·Dream  阅读(469)  评论(0编辑  收藏  举报