关于死锁

定义

死锁是指两个或者两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象

原因

资源不足、相互竞争资源、资源调用顺序不当而导致

相关概念

竞态条件:即两个或多个线程同时对一共享数据进行修改,从而影响程序运行的正确性时,这种就被称为竞态条件

临界区:不仅共享资源会造成竞态条件,共享文件、共享内存也会造成竞态条件,为了避免竞争,需要一种互斥条件,使得在多进程场景下,一个进程在某时刻正在使用共享变量或文件,那么,除该进程之外的其他进程就禁止访问该资源,即,多个进程在同一时刻对共享资源(包括共享内存、共享文件等)进行读写

忙等互斥:当一个进程在对资源进行修改时,其他进程必须进行等待,进程之间要具有互斥性

死锁产生的必要条件

① 互斥条件:每个资源都被分配给了一个进程或者资源是可用的

② 保持和等待条件:已经获取资源的进程被认为能够获取新的资源

③ 不可抢占条件:分配给一个进程的资源不能强制的从其他进程抢占资源,它只能由占有它的进程显示释放

④ 循环等待:死锁发生时,系统中一定有两个或者两个以上的进程组成一个循环,循环中的每个进程都在等待下一个进程释放的资源 

如何解除死锁

资源剥夺:挂起某些死锁进程,并抢占它的资源,将这些资源分配给其他死锁进程(但应该防止被挂起的进程长时间得不到资源);

撤销进程:强制撤销部分、甚至全部死锁进程并剥夺这些进程的资源(撤销的原则可以按进程优先级和撤销进程代价的高低进行);

进程回退:让一个或多个进程回退到足以避免死锁的地步。进程回退时自愿释放资源而不是被剥夺。要求系统保持进程的历史信息,设置还原点

死锁类型

两阶段锁

虽然很多情况下死锁的避免和预防都能处理,但是效果并不好,例如在数据库系统中,一个经常发生的操作是请求锁住一些记录,然后更新所有锁定的记录。当同时有多个进程运行时,就会有死锁的风险

两阶段提交:顾名思义分为两个阶段,一阶段是进程尝试一次锁定它需要的所有资源。如果成功后,才会开始第二阶段,第二阶段是执行更新并释放锁,第一阶段并不做真正有意义的工作,反之,第一阶段的资源已被其他进程锁定,那么就会释放当前进程已锁定的其他资源,并重新开始第一阶段

通信死锁

两个或多个进程在发送消息时出现的死锁

例如:进程 A 给进程 B 发了一条消息,然后进程 A 阻塞直到进程 B 返回响应。假设请求消息丢失了,那么进程 A 在一直等着回复,进程 B 也会阻塞等待请求消息到来,这时候就产生死锁

但是这种情况并不算是真正意义上的死锁,因为并未出现资源征用的情况,只是因为同步通信的信息等待导致死锁,所以这种情况会被称为通信死锁,但也并不是所有的网络通信发生死锁都是通信死锁,也有资源死锁的情况

针对通信死锁,可以通过设置超时时间来解决。

活锁

两个并行的进程用到了两个资源,在分别尝试获取另一个锁失败后,两个进程都会尝试释放自己所持有的锁,在等待适当的时间后,会再次尝试,这个过程会一直重复,知道成功或达到其他的进程终止条件。在这种进行未中止,单进程却不会继续执行的情况,称之为活锁

饥饿

 。。。。。

 

posted @ 2022-05-11 14:16  蚂蚁力量  阅读(86)  评论(0)    收藏  举报