死锁
什么是死锁:在并发环境下,各进程因竞争资源而造成的一种互相等待对方手里的资源,导致各进程都阻塞,都无法向前推进的现象,就是“死锁”。发生死锁后若无外力干涉,这些进程都将无法向前推进
进程死锁、饥饿、死循环的区别:
死锁:各进程互相等待对方手里的资源,导致各进程都阻塞,无法向前推进的现象
饥饿:由于长期得不到想要的资源,某进程无法向前推进的现象
死循环:某进程执行过程中一直跳不出某个循环的现象。有时是因为程序逻辑bug导致的,有时是程序员故意设计的
死锁产生的四个必要条件:(有一个条件不成立,则不会产生死锁)
- 互斥条件:一个资源一次只能被一个进程使用
- 请求与保持条件:一个进程因请求资源而阻塞时,对已获得资源保持不放
- 不剥夺条件:进程获得的资源,在未完全使用完之前,不能强行剥夺
- 循环等待条件:若干进程之间形成一种头尾相接的环形等待资源关系,发生死锁时一定有循环等待,但是发生循环等待时未必死锁
死锁的处理策略:
- 预防死锁(静态策略,不允许死锁发生):破坏死锁产生的四个必要条件中的一个或几个
- 避免死锁(动态策略,不允许死锁发生):用某种方法防止系统进入不安全状态,从而避免死锁(银行家算法)
- 死锁的检测和解除:允许死锁的发生,不过操作系统会负责检测出死锁的发生,然后采取某种措施解除死锁
- 忽略该问题,例如鸵鸟算法,该算法可以应用在极少发生死锁的的情况下