操作系统中的死锁问题
什么是死锁?
在多道程序环境下,多个进程可能竞争一定数量的资源。某个进程申请资源,如果这时资源不可用,那么该进程进入等待状态。如果申请的资源被其他等待进程占有,那么该等待进程有可能再也无法改变其状态。这种情况称为死锁。
在正常情况下,进程只能按如下顺序使用资源:
1 申请 如果申请的资源正在被其他的进程使用,那么申请进程必须等待,直到它获得该资源为止
2 使用 进程对资源进行操作
3 释放 进程释放资源
当一组进程中的每个进程都在等待一个事件,而这一事件只能由这一组进程的另一进程引起,那么这组进程就处于死锁状态。
死锁产生的必要条件
如果在一个系统中,下面4个条件同时满足,那么可能就会引起死锁
(1)互斥 至少有一个资源处于非共享模式,即一次只能由一个进程使用。如果另一进程申请该资源,那么申请进程必须等到该资源被释放为止。
(2)占有并等待 一个进程必须至少占有一个资源,并等待另一资源,而该资源位其他进程占有
(3)非抢占 资源不能被抢占,即资源只能在进程完成任务后自动释放
(4)循环等待 {P0,P1,P2,................,Pn} P0等待的资源为P1占有,P2等待的资源为P3占有,................,Pn等待的资源位P0z占有。
资源分配图——死锁问题精确的描述
死锁问题可用称为系统资源分配图的有向图进行更为精确的描述。
资源分配图的表示 节点(分为两种类型系统活动进程的节点和系统所有资源类型的节点)和边(申请边:从进程指向资源节点和分配边:从资源指向进程节点)
画法 进程节点
资源节点 带有两个实例
下面我们由一个资源分配图为例,从资源分配图,我们可以找到很多信息
由资源分配图可以看出
集合P,R,E
资源实例 如R1有一个实例 R2有2个实例
进程状态 如进程P1占有资源类型为R2的一个实例,等待资源类型为R1的实例。
由资源分配图可以看出
1 如果没有环则没有死锁
2 如果有环则分为两种情况
2.1 单资源实例有环必死锁 (又分为 环所涉及的资源刚好有一个实例和 所有资源都只有一个实例)
2.2 多资源环的出现可能会引起死锁
死锁实例
总而言之 ,如果资源分配图没有环就不会处于死锁状态,另一方面,如果有环,那么系统可能处于死锁状态。
补充 什么是活锁
如果有太多进程或操作在短时间内大量请求同一资源出现了活锁;
特点:
好像停滞了,但可以解开;
数据库例子:如果食物T1封锁了数据R,事务T2又请求封锁R,于是T2等待。T3也请求封锁R,当T1释放了R上的封锁之后系统首先批准了T3的请求,T2仍然在等待。然后T4又请求封锁R,当T3释放了R上的封锁之后系统又批准了T4的请求,……,T2有可能永远等待,这就是活锁的情形
网络的例子:中断活锁;
网卡速率变化导致数据包处理方式的变化
中断->轮询
死锁处理方法
从原理上说,有三种方法可以解决死锁问题。
1 可使用协议以预防或避免死锁,确保系统不会进入死锁状态。 也就是说提前评估一下是否会导致死锁。
2 可允许系统进入死锁,然后检测他恢复他
3 可忽视这个问题,认为死锁不可能在系统内检测 鸵鸟策略
鸵鸟策略看似可笑,但是应用还是比较广泛的:
数学家观点(理论型,完美主义者):
希望世界完美无缺
有问题就必须处理,无论任何代价
工程师观点(实践):
能够工作就可以
有问题(死锁):频率、危害、处理代价进行比较
死锁频率<其他故障频率
处理代价>大于处理代价
接下来将我将会详细讨论每种处理方法的详细讨论每种方法的机制和算法 敬请期待。
相关推荐
罗保山和鲁立在《浅谈操作系统中的死锁问题》一文中,可能探讨了以下几个关键概念和解决策略: 1. **死锁的必要条件**:通常认为存在四个基本条件导致死锁: - **互斥条件**:至少有一个资源是不能被共享的,即一...
综上所述,死锁是操作系统中一个重要的概念,理解和掌握其原理及解决方法对于优化系统性能、提高软件质量具有重要意义。在实际开发和维护过程中,应充分考虑到死锁的可能性,并采取适当的预防措施。
分布式操作系统是计算机技术中的一个重要分支,它在分布式计算系统中扮演着至关重要的角色。分布式计算系统是由多台处理机通过网络连接起来构成的,资源分布于整个系统,每个处理机具有一定程度的控制和自治能力。...
如果你学过操作系统,那么对于锁应该不陌生。锁的含义是线程锁,可以用来指定某一个逻辑或者是资源同一时刻只能有一个线程访问。这个很好理解,就好像是有一个房间被一把锁锁住了,只有拿到钥匙的人才能进入。每一个...
Linux操作系统在实时化方面面临的关键问题在于其内核设计初衷是为了优化平均性能,而非专注于实时性。普通Linux内核在实时应用中表现出以下不足: 1. **调度策略**:Linux内核提供了三种调度策略,包括SCHED_RR...
线程是操作系统中的基本执行单元,它是程序的一部分,具有独立的执行路径和局部变量。一个进程中可以包含多个线程,它们共享同一内存空间,可以并发执行,提高了处理器的使用率。线程间的通信和同步相对进程而言更为...
在操作系统中,死锁是一个常见的问题,尤其是在资源管理方面。 **死锁产生的原因**: 1. **互斥条件**:进程独占某些资源。 2. **请求和保持条件**:进程已持有至少一个资源,但仍会请求其他资源。 3. **不可剥夺...
在Linux操作系统中,多线程编程是一种高效的任务执行方式,特别是在现代计算机系统中,多核处理器的普及使得并发执行成为提升性能的关键。多线程技术早在60年代就被提出,并在Linux等操作系统中得到广泛支持。它有两...
线程是操作系统中执行的基本单元,是进程的一部分,它比进程更细粒度,是CPU调度和分派的基本单位。线程自身只持有少量资源,如程序计数器、寄存器和栈,但它可以和其他线程共享进程的所有资源。线程的引入旨在提高...
在软件层面,可靠性的提升主要体现在程序设计和实时操作系统(RTOS)的选择上。良好的编程规范,如避免全局变量,使用异常处理机制,以及充分的错误检查,能降低程序出错的概率。而RTOS通过调度策略保证任务的及时执行...
### 浅谈并行编程中的任务分解模式 #### 一、引言 并行编程是一种通过利用计算机系统中多个处理器或核心的能力来提高程序执行效率的技术。为了有效地进行并行编程,开发人员需要掌握如何合理地分解任务,以便能够...
2. 基于set命令的原子操作:利用Redis 2.6.12版本后引入的命令参数,在单个命令中完成设置键值对及设置过期时间,避免了锁的死锁问题。 在使用基于Redis的分布式锁时,必须考虑如下缺陷: - Redis复制是异步进行的...
在多线程编程中,为了确保程序的正确性和高效性,我们需要理解并掌握线程间的同步、互斥以及如何避免死锁。以下将详细介绍这些概念以及在Python中如何实现。 1. **线程间通信** - **全局变量**:线程间可以通过...