处理机调度与死锁

1.处理机调度相关基本概念

2.常用调度算法

3.实时调度

4.产生死锁的原因和必要条件

5.预防死锁的方法

6.死锁的检测与解除 

1.处理机调度相关基本概念

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

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

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

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

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

高级调度(High Scheduling)

中级调度(Intermediate-Level Scheduling)

低级调度(Low Level Scheduling)

 

 

1、高级调度(High Scheduling)

又称作业调度或长程调度(Long-Term Scheduling),接纳调度(Admission Scheduling)

主要在早期批处理阶段,处理在外存上的作业。

决定外存后备队列中的哪些作业调入内存;

为它们创建进程、分配必要的资源;

将新创建的进程排在就绪队列上,准备执行。

* 管理的方面比较多。

* 作业调度决定的细节

在每次执行作业调度时,都须作出两个决定:

接纳多少作业——取决于多道程序度。应根据系统的规模和运行速度等情况综合考虑。

接纳哪些作业——取决于采用的调度算法。如先来先服务,短作业优先等(后面详细介绍)

* 系统运行并不一定存在高级调度

批处理系统:作业进入系统后先驻留外存,故需要有作业调度。

分时系统:为及时响应,作业由终端直接送入内存,故不需作业调度。

实时系统中,通常也不需作业调度。

2、低级调度(Low Level Scheduling)

也称为进程调度、微观调度或短程调度(Short-Term Scheduling)

决定内存就绪队列中的哪个进程获得处理机,进行分配工作。是最基本的一种调度,在三种基本OS中都有。

 进程调度方式

1)非抢占方式(Non-preemptive Mode)

一旦处理机分配给某进程,该进程一直执行。决不允许其他进程抢占已分配运行进程的处理机。

2)抢占方式(Preemptive Mode)

允许调度程序根据某种原则,暂停某个正在执行的进程,将处理机重新分配给另一进程。

 进程调度方式比较

 

调度程序的任务职能:调度和分派。

(1) 记录系统中所有进程的有关情况

(2) 确定分配处理机的原则

(3) 分配处理机给进程

(4) 从进程收回处理机

 

 

3、中级调度(Intermediate-Level Scheduling)

又称交换调度或中程调度(Medium-Term Scheduling)

引入目的:提高内存利用率和系统吞吐量。根据条件将一些进程调出或再调入内存。

三种调度的频率和复杂度

进程调度:运行频率最高,算法不能太复杂,以免占用太多的CPU时间。分时系统通常10~100ms便进行一次。

作业调度:一个作业运行完毕退出系统时即触发重新调度一个新作业入内存,周期较长,大约几分钟一次。因而也允许作业调度算法花费较多的时间。

中级调度:运行频率基本上介于上述两种调度之间。

 

 

4、调度队列模型

 不论高级、中级或者低级调度,都涉及到进程队列,由此形成了三类调度队列模型。从这三种方式中体验调度的过程。

仅有进程调度的调度队列模型

具有高级和低级调度的调度队列模型

同时具有三级调度的调度队列模型

1)仅有进程调度的调度队列模型

常见情况:

分时系统。

通常仅设置进程调度,用户键入的命令和数据,都直接送入内存。

调度对象:

处于就绪状态的进程。

组织形式:

栈、树或一个无序链表

用何种形式取决于OS类型和采用的调度算法。如:分时系统中把就绪进程组织成FIFO队列形式:按时间片轮转方式运行。

 

每个进程在执行时按规定的时间片算法,在给定时间片内任务有三种执行情况:

完成工作,释放处理机进入完成状态

未完成,将该任务再放入就绪队列末尾

因某事件而被阻塞,被OS放入阻塞队列

 

2)具有高级和低级调度的调度队列模型

批处理系统中,还需要作业调度

3)同时具有三级调度的调度队列模型

引入中级调度后,进程的状态变化:

就绪状态:分为内存就绪和外存就绪。

阻塞状态:分为内存阻塞和外存阻塞。

中级调度使进程在上述状态间变化,并使数据在内外存间互换。

 

 

 

5. 选择调度方式和调度算法的若干准则

什么算法是好算法?

:不同的情况和对象需求不同,适用的方式和算法也不同。

1)面向用户的准则

周转时间短:

针对批处理系统的性能指标。作业从提交到完成所经历的时间。

CPU执行用时Ts

总的等待时间Tw = 在后备队列中等待 + 就绪队列上等待

+ 阻塞队列中等待(等待I/O操作用时)

周转时间T=Ts+Tw

带权周转时间W= T/Ts

平均周转时间、平均带权周转时间(n个作业求平均)

2)面向系统的准则

系统吞吐量高:批处理系统的重要指标。

单位时间内所完成的作业数,跟作业本身(与作业平均长度密切相关)和调度算法都有关系;

处理机利用率好(主要针对大中型主机)

各类资源的平衡利用(主要针对大中型主机)

 

 

不同系统需求各有侧重

批处理系统

平均周转时间短

系统吞吐量高

处理机利用率好

分时系统

响应时间快

均衡

实时系统

截至时间的保证

可预测性 

二.常用调度算法

调度的实质就是一种资源分配。不同的系统和系统目标,通常采用不同的调度算法——适合自己的才是最好的。

先来先服务调度算法FCFS

一种最简单的调度算法,按先后顺序进行调度。既可用于作业调度,也可用于进程调度。

按照作业提交,或进程变为就绪状态的先后次序分派CPU;

新作业只有当当前作业或进程执行完或阻塞才获得CPU运行

被唤醒的作业或进程不立即恢复执行,通常等到当前作业或进程出让CPU。 (所以,默认即是非抢占方式)

 

 

2. 短作业(进程)优先调度算法SJF/SPF

优点:

通过上表可见采用SJF/SPF算法,平均周转时间、平均带权周转时间都有明显改善。SJF/SPF调度算法能有效的降低作业的平均等待时间,提高系统吞吐量。

方式:

分抢占和非抢占两种方式,上例为简单的非抢占式。

3. 高优先权优先调度算法HPF

照顾紧迫性作业,使其获得优先处理而引入调度算法。常用于批处理系统中的作业调度算法,以及多种操作系统中的进程调度算法

1) 分两种方式:

非抢占式优先权算法

抢占式优先权算法 关键点:新作业产生时

2)优先权的类型

静态优先权:创建进程时确定,整个运行期间保持不变。一般利用某一范围的一个整数来表示,又称为优先数。

动态优先权:创建进程时赋予的优先权可随进程的推进或随其等待时间的增加而改变。

4. 基于时间片的轮转调度算法RR

(1)时间片轮转算法

将系统中所有的就绪进程按照FCFS原则,排成一个队列。

每次调度时将CPU分派给队首进程,让其执行一个时间片。时间片的长度从几个ms到几百ms。

在一个时间片结束时,发生时钟中断。

调度程序据此暂停当前进程的执行,将其送到就绪队列的末尾,并通过上下文切换执行当前就绪的队首进程。

(2)多级反馈队列算法FB

1)设置多个就绪队列,各队列有不同的优先级,优先级从第一个队列依次降低。

2) 赋予各队列进程执行时间片大小不同, 优先权越高,时间片越短。

比较

 

实时调度

实时系统:指系统能够在限定的响应时间内提供所需水平的服务。

指计算的正确性不仅取决于程序的逻辑正确性,也取决于结果产生的时间,如果系统的时间约束条件得不到满足,将会发生系统出错。

1. 实现实时调度的基本条件

1)提供必要的信息

   为了实现实时调度,系统应向调度程序提供有关任务的下述信息:

就绪时间。该任务成为就绪状态的时间。

开始截止时间、完成截止时间。

处理时间。从开始执行到完成所需时间。

资源要求。任务执行时所需的一组资源。

优先级。根据任务性质赋予不同优先级。

2)系统处理能力足够强

处理能力不足可能会出现某些实时任务不能得到及时处理,导致难以预料的后果。

3)采用抢占式调度机制

硬实时任务:广泛采用抢占机制。

 

小的实时系统:如能预知任务的开始截止时间,为简化调度程序和对任务调度时所花费的系统开销,可采用非抢占调度机制,

4)具有快速切换机制

对外部中断的快速响应能力。

利用快速硬件中断机构,可在紧迫的外部事件请求中及时响应。

快速的任务分派能力。

使系统中的运行功能单位适当的小,提高切换速度。类如线程的思想

 

3. 常用的几种实时调度算法

   目前有许多实时调度算法,在常用的算法中简单介绍两种实时调度算法:

最早截止时间优先EDF(Earliest Deadline First)算法

最低松弛度优先LLF(Least Laxity First)算法

1)最早截止时间优先EDF (Earliest Deadline First)

根据任务的开始截止时间来确定任务的优先级。截止时间越早,其优先级越高。

系统保持一个实时任务就绪队列

队列按各任务截止时间的早晚排序

调度程序总是选择就绪队列中的第一个任务,分配处理机使之投入运行。

新任务产生时,是否等当前程序执行完:

抢占式/非抢占式

可能会使作业错过,但可适用于软实时系统

2)最低松弛度优先LLF(Least Laxity First)

根据任务紧急(或松弛)的程度,来确定任务的优先级。任务的紧急程度越高(松弛度值越小),优先级就越高。

松弛度= 截止完成时间 – 还需执行时间 - 当前时间

可理解为当前时刻到开始截止时刻间的差距,随着时间的推进,这个差值逐渐变小,任务越来越紧迫。

多处理机系统中的调度

 

1. 多处理器系统的类型

不同角度分类

1)紧密耦合MPS和松弛耦合MPS

紧密耦合(Tightly Coupted)

高速总线或高速交叉开关来实现多个处理器之间的互连。

共享主存储器系统和I/O设备。系统中所有进程和资源由OS统一控制管理。

松散耦合(Loosely Coupted)

通过通道或通信线路来实现多台计算机之间互连。

每台计算机都有自己的存储器和I/O设备,可以独立工作。

2)对称MPS和非对称MPS

对称多处理系统SMPS(Symmetric MultiProcessor System)平等型:在系统中所包含的各处理器单元在功能上和结构上都相同。当前的绝大多数MPS属于此类。

非对称多处理器系统。主从型:系统中有多种类型的处理单元,它们的功能和结构各不相同,其中只有一个主处理器,其余为从处理器。

2. 进程分配方式

在多处理器系统中,进程的调度与系统结构有关。

同构性系统中,所有处理器都相同,可将进程分配到任一处理器上运行;

非对称MPS,对任一进程而言,都只能将其分配到某一适合于其运行的处理机上去执行。下面分别介绍对称MPS和非对称MPS中的进程分配方式。

1)对称MPS中的进程分配方式

静态分配(Static Assignment)方式:

进程从开始至完成被固定分配到一个处理器上。

优点是进程调度开销小,缺点是各处理器可能出现忙闲不均。

动态分配(Dynamic Assignment)方式:

系统中仅设置一个公共的就绪队列,分配进程总是给空闲处理器。某一进程的执行可能曾在不同的处理器上。

优点是消除忙闲不均现象。但松散耦合系统增大调度开销。

2)非对称MPS中的进程分配方式

OS的核心部分驻留在一台主机上,而从机上只是用户程序,进程调度只由主机执行。主机中保持有一个就绪队列。

每当从机空闲时向主机发一索求进程信号,然后等待主机分配进程。

优点是系统处理比较简单,缺点是处理靠一台主机导致不可靠。(克服缺点的方法是利用多台而非一台管理系统)

3. 进程(线程)调度方式

   MPS已广为流行多年,存在着多种调度方式,许多都是以线程作为基本调度单位的,比较有代表的如下:

自调度(Self-Scheduling)方式

成组调度(Gang Scheduling)方式

专用处理器(Dedicated Processor Assignment)分配方式

1)自调度(Self-Scheduling)方式

自调度机制,最简单的一种调度方式。

系统中设置一个公共的进程或线程就绪队列,所有的处理器空闲时,都可自己到该队列中取得一进程(线程)来运行。

调度算法:可采用FCFS、FPF和抢占式最高优先权优先调度算法等。经实验证明FCFS算法在多处理器环境下简单开销小,目前成为较好的调度算法。

自调度方式的特点

优点:

  1)易将单机环境下的调度机制移植到MPS中;

  2)不会发生处理器忙闲不均的现象,有利于提高处理器的利用率。

 缺点:     

  1)瓶颈问题。多处理器互斥访问唯一就绪队列。

  2)低效性。高速缓存的使用效率很低。

  3)线程切换频繁。相关的其他线程未必会同时获得处理器导致切换频繁。 

2)成组调度(Gang Scheduling)方式

为解决自调度方式中线程频繁切换的问题

将进程的一组线程分配到一组处理器上去执行。分配处理器时间的方式:

面向所有应用程序平均分配处理器时间

面向所有线程平均分配处理器时间

 

 

优点:

相互合作的进程或线程能并行执行,可有效的减少阻塞,减少切换使系统性能得到改善;

每次调度都可以解决一组线程的处理器分配问题,故可显著减少调度频率,减少了调度开销。

3)专用处理器(Dedicated Processor Assignment)方式

1989年Tucker提出该方式。在一个应用程序的执行期间,专为该应用程序分配一组处理器,每一个线程一个处理器。

这种方式很浪费。但仍有利用市场,适用于并发程度相当高的多处理机环境:

对系统的性能和效率来讲,单个处理器的利用率已不太重要。

“专用”完全避免了切换,从而大大加速了程序运行。

同时加工的应用程序,线程总和不应超过系统处理机的数目。

 

 

 

 处理机调度与死锁处理机调度相关基本概念常用调度算法实时调度产生死锁的原因和必要条件预防死锁的方法死锁的检测与解除 
处理机调度:多道程序环境下,动态的把处理机分配给就绪队列中的一个进程使之执行。提高处理机的利用率、改善系统性能,很大程度上取决于处理机调度的性能。处理机调度便成为OS设计的中心问题之一。分配的任务由处理机调度程序完成。一、处理机调度的基本概念作业进入系统驻留在外存的后备队列上,再至调入内存运行完毕,可能要经历下述三级调度。高级调度(High Scheduling)中级调度(Intermediate-Level Scheduling)低级调度(Low Level Scheduling)

1、高级调度(High Scheduling)又称作业调度或长程调度(Long-Term Scheduling),接纳调度(Admission Scheduling)主要在早期批处理阶段,处理在外存上的作业。决定外存后备队列中的哪些作业调入内存;为它们创建进程、分配必要的资源;将新创建的进程排在就绪队列上,准备执行。* 管理的方面比较多。* 作业调度决定的细节在每次执行作业调度时,都须作出两个决定:接纳多少作业——取决于多道程序度。应根据系统的规模和运行速度等情况综合考虑。接纳哪些作业——取决于采用的调度算法。如先来先服务,短作业优先等(后面详细介绍)* 系统运行并不一定存在高级调度批处理系统:作业进入系统后先驻留外存,故需要有作业调度。分时系统:为及时响应,作业由终端直接送入内存,故不需作业调度。实时系统中,通常也不需作业调度。2、低级调度(Low Level Scheduling)也称为进程调度、微观调度或短程调度(Short-Term Scheduling)决定内存就绪队列中的哪个进程获得处理机,进行分配工作。是最基本的一种调度,在三种基本OS中都有。 进程调度方式1)非抢占方式(Non-preemptive Mode)一旦处理机分配给某进程,该进程一直执行。决不允许其他进程抢占已分配运行进程的处理机。2)抢占方式(Preemptive Mode)允许调度程序根据某种原则,暂停某个正在执行的进程,将处理机重新分配给另一进程。 进程调度方式比较
调度程序的任务职能:调度和分派。(1) 记录系统中所有进程的有关情况(2) 确定分配处理机的原则(3) 分配处理机给进程(4) 从进程收回处理机

3、中级调度(Intermediate-Level Scheduling)又称交换调度或中程调度(Medium-Term Scheduling)引入目的:提高内存利用率和系统吞吐量。根据条件将一些进程调出或再调入内存。三种调度的频率和复杂度进程调度:运行频率最高,算法不能太复杂,以免占用太多的CPU时间。分时系统通常10~100ms便进行一次。作业调度:一个作业运行完毕退出系统时即触发重新调度一个新作业入内存,周期较长,大约几分钟一次。因而也允许作业调度算法花费较多的时间。中级调度:运行频率基本上介于上述两种调度之间。

4、调度队列模型 不论高级、中级或者低级调度,都涉及到进程队列,由此形成了三类调度队列模型。从这三种方式中体验调度的过程。仅有进程调度的调度队列模型具有高级和低级调度的调度队列模型同时具有三级调度的调度队列模型1)仅有进程调度的调度队列模型常见情况:分时系统。通常仅设置进程调度,用户键入的命令和数据,都直接送入内存。调度对象:处于就绪状态的进程。组织形式:栈、树或一个无序链表用何种形式取决于OS类型和采用的调度算法。如:分时系统中把就绪进程组织成FIFO队列形式:按时间片轮转方式运行。进程调度过程如下图:
每个进程在执行时按规定的时间片算法,在给定时间片内任务有三种执行情况:完成工作,释放处理机进入完成状态未完成,将该任务再放入就绪队列末尾因某事件而被阻塞,被OS放入阻塞队列回答问题进程调度什么时候发生?或者说什么时候需要进程调度程序执行去给CPU做选择?正在执行的进程结束正在执行的进程阻塞正在执行的进程未完成转就绪(时间片到)新就绪了更高优先级的进程(抢占式)
2)具有高级和低级调度的调度队列模型批处理系统中,还需要作业调度3)同时具有三级调度的调度队列模型引入中级调度后,进程的状态变化:就绪状态:分为内存就绪和外存就绪。阻塞状态:分为内存阻塞和外存阻塞。中级调度使进程在上述状态间变化,并使数据在内外存间互换。


5. 选择调度方式和调度算法的若干准则什么算法是好算法?:不同的情况和对象需求不同,适用的方式和算法也不同。 1)面向用户的准则2)面向系统的准则1)面向用户的准则周转时间短:针对批处理系统的性能指标。作业从提交到完成所经历的时间。CPU执行用时Ts总的等待时间Tw = 在后备队列中等待 + 就绪队列上等待+ 阻塞队列中等待(等待I/O操作用时)周转时间T=Ts+Tw带权周转时间W= T/Ts平均周转时间、平均带权周转时间(n个作业求平均)