目录
一、定义
二、死锁、饥饿和死循环的区别
三、死锁的必要条件
四、死锁的处理策略
五、总结
一、定义
死锁是指两个或多个进程等待对方释放自己所持有的资源,导致所有进程都被阻塞,无法继续执行。这种情况可能会导致系统瘫痪,需要通过手动干预才能解除死锁。
通常,死锁发生在以下场景中:
- 多个进程同时占用共享资源,例如内存、文件等;
- 进程按照特定顺序申请资源,但顺序不当,可能导致资源被占用而无法释放;
- 进程之间存在相互依赖,例如一个进程需要另一个进程所持有的资源才能继续执行,而另一个进程同样需要该进程所持有的资源才能继续执行。
二、死锁、饥饿和死循环的区别
死锁、饥饿和死循环是计算机系统中常见的问题,它们的区别如下:
-
死锁:是多个进程或线程因竞争资源而陷入的僵局,即互相等待对方释放所持有的资源,导致所有进程或线程都无法继续执行。死锁是一种不可避免的系统问题,需要通过算法等手段来避免或解决。
-
饥饿:是指一个或多个进程长时间得不到需要的资源,导致无法正常执行。这种情况通常是由于资源分配不合理或调度算法不当所致。饥饿虽然不会导致系统瘫痪,但会影响系统的稳定性和性能。
-
死循环:是指进程或线程在执行中出现无限循环的情况,导致无法执行其他的代码。死循环通常是由于编码错误或算法问题所致。尽管死循环不会导致系统崩溃,但会浪费系统的资源,降低系统的响应速度。
三、死锁的必要条件
死锁的必要条件有四个,称为“死锁的铁四律”:
- 互斥条件:一个资源每次只能被一个进程使用;
- 请求和保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放;
- 不剥夺条件:进程已获得的资源,在未使用完之前,不能被其他进程强行抢占,只能由进程自己释放;
- 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源的关系。
只有当这四个条件同时满足时,才会产生死锁。
产生死锁的条件是,当多个进程在占用某些资源的同时,它们又同时请求另外一些资源,而这些资源被其它进程所占用,从而被阻塞。这样,所有进程都在等待其它进程释放它们所需要的资源,形成了一个死循环,被称为死锁。
注意:发生死锁时一定有循环等待,但是循环等待不一定会产生死锁。
四、死锁的处理策略
- 预防死锁。破坏死锁产生的四个必要条件中的一个或几个。
- 避免死锁。用某种方法防止系统进入不安全状态,从而避免死锁(银行家算法)
- 死锁的检测和解除。允许死锁的发生,不过操作系统会负责检测出死锁的发生,然后采取某种措施解除死锁。