博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
操作系统(八) 死锁
阅读量:5225 次
发布时间:2019-06-14

本文共 1174 字,大约阅读时间需要 3 分钟。

  如果一个正在等待的进程所申请的资源被其他等待进程占有,那么该等待进程有可能无法改变状态,这种情况称为死锁。

  当一组进程的每个进程等待一个事件,而这一事件只能由这一组进程的另一进程引起,则这组进程处于死锁状态。

 

一、系统模型

  系统拥有一定数量的资源,资源分成多种类型,每种类型有一定数量的实例。

  进程在使用资源前必须申请资源,在使用资源之后必须释放资源。

  开发多线程应用必须特别关注这个问题,因为多个线程可能因为竞争共享资源而容易产生死锁。

 

二、死锁的特点

  1、必要条件

  • 互斥:至少有一个资源必须处于非共享模式,即一次只有一个进程使用。如果另一资源申请该资源,那么申请进程必须延迟直到该资源释放为止。
  • 占有并等待:一个进程必须至少占有一个资源,并等待另一资源,而该资源为其他进程所占有。
  • 非抢占:资源不能被抢占,只有在进程完成其任务之后,才会释放其资源。
  • 循环等待:一组进程中一个进程等待的资源被另一个进程占有。

 

  2、资源分配图

  死锁问题可以用系统资源分配图的有向图进行更精确的描述。

  资源分配图中有两种节点和两种边。节点为:系统活动进程、系统所有资源;边为:申请边和分配边。

 

  可以证明,如果资源分配图中没有环,那么系统就没有进程死锁,如果有环,就可能存在死锁。

  如果每个资源有多个实例,那么有环不一定会出现死锁。这时只是必要条件。

  死锁出现的充要条件:

  如果每个资源类型只有一个实例,那么有环就意味着出现死锁;

  如果环涉及到一组资源类型,而每个类型只有一个实例,那么就出现了死锁

 

三、死锁的处理方法

  从原理上分析,有三种方式可以处理死锁:

  • 可以使用协议预防或避免死锁,确保系统不会进入死锁状态;
  • 可允许系统进入死锁状态,然后检测它,加以恢复;
  • 忽视这个问题,认为死锁不可能在系统内发生。

 

  死锁预防,确保至少一个必要条件不成立;

  死锁避免,要求系统事先得到有关进程申请资源和使用资源的额外信息,有了这些额外信息,可确定:对于一个申请,进程是否应等待。

 

四、死锁预防

  出现死锁有四个必要条件,确保至少一个不成立,就能预防死锁发生。

五、死锁避免

  死锁避免算法比预防算法要求低些,只要事先了解进程使用资源的情况即可。

  1、安全状态——按特定顺序为进程分配资源

  2、资源分配图算法

  3、银行家算法——需要知道每个进程所请求的每种资源的最大数量。

 

六、死锁检测

  一个系统如果既没有死锁预防也没有死锁避免,则应该提供:

  • 一个用来检查系统状态从而确定是否出现死锁的算法;
  • 一个用来从死锁状态中恢复的算法;

七、死锁恢复

  1、进程终止;

  2、资源抢占

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  

转载于:https://www.cnblogs.com/bigbigbigo/p/8641297.html

你可能感兴趣的文章
.net 文本框只允许输入XX,(正则表达式)
查看>>
Python 第四十五章 MySQL 内容回顾
查看>>
实验2-2
查看>>
String,StringBuffer与StringBuilder的区别?? .
查看>>
MongoDB遇到的疑似数据丢失的问题。不要用InsertMany!
查看>>
android smack MultiUserChat.getHostedRooms( NullPointerException)
查看>>
实用的VMware虚拟机使用技巧十一例
查看>>
监控工具之---Prometheus 安装详解(三)
查看>>
不错的MVC文章
查看>>
IOS Google语音识别更新啦!!!
查看>>
[置顶] Linux终端中使用上一命令减少键盘输入
查看>>
BootScrap
查看>>
路冉的JavaScript学习笔记-2015年1月23日
查看>>
Mysql出现(10061)错误提示的暴力解决办法
查看>>
2018-2019-2 网络对抗技术 20165202 Exp3 免杀原理与实践
查看>>
NPM慢怎么办 - nrm切换资源镜像
查看>>
Swift - UIView的常用属性和常用方法总结
查看>>
Swift - 异步加载各网站的favicon图标,并在单元格中显示
查看>>
【Python学习笔记】1.基础知识
查看>>
梦断代码阅读笔记02
查看>>