目录
什么是死锁
- 死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程
系统模型
进程在使用资源之前必须先申请资源,在使用资源之后要释放资源。进程所申请的资源数量不能超过系统所有资源的总量。
在正常操作模式下,进程只能按如下顺序使用资源:
①申请:如果申请不能立即被允许,那么申请进程必须等待,直到它获得该资源为止。
②使用:进程对资源进行操作。
③释放:进程释放资源
- 资源的申请与释放是系统调用来操作的。
- 其他资源的申请与释放可以通过信号量的wait与signal操作或通过互斥锁的获取与释放来完成。
- 因此对于进程和线程的每次使用,操作系统会检查以确保使用进程已经申请并获得了资源。
- 系统表记录了每个资源是否空闲或已被分配,分配给了哪个进程。如果进程正在申请的资源正在被其他进程所使用,那么该进程会增加到该资源的等待队列。
- 当一组进程的每个进程都在等待一个事件,而这个事件只能由这一组进程的其中一个进程所引起,那么这组进程就处于死锁状态。
- 死锁也可设计不同的资源类型。多线程可能因为竞争共享资源而容易产生死锁。
死锁特征 210P
当出现死锁时,进程永远不能完成,并且系统资源被阻碍使用,阻止了其他作业开始执行。
出现死锁的必要条件
如果在一个系统中下面四个条件同时满足,那么会引起死锁。
- 互斥(mutual exclusion):至少有一个资源必须处于非共享模式,即一次只能有一个进程使用,如果另一个进程申请该资源,那么申请进程必须等到该资源被释放为止。
- 占有并等待(hold and wait):一个进程必须占有至少一个资源,并等待另一资源,而该资源被其他进程所占有。
- 非抢占(no preemption):该资源不能被抢占,即资源只能在进程完成任务后自动释放。
- 循环等待:有两个或者两个以上的进程形成一组循环,该循环中的每个进程都在等待下一个进程所占有的资源。
4个条件必须同时满足才会出现死锁,循环等待条件意味着占有并等待条件,这样四个条件并不完全独立。
资源分配图 212P
死锁问题可用称为系统资源分配图的有向图进行更为精确地描述。
这种图由一个节点集合V和一个边集合E组成。节点集合V可以分成两种类型的节点:
- P={P1,P2,…,Pn}(系统活动进程的集合)
- R={R1,R2,…,Rn}(系统所有资源的集合)
- Pi -》 Rj 表示进程 Pi 已经申请了资源类型为 Rj 的一个实例,并在等待该资源。称为申请边
- Rj -》Pi 表示资源类型 Rj 已经分配给进程 Pi,称为分配边
如一个分配图的例子如下: