死锁问题入门知识
今天我们一起来学习死锁,一起沐黎文伟老师的春风(我的操作系统老师叫做黎文伟),呵呵呵。
什么是死锁:
是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。
产生死锁的原因主要是:
因为系统资源不足。
进程运行推进的顺序不合适。
资源分配不当等。
如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则
就会因争夺有限的资源而陷入死锁。其次,进程运行推进顺序与速度不同,也可能产生死锁。
死锁出现的必要条件:
互斥使用(资源独占)
一个资源每次只能给一个进程使用
不可强占(不可剥夺)
资源申请者不能强行的从资源占有者手中夺取资源,资源只能由占有者自愿释放
请求和保持(部分分配,占有申请)
一个进程在申请新的资源的同时保持对原有资源的占有(只有这样才是动态申请,动态分配)
循环等待
存在一个进程等待队列
{P1 , P2 , … , Pn},
其中P1等待P2占有的资源,P2等待P3占有的资源,…,Pn等待P1占有的资源,形成一个进程等待环路
资源分配图:
资源分配图用来精确描述系统资源分配场景(死锁)
资源分配图标识:
1、节点:进程节点P(每一个进程有一个节点),资源节点R(每一类有一个节点)
2、边:请求边(从进程节点指向资源节点),分配边()
画法:
Process:
Resource Type with 4 instances:
资源分配图的观察:
1、无环无死锁
2、有环可能死锁
a) 所有资源都是单资源实例
b) 多类资源,有一个资源有一个实例,其他资源有多个实例;环所涉及的资源只有一个实例
c) 无环一定无死锁
死锁实例:
活锁
如果有太多进程或操作在短时间内大量请求同一资源出现了活锁;
特点:
好像停滞了,但可以解开;
数据库例子:如果食物T1封锁了数据R,事务T2又请求封锁R,于是T2等待。T3也请求封锁R,当T1释放了R上的封锁之后系统首先批准了T3的请求,T2仍然在等待。然后T4又请求封锁R,当T3释放了R上的封锁之后系统又批准了T4的请求,……,T2有可能永远等待,这就是活锁的情形
网络的例子:中断活锁;
网卡速率变化导致数据包处理方式的变化
中断->轮询
三种处理死锁的方式:
1、死锁的预防和避免
预防:防止死锁出现;
避免:评估死锁是否会发生进行评估,如果有可能则不执行;
2、死锁的检查和恢复
3、鸵鸟策略:不管它,忽略
鸵鸟策略看似可笑,但是应用还是比较广泛的:
数学家观点(理论型,完美主义者):
希望世界完美无缺
有问题就必须处理,无论任何代价
工程师观点(实践):
能够工作就可以
有问题(死锁):频率、危害、处理代价进行比较
死锁频率<其他故障频率
处理代价>大于处理代价
死锁避免和预防方法:
1、消除互斥——非共享资源必须互斥访问,可共享资源无需互斥访问。
(什么是共享?现代操作系统中,几乎所有的资源都是共享的,但这样的共享只是宏观意义上的,微观上,共享分为分时共享如CPU、打印机,和同时共享如只读文件)
2、消除持有并等待——进程请求资源时不持有任何资源
执行前请求所有资源(不一定可行,因为一个进程执行前,不一定知道自己需要多少资源)
在请求资源前先释放所有资源
这个方式的缺点:有可能一个进程申请了资源但很久才用,有可能一个进程需要多个资源,不是所有资源都不是一次性能申请到的;
3、消除非抢占——请求的资源不可得时已持有的资源可被抢占(隐式释放)
这样的方式只能用于一些特殊情况:只能用于状态可以保存和恢复的资源
4、循环等待条件的消除
以上就是今天给大家补的知识~~希望以后继续跟大家共同进步~~~
<!--EndFragment-->
相关推荐
本资料包是针对多线程入门的学习资源,涵盖了多线程的基础概念、创建与管理以及同步控制等多个方面。 首先,让我们了解什么是多线程。在单线程系统中,程序的执行是顺序的,而多线程则允许在一个进程中同时运行多个...
本书首先会介绍Java并发编程的基础概念,包括线程的创建与管理、同步机制如synchronized关键字和Lock接口,以及如何避免常见的并发问题,如死锁、活锁和饥饿。这些基础知识是理解并发编程的基石,通过深入浅出的讲解...
这份资料集主要涵盖Java基础知识、初学者入门指南以及常见的Java面试题,旨在帮助学习者系统地理解和掌握Java的核心概念。 首先,Java基础知识是理解任何Java程序的基础。这包括: 1. **Java环境搭建**:学习如何...
理解线程同步和互斥,以及如何处理死锁等问题,是提高程序并发性能的关键。 8. **进阶知识点**:除了基础概念,进阶知识点可能包含反射、IO流、网络编程、设计模式等。反射允许程序在运行时动态访问类的信息,IO流...
本书《深入浅出Oracle:DBA入门、进阶与诊断案例》由盖国强编著,由人民邮电出版社出版,旨在为初学者提供全面的Oracle数据库管理入门知识,并为有一定经验的DBA提供进阶技巧和实际案例分析。 首先,本书开篇可能会...
在精通阶段,你将深入到Oracle的并发控制机制,如多版本并发控制(MVCC)和事务管理,这将有助于理解并发操作中的死锁和锁定问题。性能调优是Oracle学习的重要部分,包括SQL优化、索引策略、表分区、物化视图以及...
Java并发编程是Java开发中的重要领域,特别是在大型分布式系统、多线程应用和服务器端程序设计中不可或缺。这个资源包“Java并发编程从入门到...通过实践和调试源码,可以更好地掌握这些知识点,提高解决问题的能力。
Java是一种广泛使用的面向对象的...总的来说,这个"java入门基础课件"涵盖了Java编程的关键知识点,从基础语法到高级特性,都是学习Java必不可少的内容。通过深入学习和实践,初学者可以逐步成长为熟练的Java开发者。
* Java程序死锁问题原理及解决方案 * 线程锁技术 * 定时器、互斥、同步通信技术 * 多个线程之间共享数据的方式探討 * 使用JDK5中同步技术的3个面试题 集合框架 * 集合框架基础 * Collection接口 * List接口 * Set...
### Java基础入门核心知识点概览 #### 1. Java简介与安装 - **Java概述**:介绍Java的历史背景和发展趋势,以及Java的特点,如平台无关性、面向对象特性等。 - **JDK/JRE/JVM的区别**:解释Java Development Kit...
8. **J2SE学习笔记(7)多线程.DOC**:多线程是并发编程的关键,这部分可能会讲解线程的创建、同步、生命周期管理以及死锁问题。 这些笔记为学习J2EE打下了坚实的基础。一旦掌握了J2SE,就可以进一步学习J2EE的...
- **事务与锁机制**:介绍事务处理的基础知识,包括ACID属性、隔离级别选择,以及锁的类型和如何避免死锁等问题。 ### 安全性与备份恢复 - **权限管理**:讲解如何设置用户权限,确保数据库的安全访问控制。 - **...
通过深入学习以上知识点,并结合《Oracle 11g从入门到精通》这本书的PDF内容,你可以系统地掌握Oracle 11g数据库的使用和管理,从而在实际工作中游刃有余。在实践中不断巩固理论知识,你将能够成为一个熟练的Oracle...
**Zookeeper系列1:入门** Zookeeper是一款分布式协调服务,由Apache基金会开发,广泛应用于分布式系统中的数据共享、配置管理、命名服务、集群同步等场景。它的设计目标是简化分布式环境下的复杂问题,提供高可用...
本教程将带你深入了解数据库的基本概念,帮助你轻松入门,并通过一系列简单应用实例让你掌握实际操作。 一、数据库基础 1. 数据库定义:数据库是一个有组织的数据集合,它能提供数据的存储、查询、更新和管理等功能...
这是Java开发者需要具备的核心知识之一,因为不当的内存管理可能会导致内存泄漏等问题。 整体来看,这份Java入门笔记是一份非常详尽的参考资料,适合初学者和有一定基础的开发者深入学习Java语言及其相关技术。通过...
在“Windows应用程序开发入门到精通十四:复杂的问题,一流的解决方案”这一主题中,我们主要探讨的是在Windows平台上进行应用程序开发的一些高级技术和策略,用于解决在实际开发过程中可能会遇到的复杂问题。...
以下是一些关于"Java新手入门"的关键知识点: 1. **Java环境设置**:在开始编程之前,你需要安装Java Development Kit (JDK)。JDK包含了编译Java源代码所需的Java编译器(javac)和其他工具。安装后,还需要配置...
《SQL SERVER 2008从入门到精通》是一本专为初学者和进阶者设计的教程,全面覆盖了SQL Server 2008的各项核心功能和实用技术。SQL Server是微软公司推出的一种关系型数据库管理系统,广泛应用于数据存储、分析和报表...