内容提要
- 产生死锁与饥饿的原因;
- 解决死锁的方法
- 死锁/同步的经典问题:哲学家进餐问题
定义
- 一组进程因为竞争系统资源或是进程之间通信不当(原因),而被永久阻塞(定义),就是死锁;
- 目前为止还没有一个有效的方法能解决死锁,只能尽量规避;
- 大多情况下通常涉及到两个或以上的进程竞争资源而产生的冲突,但是也存在单进程死锁;
- 如同我们的十字路口,在一条道路上,十字路口是来往车辆高度竞争的关键点,如果没有恰当的控制管理,没有红绿灯,那么很有可能每个路口都会堵车,没有人前来疏导,那么很有可能就一直堵死在这里;
举例
两个进程P,Q,两个进程的执行如下:
Process P:Get A ->… -> Get B -> … -> Release A -> … -> Relase B…
Process Q:Get B ->… -> Get A -> … -> Release B -> … -> Relase A…
这两个进程单独执行都没有问题,但是如果并发执行,就会有问题了。
可以看到,1,2,4,6执行线都是没有问题的,但是3,4执行线是会造成死锁的;
另外,死锁与进程的推进顺序无关,我们无法判断系统中具体在什么时间中断哪一个进程;但是,如果我们修改了进程P的代码,则不会产生死锁
Process P … -> Get A -> … -> Relase A -> … -> Get B -> … -> Release B -> …
此时可以看到 3,4执行线的通道就打开了;
但是,我们怎么可能这么去写代码呢,我们一般不会去用完了然后马上释放,这对于用户来说是很不好的体验;