线程死锁
线程死锁是指两个或两个以上的进程在执行过程中,双方都在等待对方停止运行,以获取系统资源,但是没有一方提前退出时,就称为死锁,若无外部处理,将无限等待下去。
死锁问题不仅在计算机系统中存在,在我们日常生活中它也广泛存在。
例如:过窄桥。把桥喻作资源,把汽车喻为进程。窄桥无法两辆汽车并行。如果A、B两辆汽车在桥的两端相向行驶,当A、B在桥上相遇时(也就是A、B都拥有了桥的一部分资源),想要过桥,就必须要有一方让路,但谁也不让路,就造成了无休止地等待下去,这种现象就是死锁。
产生死锁的原因:
1、系统资源不足(系统资源的数目不足以满足全部进程的需要时,就会资源的竞争而发生死锁现象)
2、进程(线程)推进的顺序不恰当。(进程运行推进顺序与速度不同,也可能产生死锁)
3、竞争资源发生死锁现象
产生死锁的四个必要条件:
1、互斥条件:一个资源每次只能被一个进程使用。
2、占有且等待:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
3、不可强行占有:进程已获得的资源,在末使用完之前,不能强行剥夺。
4、循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
只要系统发生死锁,以上这些条件必然成立。而只要上述条件之一不满足,就不会发生死锁。
死锁处理的基本方法:
1、预防死锁:通过设置一些限制条件,去破坏产生死锁的必要条件(采用资源预分配策略,打破占有且申请条件等等)
2、避免死锁:在资源分配过程中,使用某种方法避免系统进入不安全的状态,从而避免发生死锁(有序的资源分配,银行家算法)
3、检测死锁:允许死锁的发生,但是通过系统的检测之后,采取一些措施,将死锁清除掉(检测当前正在请求的锁是否已经被其它线程持有,再检查自己持有的锁是否正被其中任何一个线程请求)
4、解除死锁:该方法与检测死锁配合使用(剥夺资源、撤销进程)
最简单的消除死锁的办法是重启系统。更好的办法是终止一个进程的运行。