操作系统死锁产生、条件、和解锁

deadlocks(死锁)  

  所谓死锁<DeadLock>: 是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等竺的进程称为死锁进程.

  由于资源占用是互斥的,当某个进程提出申请资源后,使得有关进程在无外力协助下,永远分配不到必需的资源而无法继续运行,这就产生了一种特殊现象死锁。

  一种情形,此时执行程序中两个或多个线程发生永久堵塞(等待),每个线程都在等待被其他线程占用并堵塞了的资源。例如,如果线程A锁住了记录1并等待记录2,而线程B锁住了记录2并等待记录1,这样两个线程就发生了死锁现象。

  计算机系统中,如果系统的资源分配策略不当,更常见的可能是程序员写的程序有错误等,则会导致进程因竞争资源不当而产生死锁的现象。

 产生死锁的原因主要是:

  (1) 因为系统资源不足。

  (2) 进程推进的顺序不合适。

  (3) 资源分配不当等。

  如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则

  就会因争夺有限的资源而陷入死锁。其次,进程推进顺序与速度不同,也可能产生死锁。

 产生死锁的四个必要条件:

  (1) 互斥条件:一个资源每次只能被一个进程使用。

  (2) 不剥夺条件(非抢占):一个进程因请求资源而阻塞时,对已获得的资源保持不放。

  (3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。

  (4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

  这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之

  一不满足,就不会发生死锁。

 死锁的解除与预防

  理解了死锁的原因,尤其是产生死锁的四个必要条件,就可以最大可能地避免、预防和解除死锁。所以,在系统设计、进程调度等方面注意如何不让这四个必要条件成立,如何确定资源的合理分配算法,避免进程永久占据系统资源。此外,也要防止进程在处于等待状态的情况下占用资源,在系统运行过程中,对进程发出的每一个系统能够满足的资源申请进行动态检查,并根据检查结果决定是否分配资源,若分配后系统可能发生死锁,则不予分配,否则予以分配 。因此,对资源的分配要给予合理的规划。

  一、有序资源分配法

  这种算法资源按某种规则系统中的所有资源统一编号(例如打印机为1、磁带机为2、磁盘为3、等等),申请时必须以上升的次序。系统要求申请进程:

  1、对它所必须使用的而且属于同一类的所有资源,必须一次申请完;

  2、在申请不同类资源时,必须按各类设备的编号依次申请。例如:进程PA,使用资源的顺序是R1,R2; 进程PB,使用资源的顺序是R2,R1;若采用动态分配有可能形成环路条件,造成死锁。

  采用有序资源分配法:R1的编号为1,R2的编号为2;

  PA:申请次序应是:R1,R2

  PB:申请次序应是:R1,R2

  这样就破坏了环路条件,避免了死锁的发生

  二、银行算法

  避免死锁算法中最有代表性的算法是Dijkstra E.W 于1968年提出的银行家算法:

  该算法需要检查申请者对资源的最大需求量,如果系统现存的各类资源可以满足申请者的请求,就满足申请者的请求。

  这样申请者就可很快完成其计算,然后释放它占用的资源,从而保证了系统中的所有进程都能完成,所以可避免死锁的发生。

 死锁排除的方法

  1、撤消陷于死锁的全部进程;

  2、逐个撤消陷于死锁的进程,直到死锁不存在;

  3、从陷于死锁的进程中逐个强迫放弃所占用的资源,直至死锁消失。

  4、从另外一些进程那里强行剥夺足够数量的资源分配给死锁进程,以解除死锁状态

时间: 2024-11-25 02:26:31

操作系统死锁产生、条件、和解锁的相关文章

允许进行DML操作的视图条件

视图可以屏蔽某些基表的信息,或是join多个基表组成一个复杂查询,视图本身也是可以进行DML操作,但受一些条件的限制. 首先我们看下官方文档对视图进行DML操作的要求说明: The following notes apply to updatable views: An updatable view is one you can use to insert, update, or delete base table rows. You can create a view to be inhere

Jquery 操作DropDownList 根据条件选中

$("#<%=DDLCounty.ClientID%> option").each(function () { if ($(this).text() == $("#<%=HFCounty.ClientID%>").val()) { $(this).attr("selected", true); } });

【转载】同步和互斥的POSIX支持(互斥锁,条件变量,自旋锁)

上篇文章也蛮好,线程同步之条件变量与互斥锁的结合: http://www.cnblogs.com/charlesblc/p/6143397.html 现在有这篇文章: http://blog.csdn.net/goodluckwhh/article/details/8564319 POSIX定义了一系列同步对象用于同步和互斥.同步对象是内存中的变量属于进程中的资源,可以按照与访问数据完全相同的方式对其进行访问.默认情况下POSIX定义的这些同步对象具有进程可见性,即同步对象只对定义它的进程可见:

linux多线程-互斥&amp;条件变量与同步

多线程代码问题描述 我们都知道,进程是操作系统对运行程序资源分配的基本单位,而线程是程序逻辑,调用的基本单位.在多线程的程序中,多个线程共享临界区资源,那么就会有问题: 比如 #include <pthread.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> int g_val = 10; void * test1(void* args) { g_val = 20; printf(&

使用互斥量和条件变量实现线程同步控制

管程(monitor)说明 在并发编程中,管程(monitor)是一个同步构件,管程实现了同一时间点,最多只有一个线程可以执行管程的某个子程序.与那些通过修改数据结构实现互斥访问的并发程序设计相比,管程的实现很大程度上简化了程序设计. 管程可以确保一次只有一个进程执行管程中的程序,因此程序员不需要显式地编写同步代码,但是如果需要就某些特定条件上的同步,则需要定义一些条件结构(condition variable)来实现,并且对条件变量的操作仅有wait()和signal(),如下: condit

【操作系统-死锁】死锁发生的条件是什么?死锁的避免和预防方法

digest:本文章简要概述操作系统死锁的原因以及预防和解决方法. 1.死锁的定义 死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种进程间相互阻塞的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程.                                                                ——汤小丹等.<计算机操作系统>:西安电子科技大学出版社,2012.

条件变量的陷阱与思考

一.前言 在多线程编程中,互斥锁与条件变量恐怕是最常用也是最实用的线程同步原语. 关于条件变量一共也就pthread_cond_init.pthread_cond_destroy.pthread_cond_wait.pthread_cond_timedwait.pthread_cond_signal.pthread_cond_broadcast这么几个函数,但是在实际使用中却是很容易用错,后文将来分析几种常见使用情况的正确性. 二.分析 下面是一个辅助基类.便于减少篇幅(由于简单起见,后文中的所

线程开发中的资源操作

理论: 临界资源 PV操作:通过信号量机制进行维护关系资源的安全---看看操作系统.... 任务对资源进行操作,为了安全要加锁,锁加载临界资源操作上(也就是对共享资源的操作) 加锁 共享资源操作 解锁 编程模型: 1.通过锁 2.threadLocal 3.final 例子: public static void main(String[] args) { JobLanuch jobLanuch = new JobLanuch(); Task_A task_a = new Task_A(jobL

thinkphp-数据库操作

1 数据库查询 ThinkPHP内置了非常灵活的查询方法,可以快速的进行数据查询操作. 查询条件可以用于CURD等任何操作,作为where方法的参数传入即可. 1.1 ThinkPHP可以支持直接使用字符串作为查询条件,但是大多数情况推荐使用索引数组或者对象来作为查询条件,因为会更加安全. 查询方式 一.使用字符串作为查询条件这是最传统的方式,但是安全性不高,例如: $User = M("User"); // 实例化User对象 $User->where('type=1 AND