1、进程与线程
进程的概念和特征
引入进程的目的:以便更好地描述和控制
程序的并发执行
,实现操作系统的并发性和共享性
为了使参与并发执行的程序(含数据)能独立地运行,必须为之配置一个专门的数据结构,称之为进程控制块(Process Control Block, PCB)
系统利用PCB来描述
进程的基本情况和运行状态,进而控制和管理
进程
由程序段、相关数据段和PCB三部分构成了进程映像(进程实体)
创建进程,实质上是创建进程映像中的PCB
;而撤销进程,实质上是撤销进程的PCB
进程映像是静态的,进程则是动态的
PCB是进程存在的唯一标志,动态性是进程最基本的特征
进程是系统进行资源分配和调度
的一个独立单位(注意对于资源一词的理解)
进程的状态与转换
运行状态
、就绪状态
、阻塞状态(等待状态)
、创建状态、结束状态
前三种是进程的`基本状态
不同状态之间的转换(理解记忆)
一个进程从运行状态变变成阻塞状态是一个主动的行为
;而从阻塞状态变到就绪状态是一个被动的行为
,需要其他相关进程的协助
进程控制
进程控制的主要功能是对系统中所有的进程实施有效的管理,它具有创建
新进程、撤销
已有进程、实现进程状态转换
等功能
在操作系统中,一般把进程控制用的程序段称为原语
,原语的特点是执行期间不允许中断
,它是一个不可分割的基本单位
允许一个进程创建另一个进程。子进程可以继承父进程所拥有的资源
。当子进程别撤销时,应将其从父进程那里获得的资源归还
给父进程。此外,在撤销父进程时,也必须同时撤销其所有的子进程
新进程的创建过程(创建原语
):主要是PCB的申请(并初始化其中的信息)和资源的分配
进程的终止步骤(撤销原语
):主要是资源的释放
Block原语
和Wakeup原语
是一对作用刚好相反的原语,必须成对使用
。Block原语是由被阻塞进程自我调用实现的
,而Wakeup原语则是由一个与被唤醒进程相合作或被其他相关的进程调用实现的
任何进程都是在操作系统内核的支持下运行的,是与内核紧密相关的
进程的切换
是指处理机从一个进程的运行转到另一个进程上运行,这个过程中,进程的运行环境
产生了实质性的变化
进程切换
与处理机模式切换
是不同的
进程的环境信息:??????
调度
和切换
的区别:调度是指决定资源分配给哪个进程的行为,是一种决策行为
;切换是指实际分配的行为,是执行行为
。一般来说,先有资源的调度,然后才有进程的切换
进程的组织
进程是操作系统的资源分配
和独立运行
的基本单位
进程创建时,操作系统就新建一个PCB结构,它之后就常驻内存
,任一时刻可以存取,在进程结束时删除。PCB是进程实体的一部分,是进程存在的唯一标志
PCB主要包括进程描述信息
、进程控制和管理信息
、资源分配清单
、处理机相关信息
在操作系统中存在着很多进程,这些进程的PCB都是通过相应的方式(链接方式或索引方式
)组织起来的
程序段
就是进程在执行的时候,所执行的程序代码段
程序可以被多个进程共享,即多个进程可以运行同一个程序;一个进程也可以对应多个程序
数据段
是进程对应的程序加工处理的原始数据和所获得的中间或最终结果
进程的通信
进程通信是指进程之间的信息交换
PV操作
是低级通信方式;高级通信方式是指以较高的效率传输大量数据
的通信方式
高级通信方式主要有三类:共享存储
、消息传递
、管道通信
在通信的进程之间存在一块可直接访问的共享空间
,通过对这片共享空间进行写/读操作实现进程之间的信息交换。在对共享空间进行写/读操作的时候,需要使用同步互斥工具
(如P操作、V操作),对共享空间的写/读进行控制
低级方式的共享是基于数据结构的共享
;高级方式的共享是基于存储区的共享
操作系统只负责为通信进程提供可共享使用的存储空间
和同步互斥工具
,而数据交换则由用户安排写/读指令完成
用户进程空间一般都是独立的
,进程运行期间一般不能访问其他进程的空间,要想让两个用户进程共享空间必须通过特殊的系统调用实现,而进程内的线程是自然共享进程空间的
进程之间也可以利用操作系统提供的消息传递方法实现进程通信。在消息传递系统
中,进程间的数据交换是以格式化的消息(Massage)为单位
的,在该系统中进程通过系统提供的发送消息原语
和接收消息原语
进行数据交换
消息传递方式分为:直接
通信方式和间接
通信方式
管道
是指用于连接一个读进程和一个写进程以实现它们之间通信的一个共享文件
为了协调双方的通信,管道机制必须提供以下三方面的协调能力:互斥
、同步
和确定对方的存在
从管道中读数据是一次性操作
,数据一旦被读取,它就从管道中被抛弃,释放空间以便写更多的数据。
管道只能采用半双工同信
,即某一时刻只能单向传输
要实现父子进程双方互动通信,需要定义两个管道
管道可以理解为是共享存储的优化和发展
线程概念和多线程模型
引入进程的目的
:为了更好的使多道程序并发执行,以提高资源利用率和系统吞吐量,增加并发程度
引入线程的目的
:为了减少程序在并发执行时所付出的时空开销,提高操作系统的并发性能
线程:轻量级进程
,一个基本的CPU执行单元
,也是程序执行流的最小单元
线程实体有线程ID
、线程控制块(程序计数器、寄存器集合、堆栈)
组成
线程是进程中的一个实体,是被系统独立调度和分派的基本单位
,线程自己不拥有系统资源(或只拥有一点在运行中必不可少的资源),但它可与同属一个进程的其他线程共享进程所拥有的全部资源
线程也有就绪
、阻塞
和运行
三种基本状态
引入线程后,进程的内涵发生了改变,进程只作为除CPU以外系统资源的分配单元,线程则作为处理机的分配单元
。由于一个进程内部有多个线程,如果线程的切换发生在同一个进程内部,则只需要很少的时空开销
同一进程内的多个线程共享进程的地址空间
,所以这些线程之间的同步和通信非常容易实现,甚至无需操作系统的干预
线程的实现方式:用户级线程(User-Level Thread,ULT)
和内核级线程(Kernel-Level Thread,KLT)
在用户级线程中
,有关线程管理的所有工作都由应用程序完成
,内核意识不到线程的存在。应用程序可以通过使用线程库
设计成多线程程序
在内核级线程中,线程管理的所有工作由内核完成,应用程序没有进程线程管理的代码,只有一个到内核级线程的编程接口
在一些系统中,使用组合方式的多线程实现
有些系统同时支持用户线程
和内核线程
,由此产生了不同的多线程模型
,即实现用户级线程和内核级线程的连接方式
多线程模型:多对一
、一对一
、多对多
2、处理机调度
处理机调度的概念
处理机调度是对处理机进行分配
,就是从就绪队列中,按照一定的算法(公平、高效)选择一个进程并将处理机分配给它运行,以实现进程并发地执行
处理机调度
是多道程序操作系统的基础,它是操作系统设计的核心问题
三级调度:
作业调度
:也称高级调度
,按一定的原则从外存上处于处于后备状态的作业中挑选一个(或多个)
作业,给它(们)分配内存、输入/输出设备等必要的资源,并建立相应的进程
,以使它(们)获得竞争处理机的权利
。是内存和外存之间
的调度。对于每个作业只调入一次,调出一次中级调度
:为了提高内存利用率和系统吞吐量
而引入的。将暂时不能运行的进程,调至外存(挂起状态
);在它们已具备运行条件且内存又稍有空闲时,由中级调度再将外存上已具备运行条件的就绪进程调入内存(就绪状态
)进程调度
:也称低级调度
,按照某种方法和策略从就绪队列中选取一个进程,将处理机分配给它。
多道批处理系统中大多配有作业调度
,而其他系统中通常不需要配置作业调度
进程调度是操作系统中最基本的一种调度
,在一般操作系统中都必须配置进程调度
调度的时机、切换与过程
进程调度程序
和进程切换程序
是操作系统的内核程序
当请求调度的事件发生后,才可能会运行进程调度程序
,当调度
了新的就绪进程后,才会去进行进程间的切换
理论上上述三件事情应该顺序执行
,但在实际设计中,在操作系统内核程序运行时,如果发生了引起进程调度的因素,并不一定能够马上进行调度与切换
现代操作系统中,不能马上进行
进程的调度与切换的情况:
- 1、在
处理中断
的过程中 - 2、进程在操作系统内核程序
临界区
中时 - 3、其他需要完全屏蔽中断的
原子操作过程中
在上述过程中发生了引起调度的事件,并不能马上进行调度和切换,应置系统的请求调度标志
,直到上述过程结束后才进行相应的调度与切换
应该马上进行
进程调度与切换的情况:
- 1、当发生引起调度的事件,且当前进程无法继续运行下去时(剥夺式的)
- 2、当中断处理结束或自陷处理结束后,返回
被中断进程的用户态程序
执行现场前(非剥夺式的)
进程切换往往在调度完成后立刻发生,它要求保存原进程当前切换点的现场信息
,恢复被调度进程的现场信息。现场切换时,操作系统内核将原进程的现场信息
推入到它自己的内核堆栈
来保存它们,并更新堆栈指针。在内核完成从新进程的内核栈中装入新进程的现场信息
、更新当前运行进程空间指针
、重设PC寄存器等相关工作后,开始运行新的进程
进程调度方式
进程调度方式
是指当某一个进程正在处理机上执行时,若有优先权更高的进程进入就绪队列,此时应如何分配处理机
两种进程调度方式:
非剥夺调度方式
:实现简单、系统开销小,适用于大多数的批处理系统,但它不能用于分时系统
和大多数的实时系统
剥夺调度方式
:可以提高系统的吞吐率和响应效率
。剥夺遵循的原则:优先权
、短进程优先
和时间片原则
等
调度算法的评价准则
- CPU利用率
- 系统吞吐量:单位时间内CPU完成作业的数量
周转时间
:从作业提交
到作业完成
所经历的时间等待时间
:进程处于等待处理机状态时间之和响应时间
:从用户提交请求到系统首次产生响应
所用的时间
设计调度程序
的时候,一方面要满足特定系统用户的要求;另一方面要考虑系统整体效率;同时还要考虑调度算法的开销
典型的调度算法
先来先服务(FCFS)调度算法
既可用于作业调度
也可以用于进程调度
属于不可剥夺算法
该算法的特点是:
- 算法简单,但效率低
- 对长作业比较有利,但对短作业不利(相对SJF和高响应比)
- 有利于
CPU繁忙型
作业,而不利于I/O繁忙型
作业
短作业优先(SJF)调度算法
不可剥夺算法
既可用于作业调度
,也可以用于进程调度
特点:
- 对长作业不利,长作业容易出现
饥饿现象
(饥饿现象是调度策略问题
,死锁是系统环形等待
) - 未考虑作业的紧迫程度
- 估计时间并不准确
- 该算法的
平均等待时间
和平均周转时间
最少
优先级调度算法
既可用于作业调度
,也可用于进程调度
非剥夺式优先级调度算法
和剥夺式优先级调度算法
根据进程创建后
其优先级是否可以改变,进程优先级可以分为静态优先级
和动态优先级
。它们各自有自己的确定依据
高响应比优先调度算法
该算法主要用于作业调度
,其是对FCFS
和SJF
的一种综合平衡
时间片轮转调度算法
该算法主要用于分时系统
剥夺式算法
时间片的大小
对系统性能的影响很大
时间片的长短通常由以下因素确定:系统的响应时间
、就绪队列中的进程数目
和系统的处理能力
多级反馈队列调度算法(集合了前几种算法的优点)
多级反馈队列调度算法
是时间片轮转调度算法
和优先级调度算法
的综合和发展。通过动态调整进程的优先级
和时间片大小
,多级反馈队列调度算法可以兼顾多方面的系统目标
优点:
- 终端型作业用户:短作业优先
- 短批处理作业用户:周转时间较短
- 长批处理作业用户:经过前面几个队列得到部分执行,不会长期得不到处理
相关试题
当进程处于临界区
时,说明进程正在占用处理机
,只要不破坏临界资源的使用规则,是不会影响处理机的调度的,即在不破坏临界资源使用规则的前提下,可以进行处理机的调度
甘特图的画法不只一种,要会根据题目选择合适的画法
在涉及到作业调度的时候一般不考虑中级调度
要注意理解关于中断时间计算
的试题
使用最高相应比优先调度算法
来进行进程调度的时候,每次有进程完成后,都要进行一次响应比的比较
,以选出来占用处理机的进程
3、进程同步
进程同步的基本概念
在多道程序环境下,进程是并发执行的,不同进程之间存在着不同的相互制约关系
。为了协调
进程之间的相互制约关系,引入了进程同步的概念
同步就是协调
多个进程之间的制约关系
一次(一段时间内)仅允许一个进程使用的资源称为临界资源
临界资源不仅仅指设备
,还包括变量和数据
等
对临界资源的访问,必须互斥地进行
,在每个进程中,访问临界资源的那段代码
称为临界区
(所以只有在临界区中才可以访问临界资源)
为了保证临界资源的正确使用,可以把临界资源的访问过程分成四个部分
:
进入区
:检查是否可进入
临界区,如果可进入,应设置正在访问临界区的标志
临界区
:退出区
:清除正在访问临界区的标志
剩余区
:代码中的其余部分
同步
,即直接制约关系
,多个进程要在某些位置上协调它们的工作次序
而等待、传递信息所产生的制约关系
进程间的直接制约关系
就是源于它们之间的相互合作
互斥
,即间接制约关系
,因使用临界资源而产生的制约关系
为禁止两个进程同时进入临界区,同步机制(这里的同步指的是协调
,而不是直接制约关系)应遵循以下准则:
空闲让进
:忙则等待
:有限等待
:让权等待
:
实现临界区互斥的基本方法
软件实现方法
软件方法:通过在进入区
设置和检查一些标志来标明是否有进程在临界区,如果已有进程在临界区,则在进入区通过循环检查的方式
进行等待,进程离开临界区后则在退出区修改标志
相关的算法有:
- 1、
单标志法
:通过设置一个公用整型变量turn,用于指示被允许进入临界区的进程编号。该算法违背空闲让进
的准则 - 2、
双标志法先检查
:通过设置一个数据flag[i]
,来表示Pi进程
是否进入临界区。该算法会违背忙则等待
的准则 - 3、
双标志法后检查
:该算法可能会出现饥饿现象 - 4、
Peterson's Algorithm
:本算法是算法一和算法三的结合。利用flag
解决临界资源的互斥访问,而利用turn
解决饥饿现象
硬件实现方法
通过硬件支持实现临界段问题的方法称为低级方法
或元方法
CPU只在发生中断时引起进程切换
(即CPU的切换是通过中断机制实现的)
当一个进程正在使用处理机执行它的临界区代码
时,要防止其他进程再进入其临界区访问的最简单方法是禁止一切中断发生,称之为屏蔽中断
或关中断
TestAndSet指令
:读出指定标志后把该标志设置为真。为每个临界资源设置一个共享布尔变量lock
,表示资源的两种状态,true表示正在被占用
Swap指令
:为每个资源设置一个共享布尔变量lock
,在每个进程中再设置一个局部布尔变量key
,用于与lock
交换信息
以上对TestAndSet
和Swap指令
的描述仅仅是功能实现,并非软件实现定义,事实上它们是由硬件逻辑直接实现的
,不会被中断(原子操作)
通过硬件实现的方法有:
- 1、
中断屏蔽方法
:该方法限制了处理机交替执行程序的能力,因此执行的效率将会明显降低 - 2、
硬件指令方法
:TestAndSet指令和Swap指令
硬件方法的优点
:适用于任意数目的进程,不管是单处理机还是多处理机;简单、容易验证其正确性。可以支持进程内有多个临界区
,只需要为每个临界区设立一个布尔变量
硬件方法的缺点
:进程等待进入临界区时要耗费处理机时间,不能实现让权等待(即忙等现象)
。从等待进程中随机选择一个进入临界区,有的进程可能一直选不上,从而导致饥饿现象
以上的代码实现与我们平时在编辑器上写的代码意义不同,以上的代码实现是为了表述进程实现同步和互斥的过程,并不是说计算机内部实现同步互斥就是这些代码(可以理解为伪代码)
信号量
信号量机制是一种功能较强的机制,可以来解决互斥与同步的问题
,它只能被两个标准的原语wait(S)
和signal(S)
来访问,一般简记为P和V操作
原语是指完成某种功能且不被分割不被中断执行
的操作序列,通常可由硬件来实现完成不被分割执行的功能(也可通过软件方法来实现)
信号量的类型:
整型信号量
:一个表示资源数目的整型量。该机制并未遵循让权等待
的准则,而是使进程处于忙等的状态
- 记录型信号量:该机制遵循
让权等待
的准则
信号量可以实现的功能:
- 利用信号量实现
同步
:设置一个公共信号量。如果某个行为要用到某种资源,那么在那个行为面前P
那种资源一下;如果某个行为会提供某种资源,就在那个行为后面V
那种资源一下 - 利用信号量实现进程
互斥
:互斥的实现是不同进程对同一信号量进程P、V操作。P、V操作要紧紧夹着使用互斥资源的那个行为
,中间不能有其他冗余代码 - 利用信号量实现
前驱关系
:
分析进程同步和互斥问题的方法步骤:p80
管程
系统中的各种硬件资源和软件资源
,均可用数据结构抽象地描述其资源特性
,即用少量信息和对资源所执行的操作来表征
该资源,而忽略了它们的内部结构和实现细节
管程:由一组数据以及定义在这组数据之上的对这组数据的操作组成的软件模块
。这组操作能够初始化并改变
管程中的数据和同步进程
管程的组成:
- 1、局部于管程的共享结构数据说明
- 2、对该数据结构进行操作的一组
过程
- 3、对局部于管程的共享数据
设置初始值的语句
管程的基本特征:
- 1、局部于管程的数据只能被局部于管程内的过程所访问
- 2、一个进程只有通过调用管程内的过程才能进入管程访问共享数据
- 3、每次仅允许一个进程在管程内执行某个内部过程
由于管程是一个语言成分
,所以管程的互斥部分完全由编译程序在编译时自动添加,无需程序员关注(对程序员透明)
,而且保证正确
经典同步问题
注意分析问题的方法和步骤
生产者-消费者问题
semaphore mutex = 1; //临界区互斥信号量
semaphore empty = n;
semaphore full = 0;
producer(){
while(1){
produce an item in nextp;
P(empty);
P(mutex);
add nextp to buffer;
V(mutex);
V(full);
}
}
consumer(){
while(1){
P(full);
P(mutex);
remove an item from buffer;
V(mutex);
V(empty);
consume the item;
}
}
对empty和full信号量
的P操作
必须放在对mutex的P操作
之前,不过释放信号量时的顺序没所谓(建议坚持一种写法)
读者-写者问题
//读进程优先的读者写者问题
int count = 0; //用于记录当前的读者数量
semaphore mutex = 1; // 用于实现更新count时的互斥
semaphore rw = 1;
writer(){
while(1){
P(rw);
writing;
V(rw);
}
}
reader(){
while(1){
P(mutex);
if(count == 0)
P(rw);
count++;
V(mutex);
reading;
P(mutex);
count--;
if(count == 0)
V(rw);
V(mutex);
}
}
//写者优先的读者写者问题(优先是相对的,称为读写公平法)
int count = 0;
semaphore mutex = 1;
semaphore rw = 1;
semaphore w = 1;
writer(){
while(1){
P(w);
P(rw);
writing;
V(rw);
V(w);
}
}
reader(){
while(1){
P(w);
P(mutex);
if(count == 0)
P(rw);
count++;
V(mutex);
V(w);
reading;
P(mutex);
count--;
if(count == 0)
V(rw);
V(mutex);
}
}
读者写者问题有一个关键特征,就是有一个互斥访问的计数器count
,所以当遇到一个不太好解决的同步互斥问题的时候,尝试使用一下互斥访问的计算器count
哲学家进餐问题
semaphore chopstick[5] = {1, 1, 1, 1, 1};
semaphore mutex = 1; //设置取筷子的信号量
Pi(){
do{
P(mutex);
P(chopstick[i]);
P(chopstick[(i + 1) % 5]);
V(mutex);
eat;
V(chopstick[i]);
V(chopstick[(i + 1) % 5]);
think;
}while(1)
}
还可以使用AND型信号量机制
来解决哲学家进餐问题
哲学家进餐问题
的解决思想和贪心算法
截然相反。贪心算法强调争取眼前认为最好的
,而不会考虑后续会有什么后果;哲学家进餐问题不仅考虑眼前的一步,而且考虑下一步
,只有一次能拿起两只筷子才做决定,这样可以避免死锁问题
吸烟者问题(不太重要)
相关试题
进程执行的前驱关系
实质上是指进程的同步关系
P、V操作是一种低级的进程通信原语
,它是不能被中断的
不能被任何进程修改的代码
就是可重入代码
(也叫纯代码),即允许多个进程同时访问的代码
管程的signal操作
与信号量机制中的V操作不同。管程中的signal操作是针对某个条件变量的,如果不存在因该条件而阻塞的进程,则signal不会产生任何影响
4、死锁
死锁
是指多个进程
因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进
进程陷入死锁状态
死锁产生的原因:
- 1、
系统资源的竞争
:只有对不可剥夺资源
的竞争才可能产生死锁,对可剥夺资源的竞争是不会引起死锁的 - 2、
进程推进顺序非法
:
死锁产生的必要条件
(产生死锁必须同时满足以下四个条件
,只要其中任一条件不成立,死锁就不会发生):
- 1、
互斥条件
:进程要求对所分配的资源进行排他性控制
,即在一段时间内某资源仅为一个进程所占有 - 2、
不剥夺条件
: - 3、
请求和保持条件
: - 4、
循环等待条件
:存在一种进程资源的循环等待链
,链中的每一个进程已获得的资源同时被链中下一个进程所请求
资源分配图
含圈而系统又不一定有死锁的原因是同类资源数大于1
。然若系统中每类资源都只有一个资源,则资源分配图含圈
就变成了系统出现死锁的充分必要条件
死锁的处理策略
- 1、
预防死锁
:设置某些限制条件
,破坏产生死锁的四个必要条件中的一个或几个,以防止发生死锁 - 2、
避免死锁
:在资源的动态分配过程中,用某种方法防止系统进入不安全状态
,从而避免死锁 - 3、
死锁的检测及解除
:无需采取任何限制性措施,允许进程在运行过程中发生死锁。通过系统的检测机构及时地检测
出死锁的发生,然后采取某种措施解除
死锁
预防死锁
和避免死锁
都属于事先预防策略
预防死锁的限制条件比较严格
,实现起来较为简单,但往往导致系统的效率低
,资源利用率低;避免死锁的限制条件相对宽松
,资源分配后需要通过算法来判断是否进入不安全状态
,实现起来较为复杂
死锁预防
破坏互斥条件
:因为有的系统资源只能互斥使用,所以该方法不太可行
破坏不剥夺条件
:该策略实现起来比较复杂。释放已获得的资源会造成前一阶段工作的失效
,反复的申请和释放资源会增加系统开销
,降低系统吞吐量
。这种方法常用于状态易于保存和恢复的资源
破坏请求和保持条件
:采用预先静态分配方法,即进程在运行前一次申请完它所需要的全部资源,在它的资源未满足前,不把它投入运行。该方法实现简单
,但系统资源被严重浪费
破坏循环等待条件
:可采用顺序资源分配法
。该方法会限制新类型设备的增加、造成资源浪费、为用户的编程带来麻烦
死锁避免
死锁避免:在资源分配过程中,防止系统进入不安全状态
,以避免发生死锁。这种方法所施加的限制条件较弱
,可以获得较好的系统性能
该方法允许进程动态地申请
资源,但系统在进行资源分配
之前,应先计算此次资源分配的安全性
。若此次分配不会导致系统进入不安全状态,则将资源分配给进程;否则,让进程等待
安全状态:系统能按某种进程推进顺序
,为每个进程分配其所需资源,直至满足每个进程对资源的最大需求,使每个进程都可顺序地完成。此时称该中进程推进顺序为安全序列
。如果系统无法找到一个安全序列,则称系统处于不安全状态
并非所有的
不安全状态都是死锁状态,但当系统进入不安全状态后,便可能
进入死锁状态;反之,只要系统处于安全状态,系统便可以避免进入死锁状态
银行家算法
涉及的数据结构:
可利用资源矢量Available
:一个数组,某个元素值表示一类可用的资源的数目最大需求矩阵Max
:最大需求分配矩阵Allocation
:已分配的需求矩阵Need
:还需要的
安全性算法
是银行家算法的核心部分
银行家算法的一般步骤:
- 1、一般会有
某个进程发起资源请求
,资源请求向量为 ,其为数组
- 2、判断
是否成立,其中每个元素都必须成立,若成立,下一步;否则
出错
- 3、判断
是否成立,其中每个元素都必须成立,若成立,下一步;否则,该
进程等待
- 4、如果2和3都成立,则
尝试着
把资源分配给该进程,并更新Available、Allocation、Need这三个矩阵
- 5、系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。
若安全
,才正式将资源分配给进程Pi
,以完成本次分配;否则
,将本次的试探分配作废,恢复原来的资源分配状态,让进程Pi等待
安全性算法
的具体执行步骤p122
死锁检测和解除
资源分配图
:从进程到资源的有向边叫请求边
,表示该进程申请一个单位的该类资源;从资源到进程的边叫分配边
,表示该类资源已经有一个资源被分配给了该进程
通过将资源分配图简化
的方法来检测系统状态S
是否为死锁状态。具体简化步骤见p123
S为死锁的条件是当且仅当S状态的资源分配图是不可完全简化
的,该条件为死锁定理
死锁解除的主要方法:
资源剥夺法
:撤销进程法
:进程回退法
: