lunix内核—死锁的四个必要条件和解决办法
死锁概念及产生原理
概念:
多个并发进程因争夺系统资源而产生相互等待的现象。
原理:
当一组进程中的每个进程都在等待某个事件发生,而只有这组进程中的其他进程才能触发该事件,这就称这组进程发生了死锁。
本质原因:
1)、系统资源有限。
2)、进程推进顺序不合理。
死锁产生的4个必要条件
1、互斥:某种资源一次只允许一个进程访问,即该资源一旦分配给某个进程,其他进程就不能再访问,直到该进程访问结束。
2、占有且等待:一个进程本身占有资源(一种或多种),同时还有资源未得到满足,正在等待其他进程释放该资源。
3、不可抢占:别人已经占有了某项资源,你不能因为自己也需要该资源,就去把别人的资源抢过来。
4、循环等待:存在一个进程链,使得每个进程都占有下一个进程所需的至少一种资源。
当以上四个条件均满足,必然会造成死锁,发生死锁的进程无法进行下去,它们所持有的资源也无法释放。这样会导致CPU的吞吐量下降。所以死锁情况是会浪费系统资源和影响计算机的使用性能的。那么,解决死锁问题就是相当有必要的了。
避免死锁的方法
1、死锁预防 ----- 确保系统永远不会进入死锁状态
产生死锁需要四个条件,那么,只要这四个条件中至少有一个条件得不到满足,就不可能发生死锁了。由于互斥条件是非共享资源所必须的,不仅不能改变,还应加以保证,所以,主要是破坏产生死锁的其他三个条件。
a、破坏“占有且等待”条件
方法1:所有的进程在开始运行之前,必须一次性地申请其在整个运行过程中所需要的全部资源。
优点:简单易实施且安全。
缺点:因为某项资源不满足,进程无法启动,而其他已经满足了的资源也不会得到利用,严重降低了资源的利用率,造成资源浪费。使进程经常发生饥饿现象。
方法2:该方法是对第一种方法的改进,允许进程只获得运行初期需要的资源,便开始运行,在运行过程中逐步释放掉分配到的已经使用完毕的资源,然后再去请求新的资源。这样的话,资源的利用率会得到提高,也会减少进程的饥饿问题。
b、破坏“不可抢占”条件
当一个已经持有了一些资源的进程在提出新的资源请求没有得到满足时,它必须释放已经保持的所有资源,待以后需要使用的时候再重新申请。这就意味着进程已占有的资源会被短暂地释放或者说是被抢占了。
该种方法实现起来比较复杂,且代价也比较大。释放已经保持的资源很有可能会导致进程之前的工作实效等,反复的申请和释放资源会导致进程的执行被无限的推迟,这不仅会延长进程的周转周期,还会影响系统的吞吐量。
c、破坏“循环等待”条件
可以通过定义资源类型的线性顺序来预防,可将每个资源编号,当一个进程占有编号为i的资源时,那么它下一次申请资源只能申请编号大于i的资源。如图所示:
这样虽然避免了循环等待,但是这种方法是比较低效的,资源的执行速度回变慢,并且可能在没有必要的情况下拒绝资源的访问,比如说,进程c想要申请资源1,如果资源1并没有被其他进程占有,此时将它分配个进程c是没有问题的,但是为了避免产生循环等待,该申请会被拒绝,这样就降低了资源的利用率
2、避免死锁 ----- 在使用前进行判断,只允许不会产生死锁的进程申请资源
死锁避免是利用额外的检验信息,在分配资源时判断是否会出现死锁,只在不会出现死锁的情况下才分配资源。
两种避免办法:
1、如果一个进程的请求会导致死锁,则不启动该进程
2、如果一个进程的增加资源请求会导致死锁 ,则拒绝该申请。避免死锁的具体实现通常利用银行家算法
银行家算法
银行家算法的相关数据结构
可利用资源向量Available:用于表示系统里边各种资源剩余的数目。由于系统里边拥有的资源通常都是有很多种(假设有m种),所以,我们用一个有m个元素的数组来表示各种资源。数组元素的初始值为系统里边所配置的该类全部可用资源的数目,其数值随着该类资源的分配与回收动态地改变。
最大需求矩阵Max:用于表示各个进程对各种资源的额最大需求量。进程可能会有很多个(假设为n个),那么,我们就可以用一个nxm的矩阵来表示各个进程多各种资源的最大需求量
分配矩阵Allocation:顾名思义,就是用于表示已经分配给各个进程的各种资源的数目。也是一个nxm的矩阵。
需求矩阵Need:用于表示进程仍然需要的资源数目,用一个nxm的矩阵表示。系统可能没法一下就满足了某个进程的最大需求(通常进程对资源的最大需求也是只它在整个运行周期中需要的资源数目,并不是每一个时刻都需要这么多),于是,为了进程的执行能够向前推进,通常,系统会先分配个进程一部分资源保证进程能够执行起来。那么,进程的最大需求减去已经分配给进程的数目,就得到了进程仍然需要的资源数目了。
银行家算法通过对进程需求、占有和系统拥有资源的实时统计,确保系统在分配给进程资源不会造成死锁才会给与分配。
死锁避免的优点:不需要死锁预防中的抢占和重新运行进程,并且比死锁预防的限制要少。
死锁避免的限制:
- 必须事先声明每个进程请求的最大资源量
- 考虑的进程必须无关的,也就是说,它们执行的顺序必须没有任何同步要求的限制
- 分配的资源数目必须是固定的。
- 在占有资源时,进程不能退出
3、死锁检测与解除 ----- 在检测到运行系统进入死锁,进行恢复。
允许系统进入到死锁状态
死锁检测
下图截自《操作系统--精髓与设计原理》
死锁的解除
如果利用死锁检测算法检测出系统已经出现了死锁 ,那么,此时就需要对系统采取相应的措施。常用的解除死锁的方法:
1、抢占资源:从一个或多个进程中抢占足够数量的资源分配给死锁进程,以解除死锁状态。
2、终止(或撤销)进程:终止或撤销系统中的一个或多个死锁进程,直至打破死锁状态。
a、终止所有的死锁进程。这种方式简单粗暴,但是代价很大,很有可能会导致一些已经运行了很久的进程前功尽弃。
b、逐个终止进程,直至死锁状态解除。该方法的代价也很大,因为每终止一个进程就需要使用死锁检测来检测系统当前是否处于死锁状态。另外,每次终止进程的时候终止那个进程呢?每次都应该采用最优策略来选择一个“代价最小”的进程来解除死锁状态。一般根据如下几个方面来决定终止哪个进程:
- 进程的优先级
- 进程已运行时间以及运行完成还需要的时间
- 进程已占用系统资源
- 进程运行完成还需要的资源
- 终止进程数目
- 进程是交互还是批处理
lunix内核—死锁的四个必要条件和解决办法相关推荐
- 面试问题之操作系统:死锁的四个必要条件和解决办法
面试问题之操作系统:死锁的四个必要条件和解决办法 参考文章: (1)面试问题之操作系统:死锁的四个必要条件和解决办法 (2)https://www.cnblogs.com/yichengming/p/ ...
- 死锁的四个必要条件和解决办法
死锁概念及产生原理 概念:多个并发进程因争夺系统资源而产生相互等待的现象. 原理:当一组进程中的每个进程都在等待某个事件发生,而只有这组进程中的其他进程才能触发该事件,这就称这组进程发 ...
- 死锁的四个必要条件,及处理方法
死锁的四个必要条件互斥条件(Mutual exclusion):资源不能被共享,只能由一个进程使用.请求与保持条件(Hold and wait):已经得到资源的进程可以再次申请新的资源.非剥夺条件(N ...
- 高并发之——死锁,死锁的四个必要条件以及处理策略
一.什么是死锁 多线程以及多进程改善了系统资源的利用率并提高了系统 的处理能力.然而,并发执行也带来了新的问题--死锁. 死锁是指两个或两个以上的进程(线程)在运行过程中因争夺资源而造成的一种僵局(D ...
- 死锁的四个必要条件以及处理策略
一.什么是死锁 死锁是指两个或两个以上的进程(线程)在运行过程中因争夺资源而造成的一种僵局. 例如,某计算机系统中只有一台打印机和一台输入设备,进程P1正占用输入设备,同时又提出使用打印机的请求,但此 ...
- 【计算机系统】死锁的四个必要条件
转载地址: 死锁的四个必要条件 操作系统中有若干进程并发执行,它们不断申请.使用.释放系统资源,虽然系统的进 程协调.通信机构会对它们进行控制,但也可能出现若干进程都相互等待对方释放资源才能 继续运行 ...
- 死锁——什么是死锁 死锁的四个必要条件 避免死锁
1 什么是死锁 死锁的定义是:在一个进程组内,每个进程都在等待只有其他进程才能引发的事件,那么该进程组处于死锁状态. 有两个线程(或者更多的线程),每个线程都在等待被其他线程占用的资源. 比如:线程A ...
- 操作系统(1) - 死锁的四个必要条件及避免
一.什么是死锁 死锁是指多个进程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进. 二.死锁产生的原因 1. 系统资源的竞争 系统资源的竞争导致系统资源不足,以及资源分配 ...
- 关于死锁,死锁的四个必要条件的总结
什么是死锁? 死锁,指的是多个进程再运行期间因争夺资源而产生的一种僵局,若无外力作用(破坏死锁),程序将无法运行. 死锁产生的四个必要条件 互斥条件: 进程要求对所分配的资源(如打印机)进行排他性控制 ...
- 死锁的四个必要条件及处理死锁
什么是死锁? 如果一个进程集合里面的每个进程都在等待只能由这个集合中的其他一个进程(包括他自身)才能引发的事件,这种情况就是死锁. 这个定义可能有点拗口,下面用一个简单例子说明. 资源A.B,进程C. ...
最新文章
- 汉字在屏幕上的显示过程以及乱码的原因
- Qt中内存泄露和半自动内存管理
- STM32开发 -- 状态机与状态切换逻辑
- CCNA实验(9) -- Frame Relay
- android模拟用户输入
- Destoon源数据库配置文件在哪_数据库监控软件Lepus安装部署详解
- python模拟登陆 验证码el_8-python模拟登入(无验证码)
- python 规则引擎 drools_Drools规则引擎详解-常用的drl实例
- 简析运维监控系统及Open-Falcon
- mysql更新语句使用order by
- mklink实现软件搬家清理C盘空间
- bat脚本修改文件内容
- WPF应用无法使用Snoop分析的解决办法
- 腾讯防水墙php接入,PHP实现腾讯防水墙验证码校验
- ubuntu安装anaconda3报错
- 【数据处理】之读取csv文件报错
- lae界面开发工具入门之介绍四--秘籍篇-拷贝粘贴
- 创新设计思维记录(part1)
- 一打开控制台窗口就中文输入_一起来玩SiFive的RISCV平台,玩转起来就免费得
- 程序员代码面试指南刷题--第五章.字符串的调整II
热门文章
- 华为畅享7鸿蒙,华为畅享7开箱图赏:做工配置表现不俗
- [Minitab]如何製作柏拉圖(Pareto chart)?
- dfuse Labs——展示 dfuse 的力量
- matlab syms符号变量
- SSM框架流浪动物管理系统宠物寄样收养领养宠物收容所管理(idea开发javaweb-javaee-j2ee-springboot)
- Linux路由选择与策略路由
- [置顶]CHENEY-YANG'S BLOG(cheney-yang)
- PAT1150 Travelling Salesman Problem
- 刚入职的新人如何快速了解公司业务--转载
- 梅特勒托利多xk3124电子秤说明书_托利多电子秤设置说明