一、什么是死锁?
死锁是指两个或多个进程(线程)因为竞争资源而无法继续执行的状态。
二、死锁发生的四个必要条件?
-
互斥条件(Mutual Exclusion):至少有一个资源被标记为独占,即一次只能被一个进程(线程)使用。
-
请求与保持条件(Hold and Wait):进程(线程)已经持有了至少一个资源,并且在等待获取其他进程(线程)持有的资源。
-
不可剥夺条件(No Preemption):已经分配给进程(线程)的资源不能被强制性地剥夺,只能由进程(线程)自己释放。
-
循环等待条件(Circular Wait):存在一个进程(线程)的资源请求链,使得每个进程(线程)都在等待下一个进程(线程)所持有的资源。
三、如何防止死锁的发生?
-
破坏互斥条件:对于某些资源,可以允许多个进程(线程)同时访问,而不是独占资源。例如,使用读写锁代替互斥锁。
-
破坏请求与保持条件:在申请新资源之前,释放已经持有的资源。只有在获得所有需要的资源后,才重新申请资源。
-
破坏不可剥夺条件:允许操作系统强制性地剥夺某些进程(线程)所持有的资源,并将其分配给其他等待资源的进程(线程)。
-
破坏循环等待条件:对资源进行全局排序,并按照顺序申请资源,避免形成循环等待链。
-
使用死锁检测与恢复机制:通过周期性地检测系统中是否存在死锁,并采取相应的恢复措施,如终止某些进程(线程)或回滚操作。
【总结】 以上策略可以单独或结合使用,具体选择取决于系统的需求和特点。在设计和实现系统时,需要考虑并预防潜在的死锁问题,以确保系统的稳定性和可靠性。