死锁条件解析

下图是百度百科对于死锁产生的必要的四个条件描述:

如何在实际的例子中印证这些条件?

用线程1和线程2同时写文件A和文件B举例:

        假设,线程1先写文件A,写之前对文件A加互斥锁。同时线程2写文件B,写之前也对文件B加锁。然后线程1写到一半,要再写文件B,注意这个时候它文件A并没有写完。同样的线程2在没有写完文件B的情况下,也要求再写文件A。结果就是,线程1陷入阻塞,因为它要等待线程2释放文件B的互斥锁,同时线程2也陷入阻塞,因为它要等待线程1释放文件A的互斥锁。两个线程都阻塞导致谁的锁也永远都等不到。在这个例子中,4个条件是如何被满足的?又为何要满足这些条件?

一、互斥条件

        首先同一个文件同一时刻只能由一个线程写入(假如都从当前写指针处开始写),因为假如进程1和进程2同时向文件A写123,我们预期两个进程写完后文件A的内容是123123,但是很可能最终结果是112233、121233、112323等等其中一个,因为一个进程很可能还没有写完就被另一个进程打断,而且每次打断的时机是随机的。为了保证写入文件A的数据是我们预期的结果,我们肯定要要求进程1写入的时候,如果进程2也要写,那进程2就阻塞等待其他进程写完,这样就能保证写入文件结果正确。最简单的方法就是,我们一个线程在写某个共享资源的时候,给这个资源加一个互斥锁,这就满足了第一个条件:互斥条件

二、请求和保持条件

        在这个例子中,两个线程则至少有2个资源才会导致死锁,如果这个例子中只有一个文件A,那永远也不会导致死锁(加两次锁除外)。同时两个线程必定是先获取了一个资源,这就导致了两个线程获取的资源是不同的(相同的资源在加互斥锁的前提下不可能被两个线程同时获取),然后再去请求另一个资源。如果没有请求条件,那就是线程1写文件A,写完释放,结束,那结果肯定没有死锁。如果没有保持条件,那就是把进程1设计为,先把A写完释放后再写文件B,否则就不着急写文件B。可以想象,只对其中一个进程,做以上两个情况之一的改变,都不会死锁,这就满足了第二个条件:请求和保持条件

三、不可剥夺条件

        在这个例子里,线程2是无法剥夺线程1的资源的,反过来也一样。但是想象一下,假如线程2可以剥夺线程1对于文件A的所有权,那线程2可以直接把文件A拿过来写入,写完再回去继续写文件B,这样可能带来其他问题,但是死锁会被解决。所以文件A的使用权必定不能被其他线程所剥夺,这就满足了第三个条件:不可剥夺条件

一开始对比不可剥夺条件是否破坏了资源的互斥性抱有疑虑,后来想明白了:

        举个例子,计算机系有两个班分别是1班和2班,1班有一台服务器,但是这台服务器一次只能由一个同学的客户端连接,一旦被连接其他人都没法连上服务器了,我们叫这台服务器具有互斥性。如果这台服务器无论全班有多少同学都能同时连接,那我们认为这台服务器没有互斥性。2班没有服务器,但是2班把1班的服务器给搬回自己教室据为己有了,自己班的同学也能用上服务器了,然后2班的同学认为你1班的这台服务器是可剥夺的。但是假如这台服务器太重了,怎么也搬不走,2班的同学会认为你1班这台服务器是不可剥夺的。但是请注意,无论2班能不能剥夺1班这台服务器,并不会改变服务器本身是每次只能一个人连接,还是每次所有人都可以连接,能不能被搬走和服务器本身能不能被同时连接没有联系。

四、环路等待条件

       假如两个线程配合两个资源,死锁用流程图表示为:

 这里进程1对文件A上锁去请求文件B,进程2对文件B上锁去请求进程A,文件A和文件B请求形成环路。如果是3个线程呢:

以上是第一种,还有一种:

在进程1和进程3之间已经形成环路,此时如果进程2在拥有文件B后,无论去请求文件A还是文件C都无法请求到,但是在这里却和条件四描述不同,条件四强调了一种连续关系,就如同第一张三个线程的情况,这是为什么?

        笔者认为上图应该归为两个线程两个资源的情况,因为此时就算进程2没有文件B的所有权,去请求一个已经触发死锁的环路里任何一个资源,也都会被锁,如果有线程4、线程5甚至线程100去请求死锁环路里的资源都会被锁,它们并不是导致死锁的原因,它们是因为死锁而死锁。而三个线程的第一种情况中,进程2是死锁环路的一部分,它也被归为死锁起因的一部分,它的死锁并不是因为死锁而死锁。所以如果要满足是死锁起因的一部分,则必须满足在死锁环路内,这就满足了第四个条件:环路等待条件

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值