死锁的定义 必要条件和处理方法

(一)死锁的定义

    如果一组进程中的每一个进程都在等待仅由该组进程中的其他进程才能引发的事件,那么该组进程是死锁的(Deadlock)。

(二)产生死锁的必要条件

    虽然进程在运行过程中可能会发生死锁,但产生死锁是必须具备一定条件的。产生死锁必须同时具备下面四个必要条件,只要其中任意一个条件不成立,死锁就不会产生:

      (1)互斥条件。进程对所分配到的资源进行排他性使用,即在一段时间内,某资源只能被一个进程占用。如果此时还有其他进程请求该资源,则请求进程只能等待,直至占有该资源的进程用毕释放。

      (2)请求和保持条件。进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已被其他进程占有,此时请求进程被阻塞,但对自己以获得的资源保持不放。

      (3)不可抢占条件。进程已获得的资源在未使用完之前不能被抢占,只能在进程使用完时由自己释放。

      (4)循环等待条件。在发生死锁时,必然存在一个进程—资源的循环链,即进程集合{P0,P1,P2,P3,...,Pn}中的P0正在等待P1占用的资源,P1正在等待P2占用的资源,... ... ,Pn正在等待已被P0占用的资源。

(三)处理死锁的方法

    (1)预防死锁。该方法是通过设置某些限制条件,去破坏产生死锁的四个必要条件中的一个或几个来预防产生死锁。

    (2)避免死锁。在资源的动态分配过程中,用某种方法防止系统进入不安全状态,从而可以避免产生死锁。

    (3)检测死锁。通过检测机构及时地检测出死锁的发生,然后采取适当的措施,把进程从思索中解脱出来。

    (4)解除死锁。当检测到系统中已发生死锁时,就采取相应的措施,将进程从死锁状态中解脱出来。常用方法是---撤销一些进程,回收他们的资源,将他们分配给已处于阻塞状态的进程,使其能继续运行。

      

    

    

时间: 2024-11-05 12:09:50

死锁的定义 必要条件和处理方法的相关文章

什么是死锁及死锁的必要条件和解决方法【转】

转自:http://blog.csdn.net/abigale1011/article/details/6450845/ 来自:http://blog.163.com/[email protected]/blog/static/128388169200982444858590/?fromdm&fromSearch&isFromSearchEngine=yes 进程死锁及解决办法 操作系统 2009-09-24 16:48:58 阅读767 评论1   字号:大中小 订阅 一.要点提示 (1

定义一个包含增强方法的javaBean(最终增强)

使用Schema 1.AroundLogger类 1 //定义一个包含增强方法的javaBean 2 public class AroundLogger{ 3 //注解方式的环绕增强处理 4 private static final Logger log = Logger.getLogger(AroundLogger.class); 5 public Object aroundLogger(ProceedingJoinPoint jp){ 6 log.info("a调用"+jp.get

C#1(.net和C#的关系、VS与.net的对应关系、VS2012常用的几种应用程序、C#定义一个类的方法、类页面内容的解释、定义Person的类、调用Person类的方法、命名规范、数值类型)

1..net和C#的关系 .net是一个开发平台,C#是应用在.net平台上的一种语言.   2.VS与.net的对应关系  3.VS2012常用的几种应用程序 第一种是Windows窗体应用程序,也即是我们常用的C/S端的应用软件: 第二种是控制台应用程序,主要是用来学习调试C#代码的(老师上课应用的模式): 第三种是空Web应用程序,建立空的网页模式,B/S模式: 第四种是Web 窗体应用程序,建立后会生成一些常用的网页组件和功能,例如JS.image等,也是B/S模式. 4.C#定义一个类

ActionBar自己定义改动无效解决方法

假设程序支持API11下面的版本号,那么须要改动多个地方 values-v14 和values-v11以下的styles中也要写上 <style name="AppTheme" parent="AppBaseTheme">        <!-- All customizations that are NOT specific to a particular API-level can go here. -->        <item

Java基础---如何定义Java中的方法(三十五)

如何定义 Java 中的方法 所谓方法,就是用来解决一类问题的代码的有序组合,是一个功能模块. 一般情况下,定义一个方法的语法是: 其中: 1. 访问修饰符:方法允许被访问的权限范围, 可以是 public.protected.private 甚至可以省略 ,其中 public 表示该方法可以被其他任何代码调用,其他几种修饰符的使用在后面章节中会详细讲解滴 2. 返回值类型:方法返回值的类型,如果方法不返回任何值,则返回值类型指定为 void :如果方法具有返回值,则需要指定返回值的类型,并且在

“ASP.default_aspx”并不包含“DropDownList1_SelectedIndexChanged”的定义,其解决方法。

在使用DropDownList控件的DataBind方法,将ArrayList数组绑定在DropDownList空间中,执行程序, 出现错误: 错误 : "ASP.default_aspx"不包含"DropDownList1_SelectedIndexChanged"的定义,并且找不到可接受类型为"ASP.default_aspx"的第一个参数的扩展方法"DropDownList1_SelectedIndexChanged"(

protobuf extensions(extend)的消息定义及Java使用方法

在定义protobuf消息时,有时候需要用到extensions来对原有的消息类型进行扩展,有利于消息定义的重复使用. 1.下面写一个最简单的例子,定义一个message BaseData,并对其进行扩展: Example.proto: // 定义一个message BaseData,100~199之间的tag可供扩展 message BaseData { required int32 code = 1; extensions 100 to 199; } // 扩展BaseData,加上一个ex

MySQL定义外键的方法

MySQL定义外键的方法是每个学习MySQL的人都需要掌握的知识,下文就对MySQL定义外键的语句写法进行了详细的阐述,供您参考. 外键为MySQL带来了诸多的好处,下面就为您介绍MySQL定义外键的语句写法,以及MySQL定义外键过程中出现错误的处理方法,供您参考学习. mysql> CREATE TABLE categories ( -> category_id tinyint(3) unsigned NOT NULL AUTO_INCREMENT, -> name varchar(

c++学习笔记之基础---类内声明函数后在类外定义的一种方法

在C++的“类”中经常遇到这样的函数, 返回值类型名 类名::函数成员名(参数表){ 函数体.} 双冒号的作用 ::域名解析符!返回值类型名 类名::函数成员名(参数表) { 函数体. } 这个是在类内声明函数后在类外定义的一种方法!如果不加"类名::"的话,编译系统就不会知道你的函数属于哪个类;另外,这样定义函数一定要在类中声明之后,说明它是类的成员函数才可以!在类内声明的时候就不需要::了,直接 返回值类型 函数名(参数表) 就可以了!