死锁与活锁的原因 与解决方法(附加“饿死”)

Posted cc123nice

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了死锁与活锁的原因 与解决方法(附加“饿死”)相关的知识,希望对你有一定的参考价值。

活、死锁的定义

--引用https://www.cnblogs.com/sunnyCx/p/8108366.html

1.死锁:是指两个或两个以上的进程(或线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。

  比如:迎面开来的汽车A和汽车B过马路,汽车A得到了半条路的资源(满足死锁发生条件1:资源访问是排他性的,我占了路你就不能上来,除非你爬我头上去),汽车B占了汽车A的另外半条路的资源,A想过去必须请求另一半被B占用的道路(死锁发生条件2:必须整条车身的空间才能开过去,我已经占了一半,尼玛另一半的路被B占用了),B若想过去也必须等待A让路,A是辆兰博基尼,B是开奇瑞QQ的屌丝,A素质比较低开窗对B狂骂:快给老子让开,B很生气,你妈逼的,老子就不让(死锁发生条件3:在未使用完资源前,不能被其他线程剥夺),于是两者相互僵持一个都走不了(死锁发生条件4:环路等待条件),而且导致整条道上的后续车辆也走不了。(很粗鲁的相互竞争)

 

  因此,产生死锁的必要条件

(1)互斥使用(资源独占)

一个资源每次只能给一个进程使用(比如写操作)

(2)占有且等待

进程在申请新的资源的同时,保持对原有资源的占有

(3)不可抢占

资源申请者不能强行从资源占有者手中夺取资源,资源只能由占有者自愿释放

(4)循环等待

P1等待P2占有的资源,P2等待P3的资源,...Pn等待P1的资源,形成一个进程等待回路

 

2.活锁:任务或者执行者没有被阻塞,由于某些条件没有满足,导致一直重复尝试,失败,尝试,失败。

  比如:线程A和B都需要过桥(都需要使用进程),而都礼让不走(那到的系统优先级相同,都认为不是自己优先级高),就这么僵持下去.(很绅士,互相谦让)

技术图片

活锁和死锁的区别:处于活锁的实体是在不断的改变状态,所谓的“活”, 而处于死锁的实体表现为等待;活锁有可能自行解开,死锁则不能。

 

3.”饿死“ :可运行的进程尽管能继续执行,但被调度器无限期地忽视,而不能被调度执行的情况。

    这是个独木桥(单进程),桥上只能走一个人,B来到时A在桥上,B等待;
          而此时比B年龄小的C来了,B让C现行(A走完后系统把进程分给了C),C的优先级高于B
          C上桥后,D又来了,B又让D现行(C走完后系统把进程分个了D)  D的优先级高于B
          以此类推B一直是等待状态.                 随后的优先级都高于B

技术图片

解决方法

活锁解决方法:通过先来先服务的方式解除活锁。

当多个事务请求锁定同一个数据库对象时,系统应该按请求锁定的先后次序对这些事务进行排队。一旦释放数据库对象上的锁,就批准请求队列中的下一个事务的请求,使其锁定数据库对象,以便完成数据库操作,及时结束事务。

死锁解决方法:

1.尽可能预防&避免(嘴上说说)

2.撤销或挂起一些进程,以便回收一些资源,再将这些资源分配给已处于阻塞状态的进程,使之转为就绪状态,以继续运行。(但实现困难)

以上是关于死锁与活锁的原因 与解决方法(附加“饿死”)的主要内容,如果未能解决你的问题,请参考以下文章

死锁与活锁的区别,死锁与饥饿的区别

死锁与活锁的区别,死锁与饥饿的区别?

死锁与活锁的区别,死锁与饥饿的区别?

死锁与活锁的区别,死锁与饥饿的区别?

死锁,活锁,饿死的区别

Linux同步机制 - 基本概念(死锁,活锁,饿死,优先级反转,护航现象)