1 死锁概述
死锁主要是由于资源使用不当引发的。OS中存在很多不同类型的软硬件资源,而可以引发死锁的资源
主要是需要互斥访问的、不可被抢占的资源,即临界资源。下面先来简单了解下资源的分类。
资源分类
按照资源是否可重复使用划分,可以分为可重用资源与消耗性资源;按照资源在被使用过程中能否被抢
占划分,可以分为可抢占资源与不可抢占资源。
可重用资源
可重用资源是一种可供用户重复使用的资源。它具有如下性质:
每个可重用资源单元只能分配给一个进程使用,不允许多个进程共享
进程在使用可重用资源时,需按照“请求–>使用–>释放”顺序。若请求失败,则进行阻塞或忙等
系统中可重用资源单元数目是固定的,进程运行期间不能创建也不能销毁
计算机系统中大部分资源属于可重用资源。
消耗性资源
消耗性资源又称为临时性资源,是在进程运行期间由进程动态的创建与消耗的。它具有如下性质:
消耗性资源的单元数目在进程运行期间是不断变化的
进程在运行过程中可不断地创建消耗性资源单元
进程在运行过程中可不断申请消耗该资源单元,消耗完毕后无需再返回资源
典型的消耗性资源是用于进程通信的消息。
不可抢占资源
某资源被分配给某进程使用过程中,在该进程未主动出让的情况下,该资源使用权被其它进程剥夺。那
么该类型资源称为可抢占资源,例如,处理机、内存等属于可抢占资源。可抢占资源不会引发死锁。
死锁的定义
若一组进程中的每个进程都在等待“仅由该组进程中的其它进程才能引发的”事件,则该组进程是死锁
的,即Deadlock。
引发死锁的原因
为什么会出现死锁呢?主要有三个原因:
竞争不可抢占资源
系统中所拥有的不可抢占资源数量若不能满足多个进程运行的需要,使得进程在运行过程中会因争夺
资源而陷入僵局。
竞争可消耗资源
进程对于可消耗资源的创建与消耗过程设计不当,会使得进程的运行陷入等待的僵局。
进程推进不当
除了对资源的竞争可能会引发死锁外,进程在运行中对资源的申请与释放顺序不当也是引发死锁的一个
重要因素。
产生死锁的必要条件
一组进程在执行过程中能够发生死锁,其一定是同时具备了以下四个必要条件。
- 互斥条件:一定存在对临界资源的竞争
- 请求与保持条件:一个进程因请求资源而阻塞时,对已经获得的资源保持不放
- 不剥夺条件:进程对于已获得的资源,在未主动出让其使用权时不能强行剥夺
- 循环等待条件:这组进程间形成了一种头尾相接的循环等待临界资源的关系
若要使进程在运行过程中不产生死锁,只需要打破这四个必要条件中任意一个即可。不过,一旦发生
了死锁,系统是无法自行解开的,只能通过外力干预解除。