
课程咨询: 400-996-5531
投诉建议: 400-111-8989
认真做教育 专心促就业
死锁的产生在许多软件编程开发项目中都是会经常遇到的一个编程开发问题,而本文我们就通过案例分析来简单了解一下,死锁的产生原因与解决方法分享。
概念:死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。
举个例子:
这里线程1先申请资源1,申请到了之后,资源1被锁死(资源1会永远被线程1申请,因为只有申请到资源2执行完临界代码,才会释放掉资源1,此时线程1被卡在申请资源2的点,根本走不到释放资源1的代码,所以会一直被线程1占有),线程2无法申请,线程2先申请资源2,同样资源2也被锁死,这样当线程1继续向下申请资源2的时候,就被阻塞在那里,线程2在向下申请资源1的时候,也被阻塞在那里,这就形成了死锁,永远解不了锁。
死锁引起的原因:
竞争不可抢占资源引起死锁:这就是上述情况,都在等待对方占有的不可抢占的资源
竞争可消耗资源引起的死锁:有p1,p2,p3三个进程,p1向p2发送消息并接受p3发送的消息,p2向p3发送消息并接收p1的消息,p3向p1发送消息并接收p2的消息,如果设置时先接收消息后发送消息,则所有的信息都不能发送,这就造成死锁
死锁产生的四个必要条件:
互斥条件:一个资源每次只能被一个执行流使用
请求与保持条件:一个执行流因请求资源而阻塞时,对已获得的资源保持不放
不剥夺条件:一个执行流已获得的资源,在末使用完之前,不能强行剥夺
循环等待条件:若干执行流之间形成一种头尾相接的循环等待资源的关系
避免死锁:
破坏请求和保持条件
协议1:所有进程开始前,必须一次性地申请所需的所有资源,这样运行期间就不会再提出资源的需求,破坏了请求条件,即使有一种资源不能满足需求,也不会给它分配正在空闲的资源,这样它就没有资源,就破坏了保持条件,从而预防死锁
协议2:允许一个进程只获得初期的资源就开始运行,然后再把运行完的资源释放出来,然后再请求新的资源
破坏不可抢占条件
当一个已经保持了某种不可抢占资源的进程,提出新资源请求不能被满足的时候,它必须释放已经保持的所有资源,以后需要的时候再申请
破坏循环等待条件
对系统中的所有资源类型进行线性排序,然后规定每个进程必须按序列号递增的顺序请求资源。加入进程请求到了一些序列号较高的资源,然后请求一个序列号较低的资源时,必须先释放相同的更高序号的资源后才能申请低序列号的资源,多个同类资源必须一起请求
将所有资源进行线性排序,每个进程申请资源的顺序保持一致
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。