-
死锁的基本概念
是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。
-
死锁的原因
- 系统资源不足(对不可剥夺资源的竞争)
- 进程推进顺序不当(P1拥有A申请B,P2拥有B申请A)
-
产生死锁的必要条件
- 互斥条件——在一段时间内某资源只由一个进程占用
- 请求和保持条件——进程请求资源,而资源已被占有,则请求进程阻塞,但是请求进程保持自己已有资源不放
- 不可剥夺条件——指进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放
- 环路等待条件——进程A所需资源在进程B中,进程B所需资源在进程A中。形成一个进程资源环形链
-
处理死锁的方法
-
预防死锁
通过设置某些限制条件,去破坏产生死锁的四个必要条件中的一个或者几个,来预防发生死锁。易于实现,但是由于所施加的限制条件往往太严格,可能会导致系统资源利用率和系统吞吐量降低。
-
摒弃请求保持条件:系统要求所有进程一次性申请整个运行过程所需要的全部资源,不再反复请求资源。
缺点:但是这样资源严重浪费,并且资源独占,进程延迟运行。
-
摒弃不剥夺条件:进程资源不能满足时,释放自己已有资源。即进程已拥有资源在运行过程中可以被剥夺。
缺点:实现难度大,可能造成进程已完成的工作失效。
-
摒弃环路等待条件:资源按照一定的顺序分配,在申请前面的资源的同时必须释放进程拥有的后面的资源。
缺点:严格限制资源顺序性,不允许添加新资源。限制用户自主编程。在使用资源顺序与系统规定顺序不一致时,资源利用率很低。
-
-
避免死锁
该方法同样是属于事先预防的策略,但它并不须事先采取各种限制措施去破坏产生死锁的的四个必要条件,而是在资源的动态分配过程中,用某种方法去防止系统进入不安全状态,从而避免发生死锁。
避免死锁的算法——银行家算法:https://www.bilibili.com/video/BV1ht411W7uB?p=2
-
-
检测死锁
此方法允许系统在运行过程中发生死锁。但可通过系统所设置的检测机构,及时地检测出死锁的发生,并精确地确定与死锁有关的进程和资源,然后采取适当措施,从系统中将已发生的死锁清除掉。
通过化简资源分配图来检验当前状态是否为死锁状态
-
解除死锁
当检测到系统中已发生死锁时,须将进程从死锁状态中解脱出来。常用的实施方法是撤销或挂起一些进程,以便回收一些资源,再将这些资源分配给已处于阻塞状态的进程,使之转为就绪状态,以继续运行。
- 剥夺资源,从其他进程那里剥夺死锁进程所需资源
- 撤销资源
- 撤销全部死锁进程的资源
- 分批撤销
撤销哪些资源:- 目前为止消耗处理及时间最小
- 目前为止产生的输出最少
- 预计剩余时间最长
- 目前为止分配的资源总量最少
- 优先级最低