大家好,小方来为大家解答以上问题。死锁的原因及解决方法,死锁的原因及解决办法很多人还不知道,现在让我们一起来看看吧!
解答:
1、 死锁是由两个或多个线程持有彼此所需的资源造成的,这会导致这些线程处于等待状态,无法执行。
2、 死锁的四个必要条件是互斥:线程对资源的占用是排他的,一个资源在释放之前只能被一个线程占用。请求和保持条件:当一个线程阻塞所请求的被占用资源时,它不会释放已经获得的资源。不剥夺:在一个线程释放资源之前,其他线程不能剥夺占用。等待:当死锁发生时,线程进入无限循环并被永久阻塞。
3、 死锁是由对不可抢占资源的竞争造成的。p1已经打开了F1,p2已经打开了F2,但是F1和F2都是不可抢占的。这是一个僵局。
4、 对可消耗资源的竞争导致僵局。如果进程之间的通信出现故障,就会出现死锁。例如,p1向p2发送消息m1,p1从p3接收消息m3,p2接收p1的m1并向p3和p3发送m2,以此类推。如果进程之间的消息先发送,通信就可以完成,但是如果消息先接收,就会出现死锁。
5、 进程顺序不当,运行过程中请求和释放资源的顺序不当,也会导致进程死锁。
6、 避免死锁的方法破坏了“请求并保持”条件,并试图使进程不那么贪婪。如果你已经有了资源,就不要去争夺那些无法抢占的资源。比如申请资源的时候,让流程一次性申请所有需要的资源,而不是一次又一次的申请。当一些应用的资源不可用时,让线程等待。但是,这种方法是资源的浪费,过程可能永远是饥饿的。另一种方法是要求流程在申请资源之前释放自己的资源。
7、 破坏“非抢占”条件,允许进程抢占。方法一:如果抢资源被拒绝,释放自己的资源。方法2:操作系统允许抓取。只要你有高优先级,你就能抓住它。
8、 打破“循环等待”的条件将统一对系统中的所有资源进行编号。流程可以随时申请资源,但所有申请都必须按照资源的编号顺序(升序)提交。
9、 每个进程的死锁检测,以及每个资源的唯一编号。设置资源分配表,记录进程与占用资源的关系。建立一个流程等待表,记录每个流程和要申请的资源之间的关系。
10、 死锁解除抢占资源,从一个或多个进程中抢占足够数量的资源,并将其分配给死锁进程以解除死锁状态。
11、 终止(或撤销)进程,终止(或撤销)系统中的一个或多个死锁进程,直到循环被打破,这样系统就可以从死锁状态中释放出来。
本文到此结束,希望对大家有所帮助。