第二章 进程管理

148 阅读25分钟

1. 进程

1.1 进程的概念、组成、特征

  • 概念

程序: 是静态的,就是个存放在磁盘里的可执行文件,就是一系列的指令集合

进程(Process):是动态的,是程序的一次执行过程

  • 组成

PCB+程序段+数据段

image.png

image.png

image.png

  • 特征

image.png

1.2 进程的状态与转换、进程的组织

  • 进程的状态与转换

image.png

image.png

image.png

image.png

image.png

image.png

  • 进程的组织

image.png

  1. 链接方式

image.png

  1. 索引方式

image.png

1.3 进程控制

进程控制的主要功能是对系统中的所有进程实施有效的管理,它具有创建新进程、撤销已有进程、实现进程状态转换等功能。

简化理解:进程控制就是要实现进程状态转换

image.png

  • 如何实现进程控制?

用“原语”实现

image.png

image.png

如果不能“一气呵成”,就有可能导致操作系统中某些关键数据结构信息不统一的情况,这会影响操作系统进行别的管理工作。

image.png

  • 如何实现原语的“原子性”

原语的执行具有原子性,即执行过程只能一气呵成,期间不允许被中断。

可以用“关中断指令”和“开中断指令”这两个特权指令实现原子性

image.png

  • 进程控制相关的原语

image.png

image.png

image.png

image.png

  • 程序是如何运行的

image.png

image.png

1.4 进程通信

image.png

  • 什么是进程间通信

image.png

  • 为什么进程通信需要操作系统支持

进程是分配系统资源的单位(包括内存地址空间),因此各进程拥有的内存地址空间相互独立。

image.png

  • 共享存储

为避免出错,各个进程对共享空间的访问应该是互斥的。

各个进程可使用操作系统内核提供的同步互斥工具(如P、V操作)

  1. 基于数据结构的共享
  2. 基于存储区的共享

image.png

image.png

  • 消息传递

进程间的数据交换以格式化的消息为单位。进程通过操作系统提供的“发送消息/接收消息”两个原语进行数据交换。

  1. 直接通信方式

image.png

image.png

  1. 间接通信方式

image.png

  • 管道通信

“管道”是一个特殊的共享文件,又名pipe文件。其实就是在内存中开辟一个大小固定的内存缓冲区。

image.png

  1. 管道只能采用半双工通信,某一时间段只能实现单向的传输。如果要实现双向同时通信,则需要设置两个管道
  2. 各进程要互斥的访问管道(由操作系统实现)
  3. 当管道写满时,写进程将被阻塞,直到读进程将管道中的数据取走,即可唤醒写进程
  4. 当管道读空时,读进程将阻塞,直到写进程往管道写入数据,即可唤醒读进程
  5. 管道中的数据一旦被读出,就彻底消失。因此,当多个进程读同一管道时,可能会错乱。对此,通常有两种解决方案

    ①一个管道允许多个写进程,一个读进程

    ②允许有多个写进程,多个读进程,但系统会让各个读进程轮流从管道中读数据

image.png

1.5 线程的概念

image.png

  • 什么是线程,为什么要引入线程

可以把线程理解为“轻量级进程”。

线程是一个基本的CPU执行单元,也是程序执行流的最小单位。

引入线程之后,不仅是进程之间可以并发,进程内的各线程之间也可以并发,从而进一步提升了系统的并发度,使得一个进程内也可以并发处理各种任务(如QQ视频、文字聊天、传文件)。

引入线程后,进程只作为除CPU之外的系统资源的分配单元(如打印机、内存地址空间等都是分配给进程的)。

image.png

image.png

  • 引入线程之后,有什么变化

image.png

  • 线程的属性

image.png

1.6 线程的实现方式和多线程模型

image.png

  • 线程的实现方式
  1. 用户级线程

image.png

线程的管理由谁完成?

由应用程序的线程库管理。

线程切换是否需要CPU变态?

不需要,在用户态下就能完成线程的切换。

操作系统是否能意识到用户级线程的存在?

不能,操作系统只能看到进程的存在。

优点:用户级线程的切换在用户空间即可完成,不需要切换到核心态,线程管理的系统开销小,效率高。

缺点: 当一个用户级线程被阻塞后,整个进程都会被阻塞,并发度不高。多个线程不可在多核处理机上并行运行。

  1. 内核级线程

image.png

线程的管理工作由谁来完成?

操作系统内核。

线程切换是否需要CPU变态

线程调度、切换等工作都由内核负责,因此内核级线程的切换必须在核心态下才能完成。

操作系统是否能意识到内核级线程的存在

优点:当一个线程被阻塞后,别的线程还可以继续执行,并发能力强。多线程可在多核处理机上并行执行。

缺点:一个用户进程会占用多个内核级线程,线程切换由操作系统内核完成,需要切换到核心态,因此线程管理成本高,开销大。

  • 多线程模型

在支持内核级线程的系统中,根据用户级线程和内核级线程的映射关系,可以划分为几种多线程模型

  1. 一对一模型

优点:当一个线程被阻塞后,别的线程还可以继续执行,并发能力强。多线程可在多核处理机上并行执行。

缺点:一个用户进程会占用多个内核级线程,线程切换由操作系统内核完成,需要切换到核心态,因此线程管理成本高,开销大。

image.png

  1. 多对一模型

优点:用户级线程的切换在用户空间即可完成,不需要切换到核心态,线程管理的系统开销小,效率高。

缺点: 当一个用户级线程被阻塞后,整个进程都会被阻塞,并发度不高。多个线程不可在多核处理机上并行运行。

image.png

  1. 多对多模型

多对多模型:n用户级线程映射到m个内核级线程(n>=m)。每个用户进程对应m个内核级进程

克服了多对一模型并发度不高的缺点(一个阻塞全体阻塞),又克服了一对一模型中一个用户进程占用太多内核级线程,开销太大的缺点。

image.png

image.png

1.7 线程的状态与转换

  • 状态与转换

image.png

  • 组织与控制

image.png


2. 处理机调度

2.1 调度的概念、层次

image.png

  • 调度的基本概念

当有一堆任务要处理,但由于资源有限,这些事情没法同时处理。这就需要确定某种规则来决定处理这些任务的顺序,这就是“调度”研究的问题。

image.png

  • 三个层次
  1. 高级调度(作业调度)

作业:一个具体的任务

用户向系统提交一个作业≈用户让操作系统启动一个程序(来处理一个具体的任务)

image.png

  1. 低级调度

image.png

  1. 中级调度

image.png

补充知识:进程的挂起态与七状态模型

“挂起”和“阻塞”的区别:两种状态都是暂时不能获得CPU的服务,但挂起态是将进程映像调到外存去了,而阻塞态下进程映像还在内存中。

有的操作系统会把就绪挂起、阻塞挂起分为两个挂起队列,甚至会根据阻塞原因不同再把阻塞挂起进程进一步细分为多个队列。

image.png

  • 三层调度的联系、对比

image.png

image.png

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

image.png

  • 进程调度的时机

进程调度(低级调度),就是按照某种算法从就绪队列中选择一个进程为其分配处理机。

image.png

image.png

  • 进程调度的方式
  1. 非剥夺调度方式:又称非抢占方式。即,只允许进程主动放弃处理机。在运行过程中即便有更紧迫的任务到达,当前进程依然会继续使用处理机,直到该进程终止或主动要求进入阻塞态。
  2. 剥夺调度方式,又称抢占方式。当一个进程正在处理机上执行时,如果有一个更重要或更紧迫的进程需要使用处理机,则立即暂停正在执行的进程,将处理机分配给更重要紧迫的进程。

image.png

  • 进程的切换与过程

“狭义的进程调度”与“进程切换”的区别:

狭义的进程调度指的是从就绪队列中选中一个要运行的程序。(这个进程可以是刚刚被暂停执行的进程,也可能是另一个进程,后一种情况就需要进程切换)。

进程切换是指一个进程让出处理机,由另一个进程占用处理机的过程。

广义的进程调度包含了选择一个进程和进程切换两个步骤。

进程切换的过程主要完成了:

  1. 对原来运行进程各种数据的保存
  2. 对新的进程各种数据的恢复

(如:程序计数器、程序状态字、各种数据寄存器等处理机现场信息,这些信息一般保存在进程控制块)

注意:进程切换是有代价的,因此如果过于频繁的进行进程调度、切换,必然会使整个系统的效率降低,使系统大部分时间都花在了进程切换上,而真正用于执行进程的时间减少。

image.png

2.3 调度器和闲逛进程

  • 调度器/调度程序

image.png

image.png

  • 闲逛进程

调度程序永远的备胎,没有其他就绪进程时,运行闲逛进程(idle)。

闲逛进程的特性:

  1. 优先级最低
  2. 可以是0地址指令,占一个完整的指令周期(指令周期末尾例行检查中断)
  3. 能耗低

2.4 调度算法的评价指标

image.png

  • CPU利用率

CPU利用率:指CPU“忙碌”的时间占总时间的比例。

利用率 = 忙碌的时间/总时间

  • 系统吞吐量

用尽可能少的时间处理完尽可能多的作业。

系统吞吐量:单位时间内完成作业的数量。

系统吞吐量 = 总共完成了多少道作业/总共花了多少时间

  • 周转时间

周转时间:指从作业被提交给系统开始,到作业完成为止的这段时间间隔。

它包括四个部分:

  1. 作业在外存后备队列上等待作业调度的时间
  2. 进程在就绪队列上等待进程调度的时间
  3. 进程在CPU上执行的时间
  4. 进程等待I/O操作完成的时间

(作业)周转时间 = 作业完成时间-作业提交时间

平均周转时间 = 各作业周转时间之和/作业数

带权周转时间 = 作业周转时间/作业实际运行的时间

平均带权周转时间 = 各作业带权周转时间/作业数

  • 等待时间

等待时间:指进程/作业处于等待处理机状态时间之和,等待时间越长,用户满意度越低

对于进程来说,等待时间就是指进程建立后等待被服务的时间之和,在等待I/O完成的期间其实进程也是在被服务的,所以不计入等待时间。

对于作业来说,不仅要考虑建立进程后的等待时间,还要加上作业在外存后备队列中等待的时间。

一个作业总共需要被CPU服务多久,被I/O设备服务多久一般是确定不变的,因此调度算法其实只会影响作业/进程的等待时间。当然,与前面指标类似,也有“平均等待时间”来评价整体性能。

  • 响应时间

响应时间:指从用户提交请求到首次产生响应所用的时间。

image.png

2.5 调度算法

2.5.1 调度算法(早期批处理系统)

image.png

  • 先来先服务

image.png

image.png

  • 短作业优先

image.png

image.png

image.png

image.png

FCFS算法是在每次调度的时候选择一个等待时间最长的作业(进程)为其服务。但是没有考虑到作业的运行时间,因此导致了对短作业不友好的问题。

SJF算法是选择一个执行时间最短的作业为其服务。但是又完全不考虑各个作业的等待时间,因此导致了对长作业不友好的问题,甚至还会造成饥饿问题。

  • 高响应比优先

image.png

image.png

image.png

2.5.2 调度算法(交互式系统)

image.png

  • 时间片轮转(分时操作系统)

image.png

image.png

image.png

image.png

image.png

  • 优先级调度算法(实时操作系统)
  1. 非抢占式

image.png

  1. 抢占式

image.png

image.png

image.png

  • 多级反馈队列调度算法

image.png

image.png

image.png

2.5.3 多级队列调度算法

image.png


3. 进程同步、进程互斥

3.1 进程同步、进程互斥

  • 什么是进程同步

image.png

image.png

  • 什么是进程互斥

image.png

image.png

image.png

image.png

3.2 进程互斥的软件实现方法

image.png

  • 单标志法

image.png

只能按P0->P1->P0->P1->...这样轮流访问。这种必须“轮流访问”带来的问题是,如果此时允许进入临界区的进程是P0,而P0一直不访问临界区,那么虽然此时临界区空闲,但是并不允许P1访问。

因此,单标志法存在的主要问题是:违背“空闲让进”原则。

  • 双标志先检查

image.png

  • 双标志后检查

image.png

  • Peterson算法

算法思想:结合双标志法、单标志法的思想。如果双方都争着想进入临界区,那可以让进程尝试“孔融让梨”。

image.png

Peterson算法用软件方法解决了进程互斥问题,遵循了空闲让进、忙则等待、优先等待三个原则,但是依然未遵循让权等待的原则。

Peterson算法相较于之前三种软件解决方案来说,是最好的,但依然不够好。

image.png

3.3 进程互斥的硬件实现方法

image.png

  • 中断屏蔽方法

利用“开/关中断指令”实现(与原语的实现思想相同,即在某进程开始访问临界区到结束访问为止都不允许被中断,也就不能发生进程切换,因此也不可能发生两个同时访问临界区的情况)。

优点:简单、高效。

缺点:不适用于多处理机;只适用于操作系统内核进程,不适用于用户进程(因为开/关中断指令只能运行在内核态,这组指令如果能让用户使用非常危险)。

  • TestAndSet指令

简称TS指令,也有地方称为TestAndSetLock指令,或TSL指令

TSL指令是用硬件实现的,执行的过程不允许被中断,只能一气呵成。

image.png

  • Swap指令

有的地方也叫Exchange指令,或简称XCHG指令

Swap指令是用硬件实现的,执行的过程不允许被中断,只能一气呵成。

image.png

image.png

3.4 互斥锁

解决临界区最简单的工具就是互斥锁。一个进程在进入临界区时应获得锁;在退出临界区时释放锁。函数acquire()获得锁,而函数release()释放锁。

每个互斥锁有一个布尔变量available,表示锁是否可用。如果锁是可用的,调用acquire()会成功,且锁不再可用。当一个进程试图获取不可用的锁时,会被阻塞,直到锁被释放。

image.png

acquire()或release()的执行必须是原子操作,因此互斥锁通常采用硬件机制来实现。

互斥锁的主要缺点是忙等待,当有一个进程在临界区中,任何其他进程在进入临界区时必须连续循环调用acquire()。当多个进程共享同一CPU时,就浪费了CPU周期。因此,互斥锁通常用于多处理器系统,一个线程可以在一个处理器上等待,不影响其他线程的执行。

需要连续循环忙等的互斥锁,都可称为自旋锁(spin lock),如TSL指令,swap指令、单标志法。

特性:

  1. 需忙等,进程时间片用完才下处理机,违反“让权等待”
  2. 优点:等待期间不用切换进程上下文,多处理器系统中,若上锁的时间短,则等待代价很低
  3. 常用于多处理器系统,一个核忙等,其他核照常工作,并快速释放临界区
  4. 不太适用于单处理机系统,忙等的过程中不可能解锁

3.5 信号量机制

image.png

image.png

  • 整型信号量

用一个整数型的变量作为信号量,用来表示系统中某种资源的数量。

image.png

  • 记录型信号量

整型信号量的缺陷是存在“忙等”问题,因此人们又提出了“记录型信号量”,即用记录型数据结构表示的信号量。

image.png

image.png

image.png

3.6 用信号量实现进程互斥、同步、前驱关系

image.png

  • 信号量机制实现进程互斥
  1. 分析并发进程的关键活动,划定临界区(如:对临界资源打印机的访问就应放在临界区)
  2. 设置互斥信号量mutex,初值为1
  3. 在进入区P(mutex)——申请资源
  4. 在退出区V(mutex)——释放资源

注意:

对不同的临界资源需要设置不同的互斥信号量。

P、V操作必须成对出现。缺少P(mutex)就不能保证临界资源的互斥访问。缺少V(mutex)会导致资源永不被释放,等待进程永不被唤醒。

image.png

  • 信号量机制实现进程同步

image.png

image.png

  • 信号量机制实现前驱关系

image.png

image.png

3.7 生产者-消费者问题

系统中有一组生产者进程和一组消费者进程,生产者进程每次生产一个产品放入缓冲区,消费者进程每次从缓冲区取出一个产品并使用。(注:这里的“产品”理解为某种数据)

生产者、消费者共享一个初始为空、大小为n的缓冲区。

只有缓冲区没满时,生产者才能把产品放入缓冲区,否则必须等待。

只有缓冲区不空时,生产者才能从中取出产品,否则必须等待。

缓冲区是临界资源,各进程必须互斥地访问。

image.png

image.png

PV操作题目分析步骤:

  1. 关系分析
  2. 整理思路
  3. 设置信号量
  • 如何实现

image.png

image.png

image.png

3.8 多生产者-多消费者问题

  • 问题描述

image.png

  • 问题分析

image.png

image.png

image.png

原因在于:本题中的缓冲区大小为1,在任何时刻,apple、orange、plate三个同步信号量中最多只有一个是1。因此在任何时刻,最多只有一个进程的P操作不会被阻塞,并顺利地进入临界区。

  • 知识回顾与重要考点

image.png

image.png

3.9 吸烟者问题

  • 问题描述

image.png

  • 问题分析

image.png

image.png

image.png

  • 知识回顾与重要考点

image.png

3.10 读者、写者问题

  • 问题描述

image.png

  • 问题分析

image.png

  • 如何实现

image.png

  • 知识回顾

image.png

3.11 哲学家进餐问题

  • 问题描述

image.png

  • 问题分析

image.png

  • 如何实现

image.png

image.png

  • 知识回顾与重要考点

image.png

3.12 管程

  • 为什么要引入管程

image.png

  • 管程的定义和基本特征

管程是一种特殊的软件模块,有这些部分组成:

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

跨考Tips:“过程”其实就是“函数”

管程的基本特征:

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

image.png

image.png

image.png

image.png

  • 知识回顾与重要考点

image.png


4. 死锁

4.1 死锁的概念

  • 知识总览

image.png

  • 什么是死锁

死锁:在并发环境下,各进程因竞争资源而造成的一种互相等待对方手里的资源,导致各进程都阻塞,都无法向前推进的现象,就是“死锁”。发生死锁后若无外力干涉,这些进程都将无法向前推进。

饥饿:由于长期得不到想要的资源,某进程无法向前推进的现象。比如:在短进程优先(SPF)算法中,若有源源不断的短进程到来,则长进程将一直得不到处理机,从而发生长进程“饥饿”。

死循环:某进程执行过程中一直跳不出某个循环的现象。有时是因为程序逻辑Bug导致的,有时是程序员故意设计的。

image.png

image.png

image.png

  • 死锁产生的必要条件

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

  1. 互斥条件:只有对必须互斥使用的资源的争抢才会导致死锁(如哲学家的筷子、打印机设备)。像内存、扬声器这样可以同时让多个进程使用的资源是不会导致死锁的(因为进程不用阻塞等待这种资源)。
  2. 不剥夺条件:进程所获得的资源在未使用完之前,不能由其他进程强行夺走,只能主动释放。
  3. 请求和保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源又被其他进程占有,此时请求进程被阻塞,但又对自己已有的资源保持不放。
  4. 循环等待条件:存在一种进程资源的循环等待链,链中的每一个进程已获得的资源同时被下一个进程所请求。

发生死锁时一定有循环等待,但是发生循环等待时未必死锁。

如果同类资源数大于1,即使有循环等待,也未必发生死锁。但如果系统中每类资源都只有一个,那循环等待就是死锁的充分必要条件了。

  • 什么时候会发生死锁
  1. 对系统资源的竞争。各进程对不可剥夺的资源(如打印机)的竞争可能引起死锁,对可剥夺的资源(CPU)的竞争是不会引起死锁的。
  2. 进程推进顺序非法。请求和释放资源的顺序不当,也同样会导致死锁。例如,并发执行的进程P1、P2分别申请并占有了资源R1、R2,之后进程P1又紧接着申请资源R2,而进程P2又申请资源R1,两者会因为申请的资源被对方占有而阻塞,从而发生死锁。
  3. 信号量的使用不当也会造成死锁。如生产者-消费者问题中,如果实现互斥的P操作在实现同步的P操作之前,就有可能导致死锁。(可以把互斥信号量、同步信号量也看做是一种抽象的系统资源)

总之,对不可剥夺资源的分配不合理时,就可能会发生死锁。

  • 死锁的处理策略
  1. 预防死锁。破坏死锁产生的四个必要条件中的一个或几个。
  2. 避免死锁。用某种方法防止系统进入不安全状态,从而避免死锁(银行家算法)。
  3. 死锁的检测和解除。允许死锁的产生,不过操作系统会负责检测出死锁的发生,然后采取某种措施解除死锁。
  • 知识回顾与重要考点

image.png

4.2 死锁的处理策略——预防死锁

  • 知识总览

image.png

  • 破坏互斥条件

互斥条件:只有对必须互斥使用的资源的争抢才会导致死锁。

如果把只能互斥使用的资源改造为允许共享使用,则系统不会进入死锁状态。比如:SPOOLing技术。

操作系统可以采用SPOOLing技术把独占设备在逻辑上改造成共享设备。比如,用SPOOLing技术将打印机改造成共享设备。

image.png

该策略的缺点:并不是所有的资源都可以改造成可共享使用的资源。并且为了系统安全,很多地方还必须保护这种互斥性。因此,很多时候都无法破坏互斥条件

  • 破坏不剥夺条件

不剥夺条件:进程所获得的资源在未使用完之前,不能由其他进程强行夺走,只能主动释放。

破坏不剥夺条件:

  1. 方案一:当某个进程请求新的资源得不到满足时,它必须立即释放保持的所有资源,待以后需要时再重新申请。也就是说,即使某些资源尚未使用完,也需要主动释放,从而破坏了不可剥夺条件。
  2. 方案二:当某个进程需要的资源被其他进程所占有的时候,可以由操作系统协助,将想要的资源强行剥夺。这种方式一般需要考虑各进程的优先级。(比如:剥夺调度方式,就是将处理机资源强行剥夺给优先级更高的进程使用)

该策略的缺点:

  1. 实现起来比较复杂。
  2. 释放已获得的资源可能造成前一阶段工作的失效。因此这种方法一般只适用于易保存和恢复状态的资源,如CPU。
  3. 反复地申请和释放资源会增加系统开销,降低系统吞吐量。
  4. 若采用方案一,意味着只要暂时得不到某个资源,之前获得的那些资源就都需要放弃,以后再重新申请。如果一直发生这样的情况,就会导致进程饥饿。
  • 破坏请求和保持条件

请求和保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源又被其他进程占有,此时请求进程被阻塞,但又对自己已有的资源保持不放。

可以采用静态分配方法,即进程在运行前一次申请完它所需要的全部资源,在它的资源未满足前,不让他投入运行。一旦投入运行后,这些资源就一直归他所有,该进程就不会再请求别的任何资源了。

缺点:有些资源可能只需要用很短的时间,因此如果进程的整个运行期间都一直保持着所有资源,就会造成严重的资源浪费,资源利用率极低。另外,该策略也有可能导致某些进程饥饿。

image.png

  • 破坏循环等待条件

循环等待条件:存在一种进程资源的循环等待链,链中的每一个进程已获得的资源同时被下一个进程所请求。

可采用顺序资源分配法。首先给系统中的资源编号,规定每个进程必须按编号递增的顺序请求资源,同类资源(即编号相同的资源)一次申请完。

原理分析:一个进程只有已占有小编号的资源时,才有资格申请更大编号的资源。按此规则,已经持有大编号资源的进程不可能逆向地回来申请小编号的资源,从而就不会产生循环等待的现象。

image.png

该策略的缺点:

  1. 不方便增加新的设备,因为可能需要重新分配所有的编号。
  2. 进程实际使用资源的顺序可能和编号递增顺序不一致,会导致资源浪费。
  3. 必须按规定次序申请资源,用户编程麻烦。
  • 知识回顾与重要考点

image.png

4.3 死锁的处理策略——避免死锁

  • 知识总览

image.png

  • 什么是安全序列

image.png

  • 安全序列、不安全状态、死锁的联系

image.png

  • 银行家算法

image.png

image.png

image.png

image.png

  • 知识回顾与重要考点

image.png

4.4 死锁的处理策略——检测和解除

  • 知识总览

image.png

  • 死锁的检测

image.png

如果系统中剩余的可用资源数足够满足进程的需求,那么这个进程暂时是不会阻塞的,可以顺利地执行下去。

如果这个进程执行结束了把资源归还系统,就可能使某些正在等待资源的进程被激活,并顺利地执行下去。

相应的,这些被激活的进程执行完了之后又会归还一些资源,这样可能又会激活另外一些阻塞的进程。

如果按上述过程的分析,最终能消除所有边,就称这个图是完全可简化的。此时一定没有发生死锁。(相当于能找到一个安全序列)

如果最终不能消除所有边,那么此时就是发生了死锁。

检测死锁的算法

image.png

image.png

  • 死锁的解除

image.png

如何决定对谁动手?

  1. 进程优先级
  2. 已执行多长时间
  3. 还要多久能完成
  4. 进程已经使用了多少资源
  5. 进程是交互式的还是批处理式的
  • 知识回顾与重要考点

image.png