15.操作系统死锁处理

【README】

1.本文内容总结自 B站 《操作系统-哈工大李治军老师》,内容非常棒,墙裂推荐;


【19.1】死锁场景 

1)死锁: 多个进程由于互相等待对方持有的资源而造成的谁也无法执行的情况;


1.1)死锁造成的结果:

  • cpu执行的进程都在阻塞或自旋,且阻塞的进程越来越多,则cpu执行的指令没有运行业务程序,全都运行自旋程序(如while循环);这时用户感觉机器响应非常慢,最终不响应,或死机;

1.2)正常代码示例

// 生产者 
Producer(item)
{P(empty); // empty减1后判断empty是否小于0,是则表明没有可用缓冲区,当前进程阻塞P(mutext);// mutex减1后判断mutex是否小于0,是则表明已有进程进入临界区(mutex初始值为1),当前进程阻塞// 读入in;将item写入到in的位置上; (临界区)V(mutex); // mutex加1后判断mutex是否小于等于0,是则表明存在阻塞进程,唤醒在mutex信号量上阻塞的进程V(full); 	// full加1后判断full是否小于等于0,是则表明缓冲区中没有内容,唤醒在full信号量上阻塞的消费者进程(消费当前进程产生的数据内容);
}// 消费者 
Consumer()
{P(full); // full减1后判断full是否小于0,是则表明缓冲区没有内容(可消费),当前进程阻塞P(mutex); // mutex减1后判断mutex是否小于0,是则表明已有进程进入临界区(mutex初始值为1),当前进程阻塞// 读入out; 从文件中的out 位置读出到item;(临界区) // 打印item V(mutex); // mutex加1后判断mutex是否小于等于0,是则表明存在阻塞进程,唤醒在mutex信号量上阻塞的进程 V(empty); // empty加1后判断 empty 是否小于等于0,是则表明没有可用缓冲区,唤醒在empty信号量上阻塞的生产者进程(使用当前进程释放的一个缓冲区);
} 

补充:PV操作:

// 生产者:消费资源(这里消费资源指的是生产者消费一个空闲缓冲区,或一个数组项)
P (semaphore s) 
{s.value--; // 消费资源 if (s.value < 0) {sleep(s.queue);  // 当前生产者进程睡眠 }
} // 消费者:产生资源 (这里产生资源指的是消费者释放一个空闲缓存区,或一个数组项)
V (semaphore s)
{s.value++; // 释放资源if (s.value <=0 ) {wakeup(s.queue);  // 消费者唤醒睡眠的生产者进程 }
}

1.3)死锁代码示例(可以看做是用户程序写错了顺序)
同正常代码相比,把生产者的P(mutex) 放在P(empty)的前面,把消费者的P(mutex)放在 P(full)的前面,如下:

生产者

消费者

Producer(item)

{

    P(mutex);

    P(empty);  

    // 读入in;将item写入到in的位置上; (临界区)

    V(mutex);

    V(full);

Consumer()

{

    P(mutex);

    P(full); 

    // 读入out; 从文件中的out 位置读出到item;(临界区)

    // 打印item

    V(mutex);

    V(empty);

}

【代码解说】

  • 生产者P(mutex):mutex减1后判断mutex是否小于0,小于0则阻塞;等待V(mutex)唤醒;
  • 生产者P(empty):empty减1后判断empty是否小于0,小于0则阻塞;等待消费者的V(empty)唤醒;
  • 生产者P(mutex):mutex减1后判断mutex是否小于0,小于0则阻塞;等待V(mutex)唤醒;
  • 消费者P(full):full减1后判断full 是否小于0,小于0则阻塞;等待生产者的V(full)唤醒;

 
【产生死锁场景】

生产者代码1处的empty信号量上阻塞;

  1. 因为生产者获取了mutex互斥信号量没有释放,所以消费者在代码3处阻塞;
  2. 生产者代码1处的P(empty)只能被消费者代码2处的V(empty)唤醒;
  3. 又消费者代码2处的V(empty)依赖代码3处的P(mutex)被唤醒;
  4. 消费者代码3处的P(mutex)只能被生产者的代码4处的V(mutex)唤醒;
  5. 又生产者的代码4处的V(mutex)依赖代码1处的P(empty)被唤醒;
  6. 而代码1处的P(empty)只能被消费者代码2处的V(empty)唤醒(这里就形成一个环路了,死循环了......);

为什么会出现死锁?

  • 原因是因为对 mutex的加锁解锁顺序不一致(加锁解锁的正确顺序应该是先进后出),造成各自占有的资源和互相申请的资源形成记录环路等待。
  • 正常代码是 先对empty加锁,再对mutex加锁,对mutex解锁,再对full解锁;
  • 死锁代码是 先对mutex加锁,再对empty加锁,对mutex解锁,再对full解锁; 

【19.2】 死锁成因

1)死锁成因: 各自占有的资源和互相申请的资源形成环路等待


【19.3】死锁的4个必要条件

1)4个必要条件

  • 互斥使用:资源的固有属性;
  • 不可抢占:资源只能自愿放弃;
  • 请求和保持:进程必须占有资源,再去申请;
  • 循环等待:在资源分配图中存在一个环路;  


【19.4】死锁处理方法概述

1)死锁处理的4种方法:

  • 死锁预防: 破坏死锁的条件;
  • 死锁避免: 检测每个资源请求,如果造成死锁就拒绝;
  • 死锁检测与恢复: 检测到死锁出现,让一些进程回滚,让出资源;
  • 死锁忽略(不处理死锁):就好像没有出现死锁一样;(对于普通pc机器,可以使用,因为可以通过重启来解决死锁) 


【19.4.1】死锁预防的方法例子

方法1:在进程执行前,一次性申请所有需要的资源,不会占有资源再去申请其他资源

  • 缺点1:需要预知未来,编程困难;
  • 缺点2:许多资源分配后很长时间后才使用,资源利用率低

方法2: 对资源类型进行排序,资源申请必须按序进行,不会出现环路等待

  • 缺点: 仍然造成了资源浪费;  

【19.4.2】死锁避免

1)判断此次请求是否引起死锁;
2)如果系统中的所有进程存在一个可完成的执行序列 P1, ..., Pn,则称系统处于安全状态;  
3)银行家算法:

  • 如何判断系统中是否存在一个可完成的执行序列,通过银行家算法来实现; 

4)银行家算法:找出一个可完成的执行序列的算法

补充:

  • m表示资源的个数;n表示进程的个数;
  • 每做一次资源分配时,都要执行银行家算法,每次时间复杂度为 10^6,若m=100,n=100的情况下;
  • 缺点:银行家算法的时间复杂度为  O(mn^2),时间复杂度比较高,效率低; 

补充:银行家算法实例

图片解说:

  • Allocation:已分配资源; 如 P0对应已分配的A B C类资源分别为 0个 1个 0个 ;
  • Need: 还需要分配资源;如P0对应还需要分配的A B C资源分别为 7个,4个,3个;
  • Available:操作系统可用资源个数;如 ABC对应332 表示可用的A B C资源分别为 3个,3个,2个;

银行家算法步骤:

  • 步骤1:把可用资源332分配给P0,而P0还是无法执行,且P1,P2,P3,P4 这4个进程也无法执行,所以死锁;所以可用资源拒绝分配给P0;(这是一种预分配算法)
  • 步骤2:把可用资源122分配给P1,P1可以运行起来,则实际情况是操作系统把可用资源122分配给P1;P1运行完成后,释放出分配的资源,则可用资源为 532(因为P1会释放2个A类资源);
  • 步骤3:把可用资源532分配给P2,P2无法执行,且除P1外的其他进程也无法执行,则死锁;所以532拒绝分配给P2;
  • 步骤4:把011分配给P3,P3可以执行,则实际情况是操作系统把011分配给P3,以此类推....;

 

 因为把可用资源210分配给进程P0后,P0无法执行,且其他进程因为没有可用资源也无法执行,这就造成了死锁,所以银行家算法的分配结果是拒绝进程P0的资源申请请求


【19.4.3】死锁检测与恢复:发现问题再处理

1)定时检测或者是发现资源利用率低时检测;


2)进程回滚

  • 问题1:选择哪一个进程回滚;
  • 问题2:进程如何回滚,回滚到什么状态下可以解除死锁; 

【19.4.4】死锁忽略

许多通用操作系统,如windows,linux,都 采用了死锁忽略方法,因为死锁忽略的代价最小

 

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

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

相关文章

使用VS Code 开发.NET Core 应用程序 部署到Linux 跨平台

前面讲解了VSCode开发调试 .NET Core。都只是在windows下运行。 .NET Core真正的核心是跨平台&#xff0c;我们现在来了解学习 .NET Core 跨平台。 在windows 下开发.NET Core 应用程序&#xff0c;然后部署到Linux 平台运行。 .NET Core RC2版基本上已经完成。 https://githu…

centos 并发请求数_linux实现高并发请求工具

使用工具abCentOS6默认安装CentOS7需要手动安装contos7下&#xff1a;1、联网&#xff1a;yum install httpd-tools2、未联网(没试过)&#xff1a;(1)进入cd /run/media/root/CentOS78664/Packages(路径跟centos6不同)(2)顺序安装apr-1.4.8-3.el7.86_64.rpmapr-util-1.5.2-6.el…

16.内存使用与分段

【README】 1.本文内容总结自 B站 《操作系统-哈工大李治军老师》&#xff0c;内容非常棒&#xff0c;墙裂推荐&#xff1b; 【1】 内存使用 【1.1】程序加载到内存 1&#xff09;内存使用&#xff1a;将程序放到内存中&#xff0c;PC寄存器指向开始地址&#xff1b; 2&…

Oracle入门(十三)之SQL的DML

数据操纵语言&#xff08;Data Manipulation Language, DML&#xff09;是SQL语言中&#xff0c;负责对数据库对象运行数据访问工作的指令集&#xff0c;以INSERT、UPDATE、DELETE三种指令为核心&#xff0c;分别代表插入、更新与删除&#xff0c;是开发以数据为中心的应用程序…

.NET Core 跨平台发布(dotnet publish)

.NET Core 跨平台发布(dotnet publish) ,无需安装.NET Core SDK,就可以运行。 前面讲解了.NET Core 的VSCode 开发。现在来讲讲发布&#xff08;dotnet publish&#xff09;。 .NET Core and ASP.NET Core 1.0 RC2 runtime and libraries 在五月中旬发布。 .NET Core and ASP.N…

Oracle入门(十三A)之Select

一、数据查询语句 &#xff08;1&#xff09;select语句完整的句法select 目标表的列名或列表达式序列from 基本表名和&#xff08;或&#xff09;视图序列[ where 行条件表达式 ][ group by 列名序列[ having 组条件表达式 ] ][ order by 列名[ asc|desc ]&#xff0c;… ] &a…

华为交换机ssh思科交换机_华为交换机 ssh 配置(极简版)

华为的 ssh 叫 STelnet(1)配置STelnet服务器功能及参数rsa local-key-pair create [1]stelnet server enable [2]undo ssh server keepalive disable [3][1] 创建密钥对&#xff0c;这个是必须的。可以选用 rsa dsa ecc 等加密算法&#xff0c;这里选择了最常用的rsa。输入命令…

17.内存分区与分页

【README】 1.本文内容总结自 B站 《操作系统-哈工大李治军老师》&#xff0c;内容非常棒&#xff0c;墙裂推荐&#xff1b; 2.程序使用内存的3个步骤&#xff1a; 步骤1&#xff1a;把程序分为多个段&#xff0c;包括代码段&#xff0c;数据段&#xff1b;这是编译要做的事…

漫谈C#编程语言在游戏领域的应用

0x00 前言 随着微软越来越开放&#xff0c;C#也变得越来越吸引人们的眼球。而在游戏行业中&#xff0c;C#也开始慢慢地获得了关注。这不&#xff0c; 网易绝代双娇手游团队已经全面使用.Net Core支持前后端统一C#开发&#xff0c;跨平台部署了。 所以&#xff0c;我们就来总结一…

dex工具与transform_Android Studio打包程序时出现transformClassesWithDexForRelease错误

百度半天.没找到直接原因..国外网站上有写这个错误的..国内的真心没找到..英语水平有太低..实在没看懂怎么搞..后来发现clean项目的时候是提示如下错误:Information:Gradle tasks [clean, :app:generateDebugSources, :app:generateDebugAndroidTestSources, :app:mockableAndr…

18.多级页表与快表

【README】 1.本文内容总结自 B站 《操作系统-哈工大李治军老师》&#xff0c;内容非常棒&#xff0c;墙裂推荐&#xff1b; 2.操作系统内存管理&#xff1a;分页机制多级页表快表来实现&#xff1b; 【0】分页的问题 1&#xff09;分页的问题&#xff08;大页表&#xff09…

Oracle入门(十三A1)之替换变量,变量名,变量名

转载自 Oracle中的替换变量&#xff0c;&变量名&#xff0c;&&变量名替换变量&#xff08;仅用于SQL *Plus或者用于原理和SQL *Plus相同的开发工具&#xff09;&#xff1a;临时存储值利用它可以达到创建通用脚本的目的利用它可以达到和用户交互&#xff0c;故在SQ…

常用API接口签名验证参考

项目中常用的API接口签名验证方法&#xff1a; 1. 给app分配对应的key、secret2. Sign签名&#xff0c;调用API 时需要对请求参数进行签名验证&#xff0c;签名方式如下&#xff1a;  a. 按照请求参数名称将所有请求参数按照字母先后顺序排序得到&#xff1a;keyvaluekeyvalu…

19.段页结合的实际内存管理

【README】 1.本文内容总结自 B站 《操作系统-哈工大李治军老师》&#xff0c;内容非常棒&#xff0c;墙裂推荐&#xff1b; 2.段与页 段&#xff1a; 用户程序采用分段结构&#xff1b;页&#xff1a; 操作系统采用分页机制管理物理内存&#xff1b;段页结合&#xff1a;程…

python中变量怎么定义_python中的变量的使用定义以及使用规则

本篇包括14章内容&#xff0c;系统介绍了Python语言的基础知识。内容包括Python基础语法、数据类型和类型转换、运算符、流程控制(分支结构循环结构)、数据结构(列表生成式)、函数的定义及使用、异常处理、迭代器生成器、偏函数、python中的模块和包、python标准内置库os以及使…

Oracle入门(十二G)之序列

序列&#xff08;SEQUENCE&#xff09;序列是一数据库对象&#xff0c;利用它可生成唯一的整数。由于它属于可共享对象&#xff0c;所以允许多个用户访问。一般情况下&#xff0c;序列用于创建主键值。 序列号的存储和生成与表无关。因此&#xff0c;同一序列可以用于多个表。 …

20.内存换入-请求调页

【README】 1.本文内容总结自 B站 《操作系统-哈工大李治军老师》&#xff0c;内容非常棒&#xff0c;墙裂推荐&#xff1b; 2.操作系统关于内存管理的核心是基于虚拟内存的分段和分页管理&#xff1b; 3.而用内存换入和换出实现虚拟内存 &#xff1b; 【1】虚拟内存 1&…

机器人点焊枪接线_用于焊接机器人焊枪工具点及工件坐标系标定装置及方法与流程...

本发明属于机器人焊接技术领域&#xff0c;涉及一种用于焊接机器人焊枪工具点及工件坐标系标定的装置及方法。背景技术&#xff1a;工业机器人是实施自动化生产线、工业4.0、智能制造车间、数字化工厂、智能工厂的重要基础装备之一。而据不完全统计&#xff0c;全世界在役的工业…

采用EntityFramework.Extended 对EF进行扩展(Entity Framework 延伸系列2)

前言 今天我们来讲讲EntityFramework.Extended 首先科普一下这个EntityFramework.Extended是什么,如下: 这是一个对Entity Framework进行扩展的类库. 完全支持EF 5.0/6.0&#xff0c; GitHub地址 https://github.com/loresoft/EntityFramework.Extended&#xff0c; 最后一次更…

Oracle入门(十二J)之同义词

转载自 oracle同义词 一、创建同义词 --普通用法 create [or replace] [public] synonym [schema.] 同义词名称 for [schema.] object [dblink];--创建专有&#xff08;私有&#xff09;同义词 create synonym sysn_test for test;--创建公共同义词 create public synonym publ…