操作系统——死锁(银行家算法)

1、概述

1.1 死锁

死锁是多个进程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进。

1.2 死锁产生的原因和条件

原因:(1)竞争资源;(2)进程间推进顺序非法

条件:(1)互斥条件;(2)请求和保持条件;(3)不剥夺条件;(4)环路等待条件

1.3 死锁的处理策略

(1)死锁预防

破坏产生死锁的四个必要条件中的一个或几个,以防止发生死锁。

  • 互斥条件:所有资源允许共享,则系统不会进入死锁状态,但是打印机等临界资源不适用
  • 请求和保持条件:采用预先静态分配方法,即进程运行前一次申请完所需要的资源,在资源未满足前,进程不执行,进程一旦执行,不再提出其他资源请求,这样就不会死锁
  • 不剥夺条件:当一个已经保持了某些不可剥夺资源的进程,请求新资源得不到满足时,它必须释放已经保持的所有资源,待以后需要时重新申请
  • 环路等待条件(循环等待):为了破坏循环等待条件,可釆用顺序资源分配法。

(2)死锁避免(银行家算法

在资源的动态分配中,用某种方法防止系统进入不安全状态,从而避免死锁

(3)死锁的检测及解除

无需釆取任何限制性措施,允许进程在运行过程中发生死锁。通过系统的检测机构及时 地检测出死锁的发生,然后采取某种措施解除死锁,通过将资源分配图简化的方法来检测系统状态S是否为死锁状态。当且仅当S状态的资源分配图是不可完全简化的,该条件为死锁定理。

死锁解除的主要方法有:

1) 资源剥夺法。挂起某些死锁进程,并抢占它的资源,将这些资源分配给其他的死锁进程。但应防止被挂起的进程长时间得不到资源,而处于资源匮乏的状态。

2) 撤销进程法。强制撤销部分、甚至全部死锁进程并剥夺这些进程的资源。撤销的原则可以按进程优先级和撤销进程代价的高低进行。

3) 进程回退法。让一(多)个进程回退到足以回避死锁的地步,进程回退时自愿释放资源而不是被剥夺。要求系统保持进程的历史信息,设置还原点。

 2、银行家算法

主要思想是避免系统进入不安全状态。在每次进行资源分配时,它首先检查系统是否有足够的资源满足要求,如果有,则先进行分配,并对分配后的新状态进行安全性检查。如果新状态安全,则正式分配上述资源,否则就拒绝分配上述资源。这样,它保证系统始终处于安全状态,从而避免死锁现象的发生。

(1)具体数据项

最大需求矩阵Max

需求矩阵Need

分配矩阵Allocation

可利用资源矢量Available

存在关系:Need = Max-Allocation

(2)银行家算法描述

设request是进程Pi的请求矢量,当P发出资源请求后,系统按照以下步骤进行检查:

  • 如果满足Request[i,j] <= Need[i, j],则继续以下步骤,否则,认为它所需资源数已超过宣布的最大值
  • 如果满足Request[i,j] <= Available[i, j],则继续以下步骤,否则,尚无足够资源,Pi需等待。
  • 系统试探着把资源分配给进程Pi,并修改下面数据结构中的数值:

        Available[j] = Available[j] - Requesti[j];

        Allocation[i, j] = Allocation[i, j] + Requesti[ j];

        Need[i, j] = Need[i, j] - Requesti[j];

  • 系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态,若安全,才正式将资源分配给进程Pi,以完成本次分配;否则,将本次的分配作废,恢复原来的资源分配状态,让进程Pi等待。

(3)系统安全状态(安全状态算法)

安全状态是指系统能按某种进程推进顺序( P1, P2, ..., Pn),为每个进程Pi分配其所需资源,直至满足每个进程对资源的最大需求,使每个进程都可顺序地完成。此时称 P1, P2, ..., Pn 为安全序列。如果系统无法找到一个安全序列,则称系统处于不安全状态。

工作矢量Work;它表示系统可提供给进程继续运行所需的各类资源数目,它含有所个元素,在执行安全算法开始时,Work=Available;

Finish:它表示系统是否有足够的资源分配给进程,使之运行完成。开始时 Finish[i]=false;当有足够资源分配给进程 Pi 时,再令 Finish[i]=true。

3、死锁实例

3.1 银行家算法实例

case 1:系统有五个进程P1、P2、P3、P4、P5,三种资源R1、R2、R3,在T0时刻的状态如图所示,回答下列问题:

已分配资源数量(Allocation)最大资源需求数量(Max)
R1R2R3R1R2R3
P1001001
P2200275
P3003665
P4115435
P5033065
R1R2R3
剩余资源数(Available)330

(1)T0时刻是否为安全状态?为什么?

(2)若这时P4请求资源(1,2,0),是否实施资源分配?,为什么?

(3)在上面基础上,若进程P3请求资源(0,1,0),是否能实施资源分配?为什么?

答:(1)T0时刻是安全状态,序列为P1->P4->P5->P2->P3

AllocationNeed(Max-Allocation)Available+Allocation(初始(3,3,0))状态
R1R2R3R1R2R3R1R2R3Finish
P1001000331True(核对Need矩阵,P4,320(need)<331(Available))
P4115320446True(核对Need矩阵,P5,032(need)<446(Available))
P5033032479True(核对Need矩阵,P2,075(need)<479(Available))
P2200075679True(核对Need矩阵,P3,662(need)<679(Available))
P30036626712end,最后资源6,7,12

(2)P4请求(1,2,0),则Request=(1,2,0),

比较:Request<=Need(1,2,0<=3,2,0)

           Request<=Available(1,2,0<=3,3,0)

更新:Need = Need-Request(3,2,0-1,2,0=2,0,0)

        Available = Available -Request(3,3,0-1,2,0=2,1,0)

        Aollcation = Aollcation+Request(1,1,5+1,2,0=2,3,5)

已分配资源数量(Allocation)最大资源需求数量(Max)Need
R1R2R3R1R2R3R1R2R3
P1001001
P2200275
P3003665
P4235435200
P5033065
R1R2R3
剩余资源数(Available)210

安全序列为P1->P4->P5->P2->P3

AllocationNeed(Max-Allocation)Available+Allocation(初始(3,3,0))状态
R1R2R3R1R2R3R1R2R3Finish
P1001000210True(核对Need矩阵,P4,200(need)<210(Available))
P4235200446True(核对Need矩阵,P5,032(need)<446(Available))
P5033032479True(核对Need矩阵,P2,075(need)<479(Available))
P2200075679True(核对Need矩阵,P3,662(need)<679(Available))
P30036626712end,最后资源6,7,12

(3)在上面基础上,P3请求(1,1,0),则Request=(1,1,0),

比较:Request<=Need(1,1,0<=6,6,2) 

           Request<=Available(1,1,0<=2,1,0)

更新:Need = Need-Request(6,6,2-1,1,0=5,5,2)

        Available = Available -Request(2,1,0-1,1,0=1,0,0)

        Aollcation = Aollcation+Request(0,0,3+1,1,0=1,1,3)

已分配资源数量(Allocation)最大资源需求数量(Max)Need
R1R2R3R1R2R3R1R2R3
P1001001
P2200275
P3113665552
P4235435200
P5033065
R1R2R3
剩余资源数(Available)100

不为安全序列

AllocationNeed(Max-Allocation)Available+Allocation(初始(3,3,0))状态
R1R2R3R1R2R3R1R2R3Finish
P1001000101True(核对Need矩阵,P4,100(need)<101(Available))
P4235200以下均不满足
P5033032
P2200075
P3003662

3.2 死锁检测例题

case 1:设有进程P1和P2并发执行,都要使用R1和R2,使用资源情况如表所示,试判断是否会产生死锁,并说明原因

进程P1进程P2
申请资源R1申请资源R2
申请资源R2申请资源R1
释放资源R1释放资源R2

答:(可能会死锁)当进程P1和P2分别申请完R1和R2,当P1再去申请R2时,P2未将R2资源释放,P1处于等待状态,因此,P1和P2都申请不到资源而造成死锁

case 2:系统有同类资源m个,供n个进程共享,若每个进程对资源的最大需求量为k,试问,当m,n,k的值分别为下列情况时,是否会发生死锁?

序号

m

nk是否死锁((k-1)*n+1<=m)说明
1633(3-1)*3+1=7>6 (可能死锁)
2933(3-1)*3+1=7<9 (不会死锁)
31363(3-1)*6+1=13==13(不会死锁)

case 3:有三个进程P1,P2,P3并发工作。进程P1需要资源S3和S1,进程P2需要资源S2和S1,进程P3需要S3和S2,问

(1)若对资源分配不加限制,会发生什么情况?为什么?

(2)为保证进程正确运行,应采用怎样的分配策略?

答:

(1)可能会发生死锁。满足发生死锁的4大条件,例如,P1占有S1申请S3,P2占有S2申请S1,P3占有S3申请S2。

(2)方法一:静态分配(由于执行前已获得所需的全部资源,因此不会出现占有资源又等待别的资源的现象)

方法二:按序分配(不会出现循环等待资源的现象)

方法三:银行家算法(因为在分配时,保证了系统处于安全状态)

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

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

相关文章

操作系统——内存管理

1、内存基本概念 1.1 主要功能 内存空间的分配与回收&#xff1b;地址转换内存保护&#xff1a;使用上下限寄存器或者重定位寄存器和界地址寄存器内存扩充&#xff1a;交换和覆盖内容共享 2、内存的分配与回收 2.1 连续分配方式 连续分配方式是指为一个用户程序分配一个连续…

解决一个驱动代码解耦合问题

之前解决的项目LCD设备兼容问题&#xff0c;在 a.c 文件里面定义了一个变量&#xff0c;然后在 b.c 里面使用 extern声明引用这个变量&#xff0c;通过这种方法可以在b.c中使用在a.c 里面初始化的变量。但是这中情况就会引起一个问题&#xff0c;就是驱动代码之间耦合了&#x…

STM32——DMA

STM32——DMA 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 DMA 是为CPU分担数据转移的工作。因为DMA的存在CPU才被解放出来&#xff0c;它可以在 DMA 转移数据的过程中同时进行数据运算、响应中断&#xff0c;大大提高效率。 1、DMA工作分析 数据传…

YOLOv8改进 | 主干篇 | 利用SENetV1改进网络结构 (ILSVRC冠军得主)

一、本文介绍 本文给大家带来的改进机制是SENet&#xff08;Squeeze-and-Excitation Networks&#xff09;其是一种通过调整卷积网络中的通道关系来提升性能的网络结构。SENet并不是一个独立的网络模型&#xff0c;而是一个可以和现有的任何一个模型相结合的模块(可以看作是一…

搭建Servlet在线视频

这个视频flash上传及在线播放&#xff0c;搞了我一天了&#xff0c;总算有点成果&#xff0c;但还有一些疑问没有解决&#xff0c;现在发这篇随笔&#xff0c;为的就是交流视频在线上传和观看的一些问题。 在线编辑器使用FCKEditor&#xff0c;首先是修改FCKEditor的配置文件&a…

操作系统——内存管理例题

1、关于分配策略例题 case1&#xff1a;某系统的空闲分区见下表&#xff0c;如有下列作业&#xff1a;96KB&#xff0c;20KB&#xff0c;200KB&#xff0c;分别采用首次适应算法和最佳适应算法来处理这些作业序列&#xff0c;哪种算法能满足该作业序列请求&#xff1f; 分区号…

STM32中C语言知识点:初学者必看,老鸟复习(长文总结)

说在前面的话一位初学单片机的小伙伴让我推荐C语言书籍&#xff0c;因为C语言基础比较差&#xff0c;想把C语言重新学一遍&#xff0c;再去学单片机&#xff0c;我以前刚学单片机的时候也有这样子的想法。其实C语言是可以边学单片机边学的&#xff0c;学单片机的一些例程中&…

STM32——ADC

STM32——ADC 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 一、ADC指标 有 18 个通道&#xff0c;可测量 16 个外部和 2 个内部信号源。各通道的 A/D 转换可以单次、连续、扫描或间断模式执行 &#xff1b;ADC的结果可以左对齐或右对齐方式存储在 16…

时间复杂度和空间复杂度,一看就懂,面试前必过一遍

一、定义时间和空间是程序的一个硬性指标&#xff0c;一个用来衡量 代码执行的速度 &#xff0c;一个用来衡量 存储空间的大小程序 数据结构 算法时间复杂度&#xff1a;就是执行程序的快慢&#xff0c;速度越快&#xff0c;时间复杂度就越好。空间复杂度&#xff1a;就是执…

数据结构——排序【仅用于考试】

1、简介 排序&#xff0c;是重新排列表中的元素&#xff0c;使表中的元素满足按关键字有序的过程 稳定性&#xff1a;选取两个元素Ri<Rj&#xff0c;经过排序算法之后&#xff0c;仍为Ri<Rj 不稳定的排序&#xff1a;【简单选择排序&#xff0c;快速排序&#xff0c;堆…

[UWP]做个调皮的BusyIndicator

1. 前言 最近突然想要个BusyIndicator。做过WPF开发的程序员对BusyIndicator应该不陌生&#xff0c;Extended WPF Toolkit 提供了BusyIndicator的开源实现&#xff0c;Silverlight Toolkit也有一个&#xff0c;这次想要把这个控件移植到UWP中。 2. 先说点正经的 2.1 BusyIndica…

STM32——I2C

STM32——I2C 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 一、I2C协议 I 2 C &#xff08;Inter-Integrated Circuit&#xff09;协议是由 Philips 公司开发的&#xff0c;由于它具备引脚少、硬件实现简单、可扩展性强、不需要如 USART、CAN 的外部…

C语言发展简史

1、起源C 语言最早的原型是 ALGOL 60 1963 年&#xff0c;剑桥大学将其发展成为 CPL(Combined Programing Language)。1967 年&#xff0c;剑桥大学的 Matin Richards 对 CPL 语言进行了简化&#xff0c;产生了 BCPL 语言。1970 年&#xff0c;美国贝尔实验室(Bell Labs)的 Ken…

STM32——EEPROM

STM32——EEPROM 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 一、I2C接口读写EEPROM&#xff08;AT24C02&#xff09; ——主模式&#xff0c;分别用作主发送器和主接收器。通过查询事件的方式来确保正常通信。 1、I 2C接口初始化 与其他对GPIO 复用…

Linus Torvalds谈ECC内存的重要性 痛斥英特尔正在扼杀它

新年假期&#xff0c;Linus Torvalds在邮件列表中发表的一篇火热的帖子引发技术社区关注&#xff0c;人们借此讨论ECC内存的重要性&#xff0c;Torvalds在文章中抨击了英特尔在这方面的”坏政策”&#xff0c;因为特定的市场细分使ECC内存不那么普及。Linus认为&#xff0c;纠错…

加密和解密算法的兩個實現

最近一段時間,集團加強了資安方面的管理,所有敏感的配置字節都必須經過加密處理,把最近用到的幾個加解密類整理了一下,以做備忘. 其實這兩個類實現的方法差不多,只是有些細微區別: 對稱加密演算法類 SymmetricMethodHelperusing System;using System.IO;using System.Security.…

47.leetcode36_valid_suduko

1.题目分析 Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku board could be partially filled, where empty cells are filled with the character .. A partially filled sudoku which is valid. Note: A valid Sudoku board (partia…

STM32——SPI接口

STM32——SPI接口 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 一、SPI协议【SerialPeripheral Interface】 串行外围设备接口&#xff0c;是一种高速全双工的通信总线。在ADC/LCD等与MCU间通信。 1、SPI信号线 SPI 包含 4 条总线&#xff0c;SPI 总…

这两种printf()函数重定向方法,太实用了

作者&#xff1a;echobright原文链接&#xff1a;https://blog.csdn.net/qq_29344757/article/details/75363639在前面学习了STM32的串口编程&#xff0c;通过USART1向计算机的串口调试助手打印数据&#xff0c;或者接收计算机串口调试助手的数据&#xff0c;接下来我们可以实现…

浅析Linux 64位系统虚拟地址和物理地址的映射及验证方法

前言有好久没更新了&#xff0c;这段时间发生了挺多大喜事哈。但是也还是有挺久没更新了&#xff0c;不得不意识到自己是个小菜鸡&#xff0c;就算是小菜鸡也要做一只快乐小菜鸡。就算更新慢但是我依然会持续更新&#xff0c;因为更文使我快乐。虚拟内存先简单介绍一下操作系统…