死锁

7.1 系统模型

定义:多个进程竞争一定数量的资源,某个进程申请资源,若此时该资源不可用,则进程进入等待状态。若所申请的资源被其他等待进程占用,则该等待进程可能再也不法改变其状态。

进程使用资源的顺序

(1)申请,若申请不能立即被允许,则申请进程必须等待直至获得资源;(若进程所申请的资源正被其他进程使用,则该进程会增加到该资源的等待队列)

(2)使用:进程对资源操作;

(3)释放;

 

7.2 死锁特征

7.2.1 必要条件

(1)互斥:至少有一个资源必须处于非共享模式,一次只有一个进程在使用。

(2)占有并等待:一个进程必须占有至少一个资源,并等待另一个资源,而该资源被其他进程所占用。

(3)非抢占:资源只能在进程完成任务后自动释放。

(4)循环等待:设有一组等待进程P={P0,P1....Pn},P0等待的资源被P1所占用,P1等待的资源被P2所占有,....,Pn等待的资源被P0占有。

     4个条件必须同时满足才会出现死锁

 

7.2.2 资源分配图

若分配图没有环,则无进程死锁;若有环,则可能存在死锁

若每个资源类型刚好有一个实例,则环为死锁存在的充分必要条件;

若有多个实例,则为必要条件而非充分条件。

(资源类型:如打印机,DVD驱动器     2个资源类型)

(实例:3台打印机,则打印机这一资源类型有3个实例)

 

7.3 死锁预防

7.3.1 互斥:

         对于非共享资源,必须互斥;对于共享资源,不要求互斥,不会发生死锁。故通常无法通过否定互斥条件预防死锁

 

7.3.2 占有并等待:

         根本原则:当一个进程申请一个资源时,它不能占有其他资源

         协议一:每个进程在执行前申请并获得所有资源

         eg:考虑一个进程,将数据从DVD驱动器复制到磁盘文件,并对磁盘文件进行排序,再将结果打印至打印机。则按照协议一,进程必须一开始申请DVD,磁盘文件和打印机。

         协议二:进程在申请更多资源之前,必须释放其现已分配的所有资源

         eg:同样之前进程,按照协议二,允许进程在开始时只申请DVD和磁盘文件,将数据从DVD复制到磁盘,再释放它们。然后,进程再申请磁盘文件和打印机。

 

7.3.3 非抢占

         协议:如果一个进程占有资源并申请另一个不能立即分配的资源,则它当下所占的资源被隐式地释放了,即其现已分配的资源都可被抢占

         执行过程:进程P申请资源s,首先检查s是否可用,若可以,则s被分配。若不可以,则检查是否有其他正在等待的进程占有资源s。若有,则抢占。若资源s不可用也不被其他等待进程占有,则申请进程P等待,即进程P现在持有的资源也可被其他进程抢占。

         一个进程要重新执行,必须分配到其所申请的资源,并恢复其在等待时被抢占的资源。

 

7.3.4 循环等待:

        方法:对所有资源进行完全排序,且要求每个进程按递增的顺序申请资源。如果需要同一资源类型的多个实例,则对它们必须一起申请

        eg:

设R={R1,R2,R3,…,Rn}为资源类型的的集合。为每个资源类型分配一个唯一整数来允许比较两个资源以确定其先后顺序。可定义一个函数F:R -> N ,其中N是自然数集合,例如:

F(tape drive)=1 

F(disk drive)=5 

F(printer)=12

每个进程只按照递增顺序申请资源,即一个进程开始可以申请任意数量的资源类型为Ri的实例。之后,当且仅当F(Rj)> F(Ri)时,该进程可以申请资源Rj的实例。

例如,对于以上给定函数,一个进程如果同时需要打印机和磁带驱动器,那么就必须先申请磁带驱动器,再申请打印机。换句话说,要求当一个进程申请资源类型Rj时,必须先释放所有Ri(F(Ri)> F(Rj))。可以使用反证法证明,使用这两个协议,那么循环等待就不可能成立。

设计一个完全排序或层析并不能防止死锁,而是要靠应用程序员来按顺序编写程序。另外函数F应该根据系统内资源使用的正常顺序来定义。例如,由于磁带通常在打印机之前使用,所以定义F(tape drive)< F(printer)较为合理。

 

7.4 死锁避免

7.4.1 安全状态

若系统能按照某个顺序为每个进程分配资源(不超过最大值)并可避免死锁,则系统处于安全状态。(存在一个安全序列)

进程顺序{P1, P2, …, Pn},如果对于每个Pi,Pi仍然可以申请的资源数小于当前可用资源加上所有进程Pj(其中j小于i)所占用资源,那么这一顺序称为安全序列。

进程Pi所需要的资源即使不能立即使用,那么Pi等待直到所有Pj释放其资源,当它们完成时,Pi可得到其所需要的所有资源。

不安全状态可能导致死锁,只要状态为安全,操作系统就能避免不安全(和死锁)状态。

在不安全情况下,操作系统不能阻止进程以会导致死锁的方式申请资源。进程行为控制了不安全状态。如图所示:

死锁避免算法思想:

开始时,系统处于安全状态。当进程申请一个可用的资源时,系统必须确定这一资源申请可以立即分配还是等待。只有分配后使系统仍处于安全状态才允许申请。

 

7.4.2 资源分配图算法(适用于每种资源类型只有一个实例)

利用资源分配图,引入需求边Pi->Rj(虚线)表示进程Pi可能在将来某个时候申请资源Rj。只有申请边变为分配边而不会导致资源分配图形成环时,才允许申请。

如果没有环存在,那么会使得系统处于安全状态,如果有环存在则分配会导致系统处于不安全状态。

例如:

 

这里写图片描述

 

假如进程p2申请资源R2。虽然R2现在可用,但是不能分配给P2,因为这会创建一个环,环表示系统处于不安全状态,如果P1再申请R2就会造成死锁。

 

7.4.3 银行家算法(适用于每种资源类型有多个实例)

举例:

假定系统中有4个进程P1、P2、P3、P4和3种类型的资源R1、R2、R3,数量分别为9、3、6,在t0时刻的资源分配情况如表所示。

t0时刻的资源分配表:

这里写图片描述

试问:

Max:最大需求     Available:每种资源现有的(未被分配)的量     Allocation:每个进程现在拥有的各个资源类型的量

Need: 每个进程还需要的剩余资源

(1)t0时刻是否安全?

(2)P2发出请求向量Request2(1,0,1),系统能否将资源分配给它?Ps:Request i 为进程Pi的请求向量

(3)在P2申请资源后,若P1发出请求向量Request1(1,0,1),系统能否将资源分配给它?

(4)在P1申请资源后,若P3发出请求向量Request3(0,0,1),系统能否将资源分配给它?

解答:

(1)安全序列:P2、P1、P3、P4

(2)可以分配,因为分配资源后可找到一安全序列:P2、P1、P3、P4

(3)不能分配,因为request1(1,0,1)>available(0,1,1)

(4)不能分配,因为分配资源后找不到一安全序列。

 

 

安全性算法

确定计算机是否处于安全状态需要以下几步:

  • 1 创建Work 和 Finish 向量,长度分别为m,n,并且Work = Avallable,将Finish的每一项置为false

  • 2 查找是否存在这样的i使得满足:   //寻找是否有可以满足其需求的进程

    Finish[i] = false

    Needi <= Work

如果不存在则跳到第四步。

  • 3                                                      //若存在就让该进程执行,执行完后释放资源

    Work = Work + Allocationi

    Finish[i] = true

跳回第二步

  • 4 如果对所有的i,Finish[i] = true,那么系统处于安全状态。  //若可以使所有进程执行完,则安全

 

资源请求算法

设Requesti为进程Pi的请求向量。即如果Requesti[j] == k ,那么Pi所需要资源类型Rj的实例数量为k。

当进程Pi做出资源申请时,采取如下动作:

  • 1 如果Requesti < Needi,那么进行下一步(2),否则产生出错条件,因为已经超过了其最大请求

  • 2 如果Requesti < Available,那么进行下一步(3),否则Pi必须等待,因为没有可用的资源

  • 3 假定系统可以分配给进程Pi所需的资源,并按如下方式修改状态:

Available = Available - Requesti

Allocationi = Allocationi + Requesti

Needi = Needi - Requesti

如果所产生的资源分配状态是安全的,那么交易完成且进程Pi可分配到其所需要的资源。

然而,如果新状态不安全,那么进程Pi必须等待Requesti并回复到原资源分配状态。

 

7.5 死锁检测

7.5.1 每种资源类型只有单个实例

将资源分配图转为等待图:删除所有资源类型节点。

等待图中由Pi到Pj的边意味着进程Pi等待进程Pj释放一个Pi所需的资源。

当且仅当等待图中有环,系统中存在死锁。

 

7.5.2 每种资源类型有多个实例

  • 1 创建Work 和 Finish 向量,长度分别为m,n,并且Work = Avallable,将Finish的每一项置为false

  • 2 查找是否存在这样的i使得满足:

    Finish[i] = false

    Requesti <= Work

如果不存在则跳到第四步。

  • 3

    Work = Work + Allocationi

    Finish[i] = true

跳回第二步

  • 4 如果对所有的i,Finish[i] == false,那么系统处于死锁状态。而且进程Pi死锁

 

7.6 死锁恢复

法1:终止一个或多个进程以打破循环等待;

法2:从一个或多个死锁进程抢占一个或多个资源。

7.6.1 进程终止

(1)终止所有死锁进程:代价大

(2)一次只终止一个进程直到取消死锁循环:开销大,不断调用死锁检测算法

 

7.6.2 资源抢占

三个问题需要处理:

①选择一个牺牲品:抢占哪些资源和哪个进程?必须确定抢占顺序以使代价最小化。

②回滚:如果从一个进程那里抢占一个资源,那么应对该进程做些什么安排?必须将这个进程回滚到某个安全状态,以便以后重启进程

最简单的方法是完全回滚终止进程并重新执行更为有效的方法是将进程回滚到足够打破死锁。另一方面,这种方法要求系统维护有关运行进程状态的更多信息。

③饥饿:如何确保不会发生饥饿?最为常用的方法是在代价因素中加上回滚次数。

转载于:https://www.cnblogs.com/dzy521/p/9462902.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/367823.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql lepus_MySQL 监控软件lepus天兔

概述类别版本操作系统Centos 7.4数据库版本MySQL 5.6.49天兔版本lepus 3.7依赖软件1.MySQL 5.0及以上(必须,用来存储监控系统采集的数据)2.Apache 2.2及以上 (必须,WEB服务器运行服务器)3.PHP 5.3以上 (必须,提供WEB界面支持)4.Python2 (必须,推荐2.6及以上版本,执行数据采集和…

模式的秘密--工厂模式

工厂模式概念&#xff1a; 实例化对象&#xff0c;用工厂方法代替new操作工厂模式包括工厂方法模式和抽象工厂模式抽象工厂模式是工厂方法模式的扩展工厂模式的意图&#xff1a; 定义一个接口创建对象&#xff0c;但是让子类决定哪些类需要被实例化。工厂方法把实例化的工作推迟…

Html5移动开发之Localstorage(本地存储)

HTML5本地存储Localstorage自从Html5中出现了本地存储的&#xff08;LocalStorage)的概念后&#xff0c;很多人都会想这个东西和我们传统web开发中的Cookie有什么特别之处&#xff0c;当然笔者也是其中之一&#xff0c;也难怪&#xff0c;以前用惯了cookie对于新出现的事物总是…

java response 获得code_Java教程分享使用HttpClient抓取页面内容

Java教程分享使用HttpClient抓取页面内容&#xff0c;使用HttpClient工具来发送Http请求1.简介HttpClient 是 Apache Jakarta Common 下的子项目&#xff0c;用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包&#xff0c;并且它支持 HTTP 协议最新的版本和…

linux mysql 5.6.23_MySQL 5.6.23升级到MySQL 5.7.9

MySQL 5.6.23升级到MySQL 5.7.9MySQL 5.7.9新特性一、安全性1.1. 用户表 mysql.user 的 plugin字段不允许为空&#xff0c; 默认值是 mysql_native_password&#xff0c;而不是 mysql_old_password&#xff0c;不再支持旧密码格式;1.2. 增加密码过期机制&#xff0c;过期后需要…

2018-03-02

1、首先我得重新在git设置一下身份的名字和邮箱&#xff08;因为当初都忘了设置啥了&#xff0c;因为遇到坑了&#xff09;进入到需要提交的文件夹底下&#xff08;因为直接打开git Bash&#xff0c;在没有路径的情况下&#xff0c;根本没&#xff01;法&#xff01;改&#xf…

查看环境变量有无配置成功等命令操作

查看环境变量有无配置成功 &#xff1a;windowR cmd set&#xff08;回车&#xff09; 现在可以看到配置成功的环境变量NVM_HOME NVM_SYMLINK等环境变量 也可以单独查看某个变量有无配置成功,例如set NVM—HOME. 转载于:https://www.cnblogs.com/JavascriptAndHtml5/p/9469932…

WildFly 8.0.0.Alpha1的发布和一些历史

自从我们发布WildFly 8.0.0.Alpha1版本以来&#xff0c; 已经过去了大约2周。 该下载位于WildFly下载页面上 。 我敢肯定&#xff0c;你们中的许多人可能会想知道WildFly是什么&#xff0c;而其中一些知道它是什么的人可能不会知道已经发布了。 我将尝试回答其中一些问题&#…

POJ 1276 Cash Machine

很容易看出来是一个背包问题&#xff0c;开始把每一张钞票都跑了一遍01背包&#xff0c;直接TLE了。 其实就是多重背包模板题。 1 //#include <bits/stdc.h>2 #include <iostream>3 #include <utility>4 #include <vector>5 #include <cstring>6…

导出mysql excel数据字典_mysql导出 Excel数据字典(全)

解决问题(有mysql数据库数据表想要将表导入到PowerDesigner 或导出Excel数据字典)一、下载工具1、工具PowerDesigner 百度自行下载安装2、mysql-connector-odbc 下载链接: https://pan.baidu.com/s/1cjb73f3GvkkMFAzZKi85xA 提取码: u5ih二、mysql数据库数据表想要将表导入到Po…

斐波那契数列算法小结

关于求解斐波那契数列&#xff0c;这是一道比较经典的题目&#xff0c;本文主要是对斐波那契数列求解方法的小结。 首先&#xff0c;定义Fibonacci数列如下&#xff1a; 方法1&#xff1a; 利用递归求解&#xff0c;这是最容易写出的算法&#xff0c;代码如下&#xff1a; #inc…

mysql yintint类型_MySQL服务器2 被嫌弃的胖子

1.sql的基本语法对数据库create database db1;  创建数据库对表&#xff1a;create database t1(id int,name char(10));  创建表show create table t1;  查看创建的t1表show tables;  查看所有的表desc t1;  查看表的详细结构对数据&#xff1a;insert into t1(id,n…

Html5表单元素-搜索框和上传文件框

1、search - 搜索框element/form/input/search.html<!doctype html><html><head> <title>search</title></head><body> <!-- search - 搜索框&#xff0c;文本框形式 --> <input type"search"…

使用AspectJ审计Spring MVC Webapp。 第2部分

现在&#xff0c;如果您有兴趣创建一个以Aspectj的Aspect和Before批注的形式使用面向方面编程&#xff08;AOP&#xff09;的Spring MVC Webapp来审核用户对屏幕的访问&#xff0c;那么这是您想要阅读的博客。 正如我在上一个博客中所说的那样&#xff0c;审核用户对屏幕的访问…

服装店管理系统打造门店拓客、促活、存留营销方案

打造门店拓客、促活和存留营销方案对于服装店的管理系统来说是非常重要的。以下是一些可行的方案&#xff1a; 1. 会员管理系统&#xff1a;引入会员管理功能&#xff0c;建立会员档案&#xff0c;跟踪会员消费记录和偏好。通过会员系统&#xff0c;可以实施积分制度、生日礼品…

mysql添加映射模块_iis7.5中让html与shtml一样支持include功能(添加模块映射)

刚开始弄得时候&#xff0c;发现了很多错误&#xff0c;其实很简单&#xff0c;参考shtm原来的设置就可以了前提条件&#xff1a;ServerSideIncludeModule的安装&#xff1a;在安装iis的时候选择上该服务(“在服务端包含文件”&#xff0c;选项)即可&#xff0c;如下&#xff1…

文件上传控件bootstrap-fileinput的使用

一、准备1、插件下载地址&#xff1a;https://github.com/kartik-v/bootstrap-fileinput/ 下载后的压缩包解压文件夹内容如下&#xff1a; js&#xff1a;插件核心js代码&#xff0c;引用fileinput.min.js/fileinput.js即可&#xff0c;默认插件语言为英文&#xff0c;如需要中…

在JPA 2.1中使用@Convert正确完成映射枚举

如果您曾经在JPA中使用过Java枚举&#xff0c;那么您肯定会意识到它们的局限性和陷阱。 使用enum作为Entity的属性通常是一个很好的选择&#xff0c;但是2.1之前的JPA不能很好地处理它们。 它给了您2 1个选择&#xff1a; 托肖夫达林 Enumerated(EnumType.ORDINAL) &#xf…

ssh架构之hibernate(一)简单使用hibernate完成CRUD

1.Hibernate简介 Hibernate是一个开放源代码的对象关系映射(ORM)框架&#xff0c;它对JDBC进行了非常轻量级的对象封装&#xff0c;它将POJO与数据库表建立映射关系&#xff0c;是一个全自动的orm框架&#xff0c;hibernate可以自动生成SQL语句&#xff0c;自动执行&#xff0c…

使用AspectJ审计Spring MVC Webapp。 第1部分

如果您像我一样&#xff0c;那么您将拥有那种编程天&#xff0c;一切似乎都进展顺利。 您编写代码和测试&#xff0c;它就可以正常工作。 然后还有其他日子&#xff0c;非常糟糕的日子&#xff0c;在那儿&#xff0c;您知道所编写的所有内容都尽可能正确&#xff0c;并且代码拒…