死锁的四个必要条件:
- 互斥条件:进程对所分配到的资源进行排他性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其他进程请求资源,则请求者只能等待,直至占有资源的进程用毕释放。
- 请求和保持条件:进程已经保持至少一个资源,但又提出了新的资源请求,而该资源已被其他进程占有,此时请求进程阻塞,但对自己已获得的资源保持不放。
- 不剥夺条件:进程已获得的资源,在未使用完之前,不能强行剥夺。
- 循环等待条件:存在一个等待序列 {P0, P1, ..., Pn},其中 P0 正在等待 P1 占用的资源;P1 正在等待 P2 占用的资源,……,Pn 正在等待已经被 P0 占用的资源。
避免死锁的方法:
- 鸽巢算法:避免死锁最具代表性的算法是鸽巢算法。它通过预测分配资源可能导致死锁的情况,防止死锁的发生。
- 银行家算法:这是一种用于避免死锁并确保系统稳定运作的算法。该算法在为进程分配资源之前,会判断进行资源分配后是否安全,即是否可能导致系统出现死锁。如果判断可能发生死锁,那么就拒绝进行资源分配。
- 资源有序分配法:系统给每类资源赋予一个编号,每一个进程按编号递增的顺序请求资源,释放资源则可以任意顺序。这样就破坏了循环等待条件,因此可避免死锁。
- 尽量避免使用不可抢占调度算法:使用可抢占的调度算法可以让已经占用资源的进程,在必要时释放资源,从而避免死锁。
实际上并没有万能的解决死锁的方法,比如操作系统内核中断等问题会让原先的死锁算法失效。需要根据实际情况选择合适的策略。