操作系统第二章!进程管理【有笔记,截图,还有王道课本的概念】!!!
王道考研视频——操作系统笔记,第二部分,进程管理

0.0 课程白嫖指南_哔哩哔哩_bilibili0.0 课程白嫖指南是王道计算机考研 操作系统的第1集视频,该合集共计84集,视频收藏或关注UP主,及时了解更多相关视频内容。icon-default.png?t=O83Ahttps://www.bilibili.com/video/BV1YE411D7nH?p=1有需要markdown格式的准研究生们,可以评论或者私信找我(当天回复)

2.1 进程与线程















2.1.1 进程的概念和特征

进程的概念

进程( Process)以便更好地描述和控制程序的并发执行,实现操作系统的并发性和共享性(最基本的两个特性)为了使参与并发执行的程序(含数据)能独立地运行,必须为之配置一个专门的数据结构,称为进程控制块

( Process Control Block,PCB)系统利用PCB来描述进程的基本情况和运行状态,进而控制和管理进程。相应地,由程序段、相关数据段和PCB三部分构成了进程映像(进程实体)所谓创建进程,实质上是创建进程映像中的PCB,而撤销进程,实质上是撤销进程的PCB,值得注意的是,进程映像是静态的,进程则是动态的。

从不同的角度,进程可以有不同的定义,比较典型的定义有:

1)进程是程序的一次执行过程

2)进程是一个程序及其数据在处理机上顺序执行时所发生的活动。

3)进程是具有独立功能的程序在一个数据集合上运行的过程,

进程是系统进行资源分配和调度的一个独立单位。

在引入进程实体的概念后,我们可以把传统操作系统中的进程定义为:“进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位这里的系统资源,指的是处理机、存储器和其他设备服务于某进程的“时间”,比如,把处理机资源理解为处理机的时间片才是准确的。因为进程是这些资源分配和调度的独立单位,即“时间片”分配的独立单位,这就决定了,进程一定是一个动态的、过程性的概念。

2)进程的特征

进程是由多程序的并发执行而引出的,它和程序是两个截然不同的概念。进程的基本特征是对比单个程序的顺序执行提出的,也是对进程管理提出的基本要求

1)动态性:进程是程序的一次执行,它有着创建、活动、暂停、终止等过程,具有一定的生命周期,是动态地产生、变化和消亡的。动态性是进程最基本的特征

2)并发性:指多个进程实体,共存于内存中,能在一段时间内同时运行,并发性是进程的重要特征,同时也是操作系统的重要特征。引入进程的目的就是为了使程序能与其他进程的程序并发执行,以提高资源利用率

3)独立性:指进程实体是一个能独立运行、独立获得资源和独立接受调度的基本单位。凡未建立PCB的程序都不能作为一个独立的单位参与运行。

4)异步性:由于进程的相互制约,使进程具有执行的间断性,即进程按各自独立的、不可预知的速度向前推进。异步性会导致执行结果的不可再现性,为此,在操作系统中必须配置相应的进程同步机制

5)结构性:每个进程都配置一个PCB对其进行描述。从结构上看,进程实体是由程序段数据段和进程控制段三部分组成的

2.1.2 进程的状态与转换

通常进程有以下五种状态,前三种是进程的基本状态

1)运行状态:进程正在处理机上运行。在单处理机环境下,每一时刻最多只有一个进程处于运行状态。

2)就绪状态:进程已处于准备运行的状态,即进程获得了除处理机之外的一切所需资源,一旦得到处理机即可运行

3)阻塞状态,又称等待状态:进程正在等待某一事件而暂停运行,如等待某资源为可用(不包括处理机)或等待输入输出完成。即使处理机空闲,该进程也不能运行。

4)创建状态:进程正在被创建,尚未转到就绪状态。创建进程通常需要多个步骤:首先申请一个空白的PCB,并向PCB中填写一些控制和管理进程的信息;然后由系统为该进程分配运行时所必需的资源:最后把该进程转入到就绪状态

5)结束状态:进程正从系统中消失,这可能是进程正常结束或其他原因中断退出运行。当进程需要结束运行时,系统首先必须置该进程为结束状态,然后再进一步处理资源释放和回收等工作

注意区别就绪状态和阻塞状态:就绪状态是指进程仅缺少处理机,只要获得处理机资源就立即执行;而阻塞状态是指进程需要其他资源(除了处理机)或等待某一事件。

之所以把处理机和其他资源划分开,是因为在分时系统的时间片轮转机制中,每个进程分到的时间片是若干毫秒。也就是说,进程得到处理机的时间很短且非常频繁,进程在运行过程中实际上是频繁地转换到就绪状态的:而其他资源(如外设)的使用和分配或者某一事件的发生(如I/O操作的完成)对应的时间相对来说很长,进程转换到阻塞状态的次数也相对较少。这样来看,就绪状态和阻塞状态是进程生命周期中两个完全不同的状态,很显然需要加以区分。

就绪状态→运行状态:处于就绪状态的进程被调度后,获得处理机资源(分派处理机时间片)于是进程由就绪状态转换为运行状态

运行状态→就绪状态:处于运行状态的进程在时间片用完后,不得不让出处理机,从而进程由运行状态转换为就绪状态。此外,在可剥夺的操作系统中,当有更高优先级的进程就绪时,调度程度将正执行的进程转换为就绪状态,让更高优先级的进程执行。

运行状态→阻塞状态:当进程请求某一资源(如外设)的使用和分配或等待某一事件的发生(如IO操作的完成)时,它就从运行状态转换为阻塞状态。进程以系统调用的形式请求操作系统提供服务,这是一种特殊的、由运行用户态程序调用操作系统内核过程的形式

阻塞状态→就绪状态:当进程等待的事件到来时,如I/O操作结束或中断结束时,中断处理程序必须把相应进程的状态由阻塞状态转换为就绪状态

需要注意的是,一个进程从运行状态变成阻塞状态是一个主动的行为,而从阻塞状态变到就就绪状态是一个被动的行为,需要其他相关进程的协助

2.1.3 进程控制

进程控制的主要功能是对系统中的所有进程实施有效的管理,它具有创建新进程撤销已有进程实现进程状态转换等功能。在操作系统中,一般把进程控制用的程序段称为原语,原语的特点是执行期间不允许中断,它是一个不可分割的基本单位。

1. 进程的创建

允许一个进程创建另一个进程。此时创建者称为父进程,被创建的进程称为子进程。子进程可以继承父进程所拥有的资源。当子进程被撤销时,应将其从父进程那里获得的资源归还给父进程。此外,在撤销父进程时,也必须同时撤销其所有的子进程,在操作系统中,终端用户登录系统、作业调度、系统提供服务、用户程序的应用请求等都会引起进程的创建。

操作系统创建一个新进程的过程如下(创建原语)

  • 为新进程分配一个唯一的进程标识号,并申请一个空白的PCB(PCB是有限的)若PCB申请失败则创建失败。
  • 为进程分配资源,为新进程的程序和数据,以及用户栈分配必要的内存空间(在PCB中体现).

注意:这里如果资源不足(比如内存空间),并不是创建失败,而是处于“等待状态“或称为“阻塞状态”,等待的是内存这个资源

  • 初始化PCB,主要包括初始化标志信息、初始化处理机状态信息和初始化处理机控制信息,以及设置进程的优先级等
  • 如果进程就绪队列能够接纳新进程,就将新进程插入到就绪队列,等待被调度运行。
2. 进程的终止

引起进程终止的事件主要有:

正常结束,表示进程的任务已经完成和准备退出运行。

异常结束,表示进程在运行时发生了某种异常事件,使程序无法继续运行,如存储区越界、非法指令、特权指令、I/O故障等。

外界干预是指进程应外界的请求而终止运行,如操作员或操作系统干预、父进程请求和父进程终止

操作系统终止进程的过程如下(撤销原语):

  • 根据被终止进程的标识符,检索PCB,从中读出该进程的状态
  • 若被终止进程处于执行状态,立即终止该进程的执行,将处理机资源分配给其他进程
  • 若该进程还有子进程,则应将其所有子进程终止
  • 将该进程所拥有的全部资源,或归还给其父进程或归还给操作系统。
  • 将该PCB从所在队列(链表)中删除
3. 进程的阻塞和唤醒

正在执行的进程,由于期待的某些事件未发生,如请求系统资源失败、等待某种操作的完成数据尚未到达或无新工作可做等,则由系统自动执行阻塞原语( Block),使自己由运行状态变为阻塞状态。可见,进程的阻塞是进程自身的一种主动行为,也因此只有处于运行态的进程(获得CPU),才可能将其转为阻塞状态。

阻塞原语的执行过程如下(阻塞原语):

1)找到将要被阻塞进程的标识号对应的PCB.

2)若该进程为运行状态,则保护其现场,将其状态转为阻塞状态,停止运行。

3)把该PCB插入到相应事件的等待队列中去当被阻塞进程所期待的事件出现时,如它所启动的IO操作已完成或其所期待的数据已到达,则由有关进程(比如,提供数据的进程)调用喚醒原语( Wakeup),将等待该事件的进程唤醒

唤醒原语的执行过程如下(唤醒原语):

1)在该事件的等待队列中找到相应进程的PCB

2)将其从等待队列中移出,并置其状态为就绪状态

3)把该PCB插入就绪队列中,等待调度程序调度

需要注意的是,Block原语和 Wakeup原语是一对作用刚好相反的原语,必须成对使用。 Block原语是由被阻塞进程自我调用实现的,而 Wakeup原语则是由一个与被唤醒进程相合作或被其他相关的进程调用实现的。

4. 进程切换

对于通常的进程,其创建、撤销以及要求由系统设备完成的 IO 操作都是利用系统调用而进入内核,再由内核中相应处理程序予以完成的。进程切换同样是在内核的支持下实现的,因此可以说,任何进程都是在操作系统内核的支持下运行的,是与内核紧密相关的,进程切换是指处理机从一个进程的运行转到另一个进程上运行,这个过程中,进程的运行环境产生了实质性的变化。

进程切换的过程如下:

1)保存处理机上下文,包括程序计数器 PC 指令寄存器 IR 和其他寄存器。

2)更新PCB信息

3)把进程的PCB移入相应的队列,如就绪、在某事件阻塞等队列。

4)选择另一个进程执行,并更新其PCB

5)更新内存管理的数据结构

6)恢复处理机上下文

注意,进程切换与处理机模式切换是不同的,模式切换时,处理机逻辑上可能还在同一进程中运行。如果进程因中断或异常进入到核心态运行,执行完后又回到用户态刚被中断的程序运行,则操作系统只需恢复进程进入内核时所保存的CPU现场,无需改变当前进程的环境信息。但若要切换进程,当前运行进程改变了,则当前进程的环境信息也需要改变。

注意:“调度”和“切换”的区别,调度是指决定资源分配给哪个进程的行为,是一种决策行为,切换是指实际分配的行为,是执行行为。一般来说,先有资源的调度,然后才有进程的切换。

2.1.4 进程的组织

进程是操作系统的资源分配和独立运行的基本单位。它一般由以下三个部分组成

1. 进程控制块PCB

进程创建时,操作系统就新建一个PCB结构,它之后就常驻内存,任一时刻可以存取,在进程结束时删除。PCB是进程实体的一部分,是进程存在的唯一标志。

当创建一个进程时,系统为该进程建立一个PCB:

当进程执行时,系统通过其PCB了解进程的现行状态信息,以便对其进行控制和管理;

当进程结束时,系统收回其PCB,该进程随之消亡。

操作系统通过PCB表来管理和控制进程,PCB主要包括进程描述信息、进程控制和管理信息、资源分配清单和处理机相关信息等。各部分的主要说明如下:

1)进程描述信息

进程标识符:标志各个进程,每个进程都有一个并且是唯一的标识号。

用户标识符:进程归属的用户,用户标识符主要为共享和保护服务

2)进程控制和管理信息

进程当前状态:描述进程的状态信息,作为处理机分配调度的依据

进程优先级:描述进程抢占处理机的优先级,优先级高的进程可以优先获得处理机。

3)资源分配清单,用于说明有关内存地址空间或虚拟地址空间的状况:所打开文件的列表和所使用的输入输出设备信息。

4)处理机相关信息,主要指处理机中各寄存器值,当进程被切换时,处理机状态信息都必须保存在相应的PCB中,以便在该进程重新执行时,能再从断点继续执行

在一个系统中,通常存在着许多进程,有的处于就绪状态,有的处于阻塞状态,而且阻塞的原因各不相同。为了方便进程的调度和管理,需要将各进程的PCB用适当的方法组织起来。

目前常用的组织方式有链接方式索引方式两种。

链接方式将同一状态的PCB链接成一个队列,不同状态对应不同的队列,也可以把处于阻塞状态的进程的PCB,根据其阻塞原因的不同,排成多个阻塞队列。

索引方式是将同一状态的进程组织在一个索引表中,索引表的表项指向相应的PCB。不同状态对应不同的索引表,如就绪索引表和阻塞索引表等

2. 程序段

程序段就是能被进程调度程序调度到CPU执行的程序代码段。

注意,程序可以被多个进程共享,就是说多个进程可以运行同一个程序

3. 数据段

一个进程的数据段,可以是进程对应的程序加工处理的原始数据,也可以是程序执行时产生的中间或最终结果

2.1.5 进程的通信

进程通信是指进程之间的信息交换。PV操作是低级通信方式,高级通信方式是指以较高的效率传输大量数据的通信方式。高级通信方法主要有以下三个类。

2.1.5.1 共享存储


2.1.5.2 消息传递


2.1.5.3 管道通信


2.1.6 线程概念和多线程模型

2.1.6.1 线程的基本概念

引入进程的目的,是为了更好地使多道程序并发执行,以提高资源利用率和系统吞吐量,增加并发程度;而引入线程,则是为了减小程序在并发执行时所付出的时空开销,提高操作系统的并发性能线程最直接的理解就是“轻量级进程”,它是一个基本的CPU执行单元,也是程序执行流的最小单元,由线程ID、程序计数器、寄存器集合和堆栈组成。线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源但它可与同属一个进程的其他线程共享进程所拥有的全部资源。一个线程可以创建和撤销另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。线程也有就绪、阻塞和运行三种基本状态。引入线程后,进程的内涵发生了改变,进程只作为除CPU以外系统资源的分配单元,线程则作为处理机的分配单元。由于一个进程内部有多个线程,如果线程的切换发生在同一个进程内部,则只需要很少的时空开销

2.1.6.2 线程与进程的比较

1)调度。在传统的操作系统中,拥有资源和独立调度的基本单位都是进程。在引入线程的操作系统中,线程是独立调度的基本单位,进程是拥有资源的基本单位。在同一进程中,线程的切换不会引起进程切换。在不同进程中进行线程切换,如从一个进程内的线程切换到另一个进程中的线程时,会引起进程切换。

2)拥有资源。不论是传统操作系统还是设有线程的操作系统,进程都是拥有资源的基本单位,而线程不拥有系统资源(也有一点必不可少的资源),但线程可以访问其隶属进程的系统资源。我们要知道,如果线程也是拥有资源的单位,那么,切换线程也需要较大的时空开销,线程这个概念的提出就没有意义了。

3)并发性。在引入线程的操作系统中,不仅进程之间可以并发执行,而且一个进程中的多个线程之间也可以并发执行,从而使操作系统具有更好的并发性,提高了系统的吞吐量。

4)系统开销。由于创建或撤销进程时,系统都要为之分配或回收资源,如内存空间、IO设备等,因此操作系统所付出的开销远大于创建或撤销线程时的开销。类似地,在进行进程切换时,涉及当前执行进程CPU环境的保存及新调度到进程CPU环境的设置,而线程切换时只需保存和设置少量寄存器内容,开销很小。此外,由于同一进程内的多个线程共享进程的地址空间,因此,这些线程之间的同步与通信非常容易实现,甚至无需操作系统的干预

5)地址空间和其他资源(如打开的文件):进程的地址空间之间互相独立,同一进程的各线程间共享进程的资源,某进程内的线程对于其他进程不可见

6)通信方面:进程间通信(IPC)需要进程同步和互斥手段的辅助,以保证数据的一致性而线程间可以直接读/写进程数据段(如全局变量)来进行通信。

2.1.6.3 线程的属性

在多线程操作系统中,把线程作为独立运行(或调度)的基本单位,此时的进程,已不再是个基本的可执行实体。但进程仍具有与执行相关的状态,所谓进程处于“执行”状态,实际上是指该进程中某线程正在执行。线程的主要属性如下

  1. 线程是一个轻型实体,它不拥有系统资源,但每个线程都应有一个唯一的标识符和一个线程控制块,线程控制块记录了线程执行的寄存器和栈等现场状态
  2. 不同的线程可以执行相同的程序,即同一个服务程序被不同的用户调用时,操作系统为它们创建成不同的线程
  3. 同一进程中的各个线程共享该进程所拥有的资源
  4. 线程是处理机的独立调度单位,多个线程是可以并发执行的。在单CPU的计算机系统中各线程可交替地占用CPU;在多CPU的计算机系统中,各线程可同时占用不同的CPU,若各个CPU同时为一个进程内的各线程服务则可缩短进程的处理时间。
  5. 一个线程被创建后便开始了它的生命周期,直至终止,线程在生命周期内会经历阻塞态就绪态运行态等各种状态变化为什么线程的提出有利于提高系统并发性?可以这样来理解:由于有了线程,线程切换时有可能会发生进程切换,也有可能不发生进程的切换,那么平均下来,每次切换所需要的开销就小了,因而,就能够让更多的线程参与并发,也不会影响到响应时间等问题了
2.1.6.4 线程的实现方式

线程的实现可以分为两类:用户级线程( User-Level Thread,ULT)内核级线程( Kernel-Lev Thread,KLT)内核级线程又称为内核支持的线程。

在用户级线程中,有关线程管理的所有工作都由应用程序完成,内核意识不到线程的存在应用程序可以通过使用线程库设计成多线程程序。通常,应用程序从单线程起始,在该线程中开始运行,在其运行的任何时刻,可以通过调用线程库中的派生例程创建一个在相同进程中运行的新线程。图(a)说明了用户级线程的实现方式

在内核级线程中,线程管理的所有工作由内核完成,应用程序没有进行线程管理的代码,只有一个到内核级线程的编程接口。内核为进程及其内部的每个线程维护上下文信息,调度也是在内核基于线程架构的基础上完成。图(b)说明了内核级线程的实现方式

在一些系统中,使用组合方式的多线程实现。线程创建完全在用户空间中完成,线程的调度和同步也在应用程序中进行。一个应用程序中的多个用户级线程被映射到一些(小于或等于用户级线程的数目)内核级线程上。图(c)说明了用户级与内核级的组合实现方式

2.1.6.5 多线程模型

有些系统同时支持用户线程和内核线程,由此产生了不同的多线程模型,即实现用户级线程和内核级线程的连接方式

  1. 多对一模型。将多个用户级线程映射到一个内核级线程,线程管理在用户空间完成。此模式中,用户级线程对操作系统不可见(即透明).

优点:线程管理是在用户空间进行的,因而效率比较高。

缺点:当一个线程在使用内核服务时被阻塞,那么整个进程都会被阻塞:多个线程不能并行地运行在多处理机上。

  1. 一对一模型。将每个用户级线程映射到一个内核级线程。

优点:当一个线程被阻塞后,允许另一个线程继续执行,所以并发能力较强

缺点:每创建一个用户级线程都需要创建一个内核级线程与其对应,这样创建线程的开销比较大,会影响到应用程序的性能

  1. 多对多模型。将n个用户级线程映射到m个内核级线程上,要求m≤n

特点:在多对一模型和一对一模型中取了个折中,克服了多对一模型的并发度不高的缺点又克服了一对一模型的一个用户进程占用太多内核级线程,开销太大的缺点。又拥有多对一模型和一对一模型各自的优点,可谓集两者之所长

2.1.6.6 线程的状态与组织

线程的三种状态:就绪态,运行态,阻塞态

2.1.7 处理机调度的概念、层次


高级调度(作业调度)

中级调度(内存调度)

低级调度(进程调度)

  1. 调度的基本概念

在多道程序系统中,进程的数量往往多于处理机的个数,进程争用处理机的情况就在所难免。

处理机调度是对处理机进行分配,就是从就绪队列中,按照一定的算法(公平、高效)选择一个进程并将处理机分配给它运行,以实现进程并发地执行

处理机调度是多道程序操作系统的基础,它是操作系统设计的核心问题

  1. 调度的层次

作业从提交开始直到完成,往往要经历以下三级调度

1)高级调度。又称作业调度,其主要任务是按一定的原则从外存上处于后备状态的作业中挑选一个(或多个)作业,给它(们)分配内存、输入输出设备等必要的资源,并建立相应的进程(建立进程控制块 PCB),以使它(们)获得竞争处理机的权利。简言之,就是内存与辅存之间的调度。对于每个作业只调入一次、调出一次

多道批处理系统中大多配有作业调度,而其他系统中通常不需要配置作业调度。作业调度的执行频率较低,通常为几分钟一次。

2)中级调度。又称内存调度。引入中级调度是为了提高内存利用率和系统吞吐量。为此应使那些暂时不能运行的进程,调至外存等待,把此时的进程状态称为挂起状态。当它们已具备运行条件且内存又稍有空闲时,由中级调度来决定,把外存上的那些已具备运行条件的就绪进程再重新调入内存,并修改其状态为就绪状态,挂在就绪队列上等待

3)进程调度。又称为低级调度,其主要任务是按照某种方法和策略从就绪队列中选取一个进程,将处理机分配给它(就绪态->运行态)。进程调度是操作系统中最基本的一种调度,在一般操作系统中都必须配置进程调度。进程调度的频率很高,一般几十毫秒一次

  1. 三级调度的联系

作业调度从外存的后备队列中选择一批作业进入内存,为它们建立进程,这些进程被送入就绪队列,进程调度从就绪队列中选出一个进程,并把其状态改为运行状态,把CPU分配给它。

中级调度是为了提高内存的利用率,系统将那些暂时不能运行的进程挂起来。当内存空间宽松时,通过中级调度选择具备运行条件的进程,将其唤醒

1)作业调度为进程活动做准备,进程调度使进程正常活动起来,中级调度将暂时不能运行的进程挂起,中级调度处于作业调度和进程调度之间

2)作业调度次数少,中级调度次数略多,进程调度频率最高。

3)进程调度是最基本的,不可或缺

2.1.8 进程调度的时机、切换与过程、方式

进程调度的时机



进程调度和切换程序是操作系统内核程序。当请求调度的事件发生后,才可能会运行进程调度程序,当调度了新的就绪进程后,才会去进行进程间的切换。理论上这三件事情应该顺序执行,但在实际设计中,在操作系统内核程序运行时,如果某时发生了引起进程调度的因素,并不一定能够马上进行调度与切换。

现代操作系统中,不能进行进程的调度与切换的情况有以下几种情况

1)在处理中断的过程中:中断处理过程复杂,在实现上很难做到进程切换,而且中断处理是系统工作的一部分,逻辑上不属于某一进程,不应被剥夺处理机资源。

2)进程在操作系统内核程序临界区中:进入临界区后,需要独占式地访问共享数据,理论上必须加锁,以防止其他并行程序进入,在解锁前不应切换到其他进程运行,以加快该共享数据的释放。

3)其他需要完全屏蔽中断的原子操作过程中:如加锁、解锁、中断现场保护、恢复等原子操作。在原子过程中,连中断都要屏蔽,更不应该进行进程调度与切换。如果在上述过程中发生了引起调度的条件,并不能马上进行调度和切换,应置系统的请求调度标志,直到上述过程结束后才进行相应的调度与切换。

应该进行进程调度与切换的情况有:

1)当发生引起调度条件,且当前进程无法继续运行下去时,可以马上进行调度与切换。如果操作系统只在这种情况下进行进程调度,就是非剥夺调度

2)当中断处理结束或自陷处理结束后,返回被中断进程的用户态程序执行现场前,若置上请求调度标志,即可马上进行进程调度与切换。如果操作系统支持这种情况下的运行调度程序,就实现了剥夺方式的调度。

进程切换往往在调度完成后立刻发生,它要求保存原进程当前切换点的现场信息,恢复被调度进程的现场信息。现场切换时,操作系统内核将原进程的现场信息推入到当前进程的内核堆栈来保存它们,并更新堆栈指针。内核完成从新进程的内核栈中装入新进程的现场信息、更新当前运行进程空间指针、重设PC寄存器等相关工作之后,开始运行新的进程。

进程调度方式

所谓进程调度方式是指当某一个进程正在处理机上执行时,若有某个更为重要或紧迫的进程需要处理,即有优先权更高的进程进入就绪队列,此时应如何分配处理机。

通常有以下两种进程调度方式

1)非剥夺调度方式,又称非抢占方式。是指当一个进程正在处理机上执行时,即使有某个更为重要或紧迫的进程进入就绪队列,仍然让正在执行的进程继续执行,直到该进程完成或发生某种事件而进入阻塞状态时,才把处理机分配给更为重要或紧迫的进程。

在非剥夺调度方式下,一旦把CPU分配给一个进程,那么该进程就会保持CPU直到终止或转换到等待状态。这种方式的优点是实现简单、系统开销小,适用于大多数的批处理系统,但它不能用于分时系统和大多数的实时系统。

2)剥夺调度方式,又称抢占方式。是指当一个进程正在处理机上执行时,若有某个更为重要或紧迫的进程需要使用处理机,则立即暂停正在执行的进程,将处理机分配给这个更为重要或紧迫的进程。

采用剥夺式的调度,对提高系统吞吐率和响应效率都有明显的好处。但“剥夺”不是一种任意性行为,必须遵循一定的原则,主要有:优先权、短进程优先和时间片原则等。

进程的切换与过程

2.1.9 调度算法的评价指标
CPU利用率

系统吞吐量

周转时间


等待时间

响应时间

不同的调度算法具有不同的特性,在选择调度算法时,必须考虑算法所具有的特性。为了比较处理机调度算法的性能,人们提出很多评价准则,下面介绍主要的几种

1)CPU利用率。CPU是计算机系统中最重要和昂贵的资源之一,所以应尽可能使CPU保持“忙”状态,使这一资源利用率最高

2)系统吞吐量。表示单位时间内 CPU 完成作业的数量。长作业需要消耗较长的处理机时间,因此会降低系统的吞吐量。而对于短作业,它们所需要消耗的处理机时间较短,因此能提高系统的吞吐量。调度算法和方式的不同,也会对系统的吞吐量产生较大的影响。

3)周转时间。是指从作业提交到作业完成所经历的时间,包括作业等待、在就绪队列中排队、在处理机上运行以及进行输入输出操作所花费时间的总和。

4)等待时间。是指进程处于等处理机状态时间之和,等待时间越长,用户满意度越低。处理机调度算法实际上并不影响作业执行或输入输出操作的时间,只影响作业在就绪队列中等待所花的时间。因此,衡量一个调度算法的优劣,常常只需简单地考察等待时间。

5)响应时间。是指从用户提交请求到系统首次产生响应所用的时间。在交互式系统中,周转时间不可能是最好的评价准则,一般采用响应时间作为衡量调度算法的重要准则之一


2.1.10 FCFS、SJF、HRRN 调度算法

在操作系统中存在多种调度算法,其中有的调度算法适用于作业调度,有的调度算法适用于进程调度,有的调度算法两者都适用。下面介绍几种常用的调度算法。

先来先服务(FCFS)调度算法


 

FCFS 调度算法是一种最简单的调度算法,该调度算法既可以用于作业调度也可以用于进程调度。在作业调度中,算法每次从后备作业队列中选择最先进入该队列的一个或几个作业,将它们调入内存,分配必要的资源,创建进程并放入就绪队列在进程调度中,FCFS 调度算法每次从就绪队列中选择最先进入该队列的进程,将处理机分配给它,使之投入运行,直到完成或因某种原因而阻塞时才释放处理机。

FCFS 调度算法属于不可剥夺算法。从表面上看,它对所有作业都是公平的,但若一个长作业先到达系统,就会使后面许多短作业等待很长时间,因此它不能作为分时系统和实时系统的主要调度策略。但它常被结合在其他调度策略中使用。例如,在使用优先级作为调度策略的系统中,往往对多个具有相同优先级的进程按 FCFS 原则处理。FCFS调度算法的特点是算法简单,但效率低:对长作业比较有利,但对短作业不利(相对SJF和高响应比):有利于CPU繁忙型作业,而不利于I/O繁忙型作业。

短作业优先(SJF)调度算法



 

短作业(进程)优先调度算法是指对短作业(进程)优先调度的算法。短作业优先(SJF)调度算法是从后备队列中选择一个或若干个估计运行时间最短的作业,将它们调入内存运行。而短进程优先(SPF)调度算法,则是从就绪队列中选择一个估计运行时间最短的进程,将处理机分配给它,使之立即执行,直到完成或发生某事件而阻塞时,才释放处理机。

SJF 调度算法也存在不容忽视的缺点:

1)该算法对长作业不利,SJF调度算法中长作业的周转时间会增加。更严重的是,如果有一长作业进入系统的后备队列,由于调度程序总是优先调度那些(即使是后进来的)短作业,将导致长作业长期不被调度(“饥饿”现象,注意区分“死锁”后者是系统环形等待,前者是调度策略问题)

2)该算法完全未考虑作业的紧迫程度,因而不能保证紧迫性作业会被及时处理。

3)由于作业的长短只是根据用户所提供的估计执行时间而定的,而用户又可能会有意或无意地缩短其作业的估计运行时间,致使该算法不一定能真正做到短作业优先调度。

注意,SJF 调度算法的平均等待时间、平均周转时间最少

高响应比优先调度算法HRRN

高响应比优先调度算法主要用于作业调度,该算法是对 FCFS 调度算法和 SJF 调度算法的种综合平衡,同时考虑每个作业的等待时间和估计的运行时间。在每次进行作业调度时,先计算后备作业队列中每个作业的响应比,从中选出响应比最高的作业投入运行

2.1.11 时间片轮转、优先级、多级反馈队列

时间片轮转调度算法

时间片轮转调度算法主要适用于分时系统。在这种算法中,系统将所有就绪进程按到达时间的先后次序排成一个队列,进程调度程序总是选择就绪队列中第一个进程执行,即先来先服务的原则,但仅能运行一个时间片,如100ms 在使用完一个时间片后,即使进程并未完成其运行,它也必须释放出(被剥夺)处理机给下一个就绪的进程,而被剥夺的进程返回到就绪队列的末尾重新排队,等候再次运行。

在时间片轮转调度算法中,时间片的大小对系统性能的影响很大。

  • 如果时间片足够大,以至于所有进程都能在一个时间片内执行完毕,则时间片轮转调度算法就退化为先来先服务调度算法。
  • 如果时间片很小,那么处理机将在进程间过于频繁切换,使处理机的开销增大,而真正用于运行用户进程的时间将减少。因此时间片的大小应选择适当。时间片的长短通常由以下因素确定:系统的响应时间、就绪队列中的进程数目和系统的处理能力。
优先级调度算法


多级反馈队列调度算法

多级反馈队列调度算法是时间片轮转调度算法和优先级调度算法的综合和发展,通过动态调整进程优先级和时间片大小,多级反馈队列调度算法可以兼顾多方面的系统目标。例如,为提高系统吞吐量和缩短平均周转时间而照顾短进程;为获得较好的I/O设备利用率和缩短响应时间而照顾I/O型进程;同时,也不必事先估计进程的执行时间。

多级反馈队列调度算法的实现思想如下:

1)应设置多个就绪队列,并为各个队列赋予不同的优先级,第1级队列的优先级最高,第2级队列次之,其余队列的优先级逐次降低。

2)赋予各个队列中进程执行时间片的大小也各不相同,在优先级越高的队列中,每个进程的运行时间片就越小。例如,第2级队列的时间片要比第1级队列的时间片长1倍…第 i +1级队列的时间片要比第 i 级队列的时间片长1倍。

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

4)仅当第1级队列为空时,调度程序才调度第2级队列中的进程运行;仅当第1~(-1)级队列均为空时,才会调度第i级队列中的进程运行。如果处理机正在执行第 i 级队列中的某进程时又有新进程进入优先级较高的队列(第1~( i - 1 )中的任何一个队列),则此时新进程将抢占正在运行进程的处理机,即由调度程序把正在运行的进程放回到第 i 级队列的末尾,把处理机分配给新到的更高优先级的进程多级反馈队列的优势有以下几点。

1)终端型作业用户:短作业优先。

2)短批处理作业用户:周转时间较短

3)长批处理作业用户:经过前面几个队列得到部分执行,不会长期得不到处理

2.1.12 进程同步、互斥

  1. 临界资源

虽然多个进程可以共享系统中的各种资源,但其中许多资源一次只能为一个进程所使用,我们把一次仅允许一个进程使用的资源称为临界资源。许多物理设备都属于临界资源,如打印机等、此外,还有许多变量、数据等都可以被若干进程共享,也属于临界资源、对临界资源的访问,必须互斥地进行,在每个进程中,访问临界资源的那段代码称为临界区。

  1. 同步

同步亦称直接制约关系,它是指为完成某种任务而建立的两个或多个进程,这些进程因为需要在某些位置上协调它们的工作次序而等待、传递信息所产生的制约关系。进程间的直接制约关系就是源于它们之间的相互合作。

例如,输入进程A通过单缓冲向进程B提供数据。当该缓冲区空时,进程B不能获得所需数据而阻塞,一旦进程A将数据送入缓冲区,进程B被唤醒。反之,当缓冲区满时,进程A被阻塞,仅当进程B取走缓冲数据时,才唤醒进程A

  1. 互斥

互斥亦称间接制约关系。当一个进程进入临界区使用临界资源时,另一个进程必须等待,当占用临界资源的进程退出临界区后,另一进程才允许去访问此临界资源

例如,在仅有一台打印机的系统中,有两个进程A和进程B,如果进程A需要打印时,系统已将打印机分配给进程B,则进程A必须阻塞。一旦进程B将打印机释放,系统便将进程A唤醒,并将其由阻塞状态变为就绪状态。

为禁止两个进程同时进入临界区,同步机制应遵循以下准则:

1)空闲让进。临界区空闲时,可以允许一个请求进入临界区的进程立即进入临界区

2)忙则等待。当已有进程进入临界区时,其他试图进入临界区的进程必须等待。

3)有限等待。对请求访问的进程,应保证能在有限时间内进入临界区

4)让权等待。当进程不能进入临界区时,应立即释放处理器,防止进程忙等待

2.1.12.1 实现临界区互斥的基本方法




  1. 软件实现方法
  • 单标志法。
  • 双标志法先检查
  • 双标志法后检查。
  • Peterson's Algorithm
  1. 硬件实现方法
  • 中断屏蔽方法
    • 当一个进程正在使用处理机执行它的临界区代码时,要防止其他进程再进入其临界区访问的最简单方法是禁止一切中断发生,或称之为屏蔽中断、关中断。因为CPU只在发生中断时引起进程切换,这样屏蔽中断就能保证当前运行进程将临界区代码顺利地执行完,从而保证了互斥的正确实现,然后再执行开中断。

其典型模式

这种方法限制了处理机交替执行程序的能力,因此执行的效率将会明显降低。对内核来说当它执行更新变量或列表

的几条指令期间关中断是很方便的,但将关中断的权力交给用户则很不明智,若一个进程关中断之后不再开中

断,则系统可能会因此终止。

  • 硬件指令方法
      • TestAndSet指令
      • Swap指令
2.1.13 信号量








信号量机构是一种功能较强的机制,可用来解决进程互斥与同步的问题,它只能被两个标准的原语wait(S)和 signal(S)来访问,也可以记为“P操作”和“V操作”,原语是指完成某种功能且不被分割不被中断执行的操作序列,通常可由硬件来实现完成不被分割执行特性的功能。如前述的“ Test-and-Set”和“Swap”指令,就是由硬件实现的原子操作。原语功能的不被中断执行特性在单处理机时可由软件通过屏蔽中断方法实现。原语之所以不能被中断执行,是因为原语对变量的操作过程如果被打断,可能会去运行另一个对同一变量的操作过程,从而出现临界段问题。如果能够找到一种解决临界段问题的元方法,就可以实现对共享变量操作的原子性。

1 整型信号量

2 记录型信号量

3 利用信号量实现同步

4 利用信号量实现进程互斥

5 利用信号量实现前驱关系

2.1.14 经典同步问题
  1. 生产者-消费者问题

问题描述:一组生产者进程和一组消费者进程共享一个初始为空、大小为n的缓冲区,只有缓冲区没满时,生产者才能把消息放入到缓冲区,否则必须等待:只有缓冲区不空时,消费者才能从中取出消息,否则必须等待。由于缓冲区是临界资源,它只允许一个生产者放入消息,或者一个消费者从中取出消息。

  1. 多生产者-多消费者问题

  1. 读者-写者问题

问题描述:有读者和写者两组并发进程,共享一个文件,当两个或以上的读进程同时访问共享数据时不会产生副作用,但若某个写进程和其他进程(读进程或写进程)同时访问共享数据时则可能导致数据不一致的错误。因此要求:

  1. 允许多个读者可以同时对文件执行读操作:
  2. 只允许一个写者往文件中写信息:
  3. 任一写者在完成写操作之前不允许其他读者或写者工作;
  4. 写者行写操作前,应让已有的读者和写者全部退出

  1. 哲学家进餐问题

问题描述
有五位哲学家围坐在一张圆形餐桌旁,他们的生活就是思考和进餐。餐桌中间有一盘意大利面,每两位哲学家之间有一支筷子。哲学家在思考一段时间后会感到饥饿,这时他们就试图拿起左右两边的筷子进餐,吃完后放下筷子继续思考。

问题分析

  1. 资源竞争:这里的筷子是有限的资源,哲学家们需要同时拿到左右两支筷子才能进餐,这就导致了对资源的竞争。
  2. 可能出现的死锁情况:如果所有哲学家都同时拿起了左边的筷子,然后等待右边的筷子,就会进入死锁状态,大家都无法进餐。

二、避免死锁的调度方式

  1. 资源分级法
    • 对筷子进行编号,奇数号哲学家先拿左边筷子再拿右边筷子,偶数号哲学家先拿右边筷子再拿左边筷子。这样可以避免所有哲学家同时去拿同一边的筷子而造成死锁。
    • 例如,哲学家 1 先拿 1 号筷子再拿 2 号筷子,哲学家 2 先拿 2 号筷子再拿 3 号筷子,以此类推。
  1. 最多允许四位哲学家同时进餐
    • 可以设置一个规则,任何时刻最多只允许四位哲学家去尝试拿筷子,这样就一定有一位哲学家可以拿到两支筷子进餐,当他吃完放下筷子后,其他哲学家就有机会进餐,从而避免死锁。
  1. 设置一个协调者(服务员)
    • 引入一个协调者角色,哲学家在拿筷子之前必须向协调者请求许可。协调者根据当前的情况决定是否允许哲学家拿筷子。
    • 如果一个哲学家请求拿筷子时,协调者发现如果允许他拿会导致死锁,就拒绝这个请求,直到有足够的资源可用时才允许。
  1. 非阻塞尝试拿取
    • 哲学家在尝试拿筷子时,如果发现无法同时拿到两支筷子,就立即放下已经拿起的筷子,然后过一段时间再尝试。这样可以避免哲学家一直持有一支筷子等待另一支筷子而造成死锁。

  1. 吸烟者问题

问题描述:假设一个系统有三个抽烟者进程和一个供应者进程。每个抽烟者不停地卷烟并抽掉它,但是要卷起并抽

掉一支烟,抽烟者需要有三种材料:烟草、纸和胶水。三个抽烟者中,第一个拥有烟草、第二个拥有纸,第三个

拥有胶水。供应者进程无限地提供三种材料,供应者每次将两种材料放到桌子上,拥有剩下那种材料的抽烟者卷

一根烟并抽掉它,并给供应者一个信号告诉完成了,供应者就会放另外两种材料在桌上,这种过程一直重复(让三

个抽烟者轮流地抽烟)

吸烟者问题提供了,单生产者生产多类商品,供多个消费者使用

吸烟者问题说明了生产者-消费者模型的一种变体。

在这个问题中,供应者扮演生产者的角色,不断地随机生成两种原料组合放在桌上(生产产品)。而吸烟者则扮演消费者的角色,他们需要特定的两种原料组合来进行吸烟操作(消费产品)。

这个问题也体现了同步和互斥的关系。多个吸烟者之间对原料存在竞争关系,需要确保在同一时间只有一个吸烟者能够获取并使用特定的原料组合,这体现了互斥。同时,吸烟者只有在供应者提供了所需的原料组合后才能进行吸烟操作,这体现了生产者和消费者之间的同步关系。

此外,该问题还强调了资源的合理分配和调度对于避免死锁等问题的重要性。如果资源分配不当,可能会导致系统陷入死锁状态,就像所有吸烟者都在等待永远不会出现的原料组合一样。通过合理的调度策略,可以确保系统的高效运行,避免死锁等问题的发生。

2.1.15 管程

1)管程的定义

系统中的各种硬件资源和软件资源,均可用数据结构抽象地描述其资源特性,即用少量信息和对资源所执行的操作来表征该资源,而忽略了它们的内部结构和实现细节。管程是由一组数据以及定义在这组数据之上的对这组数据的操作组成的软件模块,这组操作能初始化并改变管程中的数据和同步进程.

2)管程的纽成

  1. 局部于管程的共享结构数据说明
  2. 对该数据结构进行操作的一组过程。
  3. 对局部于管程的共享数据设置初始值的语句

3)管程的基本特性

  1. 局部于管程的数据只能被局部于管程内的过程所访问
  2. 一个进程只有通过调用管程内的过程才能进入管程访问共享数据
  3. 每次仅允许一个进程在管程内执行某个内部过程。

由于管程是一个语言成分,所以管程的互斥访问完全由编译程序在编译时自动添加,无需程序员关注,而且保证正确.

这里,我们再用生活化的语言介绍什么是管程。

管程实质上是一个抽象类,这个抽象类有好几个成员变量,系统中任何设备都可以通过这几成员变量进行区分和描述:管程中还有对这些成员变量进行操作的一组成员函数,例如,对外设的操作中,会有read,write这一类函数。假如,进程P0要使用一台打印机,于是管程这个抽象类就会利用初始值语句对自身的几个成员变量赋初值(这个行为不需要程序员关注),特定的几个初值可以让管程表示成一台打印机,进程P0进入管程后,通过调用管程中的成员函数(即上面所说的过程)对这台打印机进行操作。每次进入这个管程的,只能是一个进程

2.1.16 死锁






  1. 死锁的定义

在多道程序系统中,由于多个进程的并发执行,改善了系统资源的利用率并提高了系统的处理能力。然而,多个进程的并发执行也带来了新的问题—死锁。所谓死锁是指多个进程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进.在计算机系统中也存在类似的情况。例如,某计算机系统中只有一台打印机和一台输入设备进程P1正占用输入设备,同时又提出使用打印机的请求,但此时打印机正被进程P2所占用,而P2在未释放打印机之前,又提出请求使用正被P1占用着的输入设备。这样两个进程相互无休止地等待下去,均无法继续执行,此时两个进程陷入死锁状态。

  1. 死锁产生的原因

(1)系统资源的竞争

通常系统中拥有的不可剥夺资源,其数量不足以满足多个进程运行的需要,使得进程在运行过程中,会因争夺资源而陷入僵局,如磁带机、打印机等。只有对不可剥夺资源的竞争才可能产生死锁,对可剥夺资源的竞争是不会引起死锁的。

(2)进程推进顺序非法

进程在运行过程中,请求和释放资源的顺序不当,也同样会导致死锁。例如,并发进程P1、P2分别保持了资

源R1、R2,而进程P1 申请资源R2,进程P2申请资源R1时,两者都会因为所需资源被占用而阻塞。

信号量使用不当也会造成死锁。进程间彼此相互等待对方发来的消息,结果也会使得这些进程间无法继续向前推进。例如,进程A等待进程B发的消息,进程B又在等待进程A发的消息,可以看出进程A和B不是因为竞争同一资源,而是在等待对方的资源导致死锁。

(3)死锁产生的必要条件

产生死锁必须同时满足以下四个条件,只要其中任一条件不成立,死锁就不会发生

  1. 互斥条件:进程要求对所分配的资源(如打印机)进行排他性控制,即在一段时间内,某资源仅为一个进程所占有。此时若有其他进程请求该资源,则请求进程只能等待。
  2. 不剥夺条件:进程所获得的资源在未使用完毕之前不能被其他进程强行夺走,即只能由获得该资源的进程自己来释放(只能是主动释放)
  3. 请求和保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放

资源分配图含圈而系统又不一定有死锁的原因是同类资源数大于1,但若系统中每类资源都只有一个资源,则资

源分配图含圈就变成了系统出现死锁的充分必要条件。要注意区分不可剥夺条件与请求和保持条件,用一个简

单的例子来说明:如果你手上拿个苹果(即便你不打算吃),别人不能把你手上的苹果拿走,那就是不可剥夺

条件;如果你左手拿着一个苹果,允许你右手再去拿一个苹果,那就是请求和保持条件。

2.1.17 死锁的处理策略

为使系统不发生死锁,必须设法破坏产生死锁的四个必要条件之一,或者允许死锁产生,但当死锁发生时能检测出死锁,并有能力实现恢复

  1. 预防死锁

设置某些限制条件,破坏产生死锁的四个必要条件中的一个或几个,以防止发生死锁

  1. 避免死锁

在资源的动态分配过程中,用某种方法防止系统进入不安全状态【银行家算法】,从而避免死锁

  1. 死锁的检测及解除

无需采取任何限制性措施,允许进程在运行过程中发生死锁。通过系统的检测机构及时地检测出死锁的发生,然后采取某种措施解除死锁。

预防死锁和避免死锁都属于事先预防策略,但预防死锁的限制条件比较严格,实现起来较为简单,但往往

导致系统的效率低,资源利用率低,避免死锁的限制条件相对宽松,资源分配后需要通过算法来判断是否进入不安全状态,实现起来较为复杂。

2.1.17.1 死锁预防

防止死锁的发生只需破坏死锁产生的四个必要条件之一即可

  1. 破坏互斥条件

如果允许系统资源都能共享使用,则系统不会进入死锁状态。但有些资源根本不能同时访问,如打印机等临界

资源只能互斥使用。所以,破坏互斥条件而预防死锁的方法不太可行,而且在有的场合必须保护这种互斥性

缺点:有些场合必须保护资源的互斥性,因此在某些场景下不可用

  1. 破坏不剥夺条件

当一个已保持了某些不可剥夺资源的进程,请求新的资源而得不到满足时,它必须释放已经保持的所有资源,待以后需要时再重新申请。这意味着,一个进程已占有的资源会被暂时释放或者说是被剥夺了,从而破坏了不可剥夺条件该策略实现起来比较复杂,释放已获得的资源可能造成前一阶段工作的失效,反复地申请和释放资源会增加系统开销,降低系统吞吐量,这种方法常用于状态易于保存和恢复的资源,如CPU的寄存器及内存资源,一般不能用于打印机之类的资源

缺点:可能导致前一阶段的工作失效,只能用于容易保存状态并且恢复容易的资源

  1. 破坏请求和保持条件

采用预先静态分配方法,即进程在运行前一次申请完它所需要的全部资源,在它的资源未满足前,不把它投入运行。一旦投入运行后,这些资源就一直归它所有,也不再提出其他资源请求这样就可以保证系统不会发生死锁这种方式实现简单,但缺点也显而易见,系统资源被严重浪费,其中有些资源可能仅在运行初期或运行快结束时才使用,甚至根本不使用。而且还会导致“饥饿”现象,当由于个别资源长期被其他进程占用时,将致使等待该资源的进程迟迟不能开始运行。

缺点:系统资源被严重浪费,因为有些资源可能很快被使用完,但是需要一直等到进程使用完所有资源才能被释放

  1. 破坏循环等待条件

为了破坏循环等待条件,可采用顺序资源分配法。首先给系统中的资源编号,规定每个进程必须按编号递增的顺序请求资源,同类资源一次申请完。也就是说,只要进程提出申请分配资源Ri,则该进程在以后的资源申请中,只能申请编号大于Ri的资源.这种方法存在的问题是,编号必须相对稳定,这就限制了新类型设备的增加:尽管在为资源编号时已考虑到大多数作业实际使用这些资源的顺序,但也经常会发生作业使用资源的顺序与系统规定顺序不同的情况,造成资源的浪费,此外,这种按规定次序申请资源的方法,也必然会给用户的编程带来麻烦.

缺点:想要新增设备非常困难,可能需要对所有资源进行重新编号,而且经常会发生作业使用资源的顺序与系统规定顺序不同,造成资源的浪费

2.1.17.2 死锁避免

并非所有的不安全状态都是死锁状态,但当系统进入不安全状态后,便可能进入死锁状态。反之,只要系统处于安全状态,系统便可以避免进入死锁状态

不安全状态不一定造成死锁,但死锁状态一定处于不安全状态,安全状态一定不会导致死锁

2.1.17.3 死锁检测和解除

前面介绍的死锁预防和避免算法,都是在为进程分配资源时施加限制条件或进行检测,若系统为进程分配资源时不采取任何措施,则应该提供死锁检测和解除的手段。(允许死锁的发生,但是需要轮训的判断是否真的有死锁发生,如果有,则需要解除死锁)

那么如何判断是否发生了死锁呢?


点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部