进程之死锁

一、死锁的定义

      多个进程,每个进程都无限等待被另一进程所占有的资源,因而永远无法得到的资源,这种现象称为进程死锁,这一组进程就称为死锁进程


二、死锁产生的原因     

(1)竞争资源:竞争不可剥夺资源(打印机,P1占用,P2要求打印机打印,则阻塞)

   资源为可剥夺资源和不可剥夺资源。

 可剥夺资源,指某进程在获得这类资源后,该资源可以再被其他进程或系统剥夺(如CPU和主存)

不可剥夺资源,系统把资源分配给某进程后不能强行收回,只能在进程用完后自行释放(打印机)

(2)进程推进顺序不当:2个进程都申请对方已占有的资源

                                    (P1占用R1请求R2,而P2占用R2请求R1),死锁                             


三、产生死锁的4个必要条件    

(1) 互斥条件:资源独占,一个资源每次只能给一个进程使用

(2) 不剥夺条件:不可抢占,资源申请者不能强行的从资源占有者手中夺取资源,资源只能由占有者自愿释放

(3) 请求和保持条件:部分分配,占有申请。在申请新的资源同时保持对原有资源的占有

(4) 环路等待条件:P1等待P2资源,P2等待P1占有的资源

四、死锁的解决策略 

(1)鸵鸟策略:不理睬

(2)预防策略:破坏死锁的4个必要条件

           破坏“互斥性”条件:允许一个资源可由多个进程同时使用(对有的资源行不通,如打印机)

           破坏“不可剥夺条件”:采用剥夺控制,在允许进程动态申请资源前提下,规定,申请新的资源不能立即满足,变为等待状态前,必须释放已占有的资源,若需要,重新再申请(适用于处理机和存储器)

           破坏“请求和保持”条件:采用资源静态分配法,要求每个进程在运行前必须一次性申请所需的所有资源,且仅当该进程所要资源均可满足时,才一次性分配。

           破坏“环路等待条件”:采用资源有序分配,把系统中所有资源编号,进程在申请资源时必须严格按资源编号的递增顺序执行,否则操作系统不予分配(缺点:资源编号增加顺序申请,与实际使用顺序不同,浪费资源)

(3)避免策略:精心地分配资源,动态地回避死锁

             基本思想,它不限制有关申请资源的命令,而是在系统运行过程中,对进程所发出每一个申请资源命令进行动态地检查,并根据检查结果决定是否进行资源分配。若分配可能引起系统死锁, 则不予分配,否则予以分配。就是说,在资源分配过程中若预测有发生死锁的可能性,则加以避免

            算法:银行家算法,分配资源之前,判断系统是否是安全的,若是,才分配。保证银行家状态从一个安全状态转向另一个安全状态——不死锁!(判断状态是否安全)。

  • 所谓安全状态,是指系统能按某种进程推进顺序( P1, P2, …, Pn),为每个进程Pi分配其所需资源,直至满足每个进程对资源的最大需求,使每个进程都可顺序地完成。此时称 P1, P2, …, Pn 为安全序列。如果系统无法找到一个安全序列,则称系统处于不安全状态。  

             银行家算法详情见https://blog.youkuaiyun.com/qq_36260974/article/details/84404369              

(4)检测和解除允许死锁发生,操作系统不断监视系统进展情况,判断死锁是否发生。一旦发生死锁,及时检测,并采取措施解除死锁

           死锁检测:资源分配图

           死锁解除:强制性地从系统中撤消进程并剥夺它们的资源给剩下的进程使用

           详情见https://blog.youkuaiyun.com/lierming__/article/details/79000632


### 进程资源死锁的原因 进程资源死锁通常发生在多个进程竞争有限的共享资源时,这些资源无法同时被多个进程使用。当一组进程中的每一个都在等待另一个进程所持有的资源时,就形成了循环等待的情况,从而导致死锁的发生[^1]。 具体来说,形成死锁的主要条件包括以下四个方面: - **互斥条件**:至少有一种资源必须处于不可抢占状态,即一次只能由一个进程占用。 - **占有并请求**:发生死锁进程中至少有一个已经持有了某些资源,同时还请求新的资源;而新资源已经被其他进程持有。 - **不剥夺条件**:已分配给进程的资源不能强制从该进程中收回,只有拥有者自己才能主动释放它们。 - **循环等待**:存在一系列等待着彼此释放其所占资源的进程链表或环路结构[^2]。 以上四个必要条件被称为“死锁定理”,如果系统能够避免任何一个条件成立,则可以防止死锁现象的发生。 --- ### 解决方案 #### 1. 死锁预防 通过破坏上述提到的一个或多条死锁定理来实现预防目的: - **打破互斥条件**:尽可能减少独占型资源的数量,增加可共享使用的设备数目。 - **改变占有并请求模式**:要求所有需要某类特定资源的操作都必须一次性申请完毕,在获得全部所需之前不允许启动任何实际工作。 - **允许强行剥夺**:引入优先级机制或者时间片轮转策略使得长时间未完成的任务会被中断甚至撤销其当前拥有的部分权利以便让位于更紧急的需求方。 - **消除可能形成的闭环依赖关系**:采用顺序编号法安排各类对象之间的调用次序以杜绝任何形式上的回路出现可能性。 #### 2. 避免死锁 利用安全算法提前检测即将发生的冲突状况,并采取相应措施加以规避。例如著名的银行家算法就是一种有效的手段之一,它通过对未来一段时间内的资源需求情况进行预测评估,决定是否批准某个用户的进一步索取行为,以此保障整个系统的稳定性不受影响。 #### 3. 检测恢复 对于那些既没有实施充分的事前防范也没有建立完善的动态监控体系的小规模应用环境而言,事后处理便成为唯一可行的选择。这主要包括定期扫描检查是否存在潜在隐患以及一旦发现问题立即介入干预两个方面的工作内容。常见的做法有设置超时限制自动终止异常活动单元或者是专门设计用于诊断此类故障的专业工具软件等等。 ```python import threading class ResourceLockManager: def __init__(self): self.locks = {} def acquire_lock(self, resource_id): lock = self.locks.get(resource_id) if not lock: lock = threading.Lock() self.locks[resource_id] = lock with lock: # 执行临界区操作 pass def release_all_locks(self): for lock in self.locks.values(): if lock.locked(): lock.release() manager = ResourceLockManager() manager.acquire_lock('database_connection') # 处理业务逻辑... manager.release_all_locks() # 确保最后释放所有锁资源 ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值