什么是死锁
死锁是指不同进程或线程在申请系统资源时陷入僵局,形成你在我等我释放资源我在等你释放资源的状态。
构成死锁的原因
构成死锁有以下两个原因:
(1) 进程在申请资源时,若资源不足,则进程会进入阻塞状态,直到有足够的资源,此时进程会被唤醒;在进程阻塞等待期间,进程不会释放已占有的资源。
(2) 多个进程申请资源的顺序不正确,导致形成你等我我等你的僵局,形成死锁。
死锁的四个必要条件
(1) 互斥条件。单个资源一次只能由一个进程使用。
(2) 请求保持条件。进程在阻塞状态等待系统资源时,不会释放自己占用的资源。
(3) 不剥夺条件。其他进程不能强制剥夺其他进程的资源,资源只能由进程自身释放。
(4) 环路等待条件。进程在等待的资源与资源被进程占用构成一个环,陷入你等我我等你的僵局。
死锁的解决方法
预防死锁
预防死锁旨在消除死锁的四个必要条件的其中一个。互斥条件不可破坏。破坏请求保持条件:进程在等待资源一段时间未果,解除自身任务,释放占用资源;系统一次性分配进程所有需要的资源,如果系统不能一次将所有资源分配给进程则不分配任何资源给进程。破坏不剥夺条件:优先级高的进程在极端情况下可以强制占用优先级低的进程的资源。破坏环路等待条件:对资源编号,进程申请资源只能由编号低往编号高申请。
避免死锁
预防死锁的措施虽然有效,但效率不高。避免死锁主要用到银行家算法。这个算法定义了几个数组:resource[i]表示资源$i$的总量;availble[i]表示资源$i$的剩余量;allocate[i,j]表示资源$i$分配给进程$j$的数量;claim[i,j]表示进程$j$对资源$i$的最大需求。银行家算法在每次分配资源时,会检查这次分配资源后,系统会不会陷入死锁。判断是否陷入死锁的标准是否存在一个进程序列使得所有第$i$个进程所需要的最大资源量小于等于系统剩余资源量加上前$i-1$个进程的占用资源量。如果存在这么一个进程序列,则说明当前状态是安全的,可以分配资源;否则不准分配资源。
消除死锁
消除死锁是一种事后补救措施,是在发现死锁后将死锁解除。主要是通过将部分进程的任务解除,将这些解除任务的进程的资源发送给陷入死锁的进程;或者将死锁中部分进程的任务解除,消除死锁。解除哪些进程的任务取决于进程的优先级与系统的整体工作效率。