1、死锁是什么?
死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法向前推进。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。
2、如何避免死锁?
1、预防死锁
1、资源按序申请:系统给每类资源赋予一个唯一的编号,进程在申请资源时必须按照编号递增的顺序进行,否则系统不予分配。这种方法破坏了产生死锁的“循环等待”条件。
2、资源分配预检测:在资源分配之前预先判断这次分配是否会导致系统进入不安全状态,如果会,则不予分配,直到等该进程所请求的资源都满足时才一次性全部分配给该进程。
2、避免死锁
银行家算法:用于避免死锁的一种著名算法,它允许进程动态地申请资源,系统在每次分配资源之前,先计算此次分配资源的安全性,若此次分配不会导致系统进入不安全状态,则才予以分配。
3、检测与解除死锁
1、当系统发生死锁时,可以通过系统设置的检测机构及时地检测出死锁的发生,并精确地确定与死锁有关的进程和资源,然后采取适当措施,从系统中将已发生的死锁清除掉。
2、资源剥夺法:挂起某些死锁进程,并抢占它的资源,将这些资源分配给其他的死锁进程。但应防止被挂起的进程长时间得不到资源,而处于资源剥夺饥饿状态。
3、撤销进程法:强制撤销部分、甚至全部死锁进程并剥夺这些进程的资源。撤销的原则可以按进程优先级和撤销进程代价的高低进行。
4、进程回退法:让一(或多个)进程回退到足以解除死锁的地步,进程回退时自愿释放资源而非被剥夺。要求系统保持进程的历史信息,设置还原点。
3、死锁的必要条件有哪些?
1、互斥条件 系统中存在一个资源一次只能被一个进程所使用。也就是说,至少有一个资源必须处于非共享状态,即一次只能被一个进程或线程占用。
2、不可抢占条件(非抢占条件) 系统中存在一个资源仅能被占有它的进程所释放,而不能被别的进程强行抢占。这表示已分配给进程或线程的资源不能被强制性地剥夺,只能由持有资源的进程或线程主动释放。
3、请求与保持条件(占有且等待条件) 系统中存在一个进程已占有了分给它的资源,但仍然等待其它资源。进程或线程至少需要持有一个资源,并且在等待其他资源时不释放已占有的资源。
4、循环等待条件 在系统中存在一个由若干进程形成的环形请求链,其中的每一个进程均占有若干种资源中的某一种,同时每一个进程还要求(链上)下一个进程所占有的资源。这表示存在一个进程或线程的资源申请序列,使得每个进程或线程都在等待下一个进程或线程所持有的资源。
5、总结
为了避免死锁的发生,可以采取破坏这些条件的方法。例如,破坏互斥条件可能不太实际,因为某些资源本身就是互斥的。但可以通过破坏其他三个条件来降低死锁的风险,如一次性申请所有资源、在申请不到资源时主动释放已占有的资源、按序申请资源等。