计算机操作系统-【死锁】

文章目录

  • 一、什么是死锁?
    • 死锁产生的原因?
    • 死锁产生的必要条件?
      • 互斥条件
      • 请求并保持
      • 不可剥夺
      • 环路等待
  • 二、处理死锁的基本方法
    • 死锁的预防
      • 摒弃请求和保持条件
      • 摒弃不可剥夺条件
      • 摒弃环路等待条件
    • 死锁的避免
      • 银行家算法案例


提示:以下是本篇文章正文内容,下面案例可供参考

一、什么是死锁?

由于多个进程(两个及以上)竞争共享资源而引起进程不能向前推进的僵死状态被称为死锁。

死锁产生的原因?

进程访问资源按照申请资源、访问资源、释放资源的顺序来执行,如果出现竞争共享资源且分配资源的顺序不当时,则可能会产生死锁。

死锁产生的必要条件?

互斥条件

当一个进程访问某个共享资源时,其他进程不能访问该共享资源。如果当前某个共享资源正在被进程访问,则其他进程想要对该共享资源进行访问时,必须要把请求该共享资源的进程阻塞起来,直到资源被当前所拥有进程释放。

请求并保持

进程已经保持拥有了至少一个资源,又提出了申请新资源的要求,而新申请的资源已经被其他进程所占用,此时进程就会陷入阻塞状态,但又对自己所拥有的资源保持不释放,使得其他进行无法访问该进程所保持的资源。

不可剥夺

进程已经获取的资源不能被其他进程所剥夺,只能由自己释放。

环路等待

在发生死锁时,必然存在一个进程申请资源的环形链,即进程集合{p0,p1,p2,p3…}中,p0等待获取p1占用的一个资源,p1等待获取p2占用的一个资源,p2等待p3…,最总pn等到获取p0所占用资源,此时形成一个环形闭环。


二、处理死锁的基本方法

处理死锁的基本方法有预防死锁、避免死锁、检测并解除死锁、忽略死锁问题等。为确保不发生死锁,操作系统可以采用死锁预防和死锁避免方案。


死锁的预防

死锁的预防是根据死锁的必要条件来进行处理,即当不满足死锁成立的四个必要条件(互斥条件、请求并保持、不可剥夺、环形等待)中的一个,即死锁无法形成。需要明确的是在操作系统中,无法预知进程是否访问某个临界资源,所以通常不能采用摈弃互斥条件来预防死锁的发生,因此死锁的预防可以从剩下来的三个条件入手。

摒弃请求和保持条件

可以通过摒弃请求和保持条件来预防死锁。摒弃请求和保持条件的一种方法即:

系统要求所有进程一次性地申请在整个运行过程中所需要的全部资源,如果其中存在一个资源申请不成功,则其他资源也不分配给该进程,该进程进入阻塞状态。也就是在运行前将所有需要资源一次性进行申请锁定,后续运行过程中将不再像外部申请其他资源。

摒弃不可剥夺条件

可以通过摒弃不可剥夺条件来预防死锁。摒弃不可剥夺条件即:

一个已保持某些资源的进程,当它再次提出申请新的资源时,如果不能立刻得到满足,必须释放自身所拥有的所有资源。这种方法的缺点是实现复杂、代价高。

摒弃环路等待条件

摒弃环路等待条件即:

进程必须按照规定的顺序申请资源,对所有不同类型的资源进行排序,要求每个进程按照规定顺序申请资源。
缺点:
1.系统为资源分配的顺序可能与进程实际使用资源的顺序不同。
2.在编码实现复杂


死锁的避免

银行家算法是一种避免死锁的资源分配和调度算法,由Edsger Dijkstra 在 1965 年提出。用于操作系统中资源的管理,确保系统不会进入死锁状态。基本思想是通过模拟资源预分配,确保系统在任何时候都能满足至少一个进程所需的最大资源,从而避免死锁。 银行家算法主要包括以下几个步骤:

  • 初始资源类型以及数量,并初始化每个进程所需最大资源数量,当前分配资源数量、当前资源可用剩余量。
  • 安全性检查:检查当前系统是否存于安全性状态。
  • 资源请求:当一个进程请求资源时,首先检查进程请求资源是否超出该进程最大资源数量,如果请求的某个资源大于该进程所需该资源的最大数量,则拒绝请求。否则系统尝试为该进程分配资源,并更新状态是否安全。

银行家算法案例

假设当前存在5个进程,同个需要申请三种不同类型的资源A\B\C,资源A一共有10个,资源B共有5个,资源C共有7个。

  • 假设p0进程对资源A\B\C最大需求为7,5,3,当前已经分配A\B\C资源为0,1,0,因此p0进程还需要分配A\B\C资源个数为7,4,3。
  • 假设p1进程对资源A\B\C最大需求为3,2,2,当前已经分配A\B\C资源为2,0,0,因此p1进程还需要分配A\B\C资源个数为1,2,2。
  • 假设p2进程对资源A\B\C最大需求为9,0,2,当前已经分配A\B\C资源为3,0,2,因此p2进程还需要分配A\B\C资源个数为6,0,0。
  • 假设p3进程对资源A\B\C最大需求为2,2,2,当前已经分配A\B\C资源为2,1,1,因此p3进程还需要分配A\B\C资源个数为0,1,1。
  • 假设p4进程对资源A\B\C最大需求为4,3,3,当前已经分配A\B\C资源为0,0,2,因此p4进程还需要分配A\B\C资源个数为4,3,1。

这里要记住公式: Need(需求)= Max(所需最大)-Alloc(已经分配);Avail(可用数量)= 总数-Alloc(已经分配)
各资源总数A:10, B:5,C:7.

进程名称Alloc(A B C)Max(A B C)Need(A B CC)Avail(A B C)
p00 1 07 5 37 4 3
p12 0 03 2 21 2 2
p23 0 29 0 26 0 0
p32 1 12 2 20 1 1
p40 0 24 3 34 3 1

通过Alloc已分配的A、B、C资源进行总和,可以计算出当前A资源已经分配了7个,B类资源已经分配了2个,C类资源已经分配了5个,因此A、B、C资源剩余可分配数量分别为3:3:2。Avail(可用数量)= 总数-Alloc(已经分配)

因此我们可以从p0~p4进行匹配,可以发现p0还需要资源分别为7:4:3,而现在剩余资源3:3:2并不满足条件,因此拒绝向p0分配资源。而p1所需资源1:2:2可以被剩余可分配资源满足,因此尝试将资源分配给进程p1,分配图更新后如下:

进程名称Alloc(A B C)Max(A B C)Need(A B CC)Avail(A B C)
p00 1 07 5 37 4 3
p13 2 23 2 20 0 02 1 0
p23 0 29 0 26 0 0
p32 1 12 2 20 1 1
p40 0 24 3 34 3 1

当可剩余资源分配给p1进程运行完成后,p1将会把所拥有资源释放,因此A、B、C资源的数量变为 5:3:2。

进程名称Alloc(A B C)Max(A B C)Need(A B CC)Avail(A B C)
p00 1 07 5 37 4 3
p1(执行完成)0 0 03 2 20 0 05 3 2
p23 0 29 0 26 0 0
p32 1 12 2 20 1 1
p40 0 24 3 34 3 1

现在再次尝试进行新的一轮分配,p0、p2进程所需资源大于当前可分配资源,因此拒绝分配;而p3进程满足条件,因此尝试将资源分配给进程p3,分配图更新后如下:

进程名称Alloc(A B C)Max(A B C)Need(A B CC)Avail(A B C)
p00 1 07 5 37 4 3
p1(执行完成)0 0 03 2 20 0 0
p23 0 29 0 26 0 0
p32 2 22 2 20 0 05 2 1
p40 0 24 3 34 3 1

当可剩余资源分配给p3进程运行完成后,p3将会把所拥有资源释放,因此A、B、C资源的数量变为 7:4:3。

进程名称Alloc(A B C)Max(A B C)Need(A B CC)Avail(A B C)
p00 1 07 5 37 4 3
p1(执行完成)0 0 03 2 20 0 0
p23 0 29 0 26 0 0
p3(执行完成)0 0 02 2 20 0 07 4 3
p40 0 24 3 34 3 1

现在再次尝试进行新的一轮分配,p0进程所需资源恰好等于当前可分配资源,因此尝试将资源分配给进程p0,分配图更新后如下:

进程名称Alloc(A B C)Max(A B C)Need(A B CC)Avail(A B C)
p07 5 37 5 37 4 30 0 0
p1(执行完成)0 0 03 2 20 0 0
p23 0 29 0 26 0 0
p3(执行完成)0 0 02 2 20 0 0
p40 0 24 3 34 3 1

当可剩余资源分配给p0进程运行完成后,p0将会把所拥有资源释放,因此A、B、C资源的数量变为 7:5:3。

进程名称Alloc(A B C)Max(A B C)Need(A B CC)Avail(A B C)
p0(执行完成)0 0 07 5 30 0 07 5 3
p1(执行完成)0 0 03 2 20 0 0
p23 0 29 0 26 0 0
p3(执行完成)0 0 02 2 20 0 0
p40 0 24 3 34 3 1

现在再次尝试进行新的一轮分配,当前可分配资源满足p2进程所需资源,因此尝试将资源分配给进程p2,分配图更新后如下:

进程名称Alloc(A B C)Max(A B C)Need(A B CC)Avail(A B C)
p0(执行完成)0 0 07 5 30 0 0
p1(执行完成)0 0 03 2 20 0 0
p29 0 29 0 20 0 01 5 3
p3(执行完成)0 0 02 2 20 0 0
p40 0 24 3 34 3 1

当可剩余资源分配给p2进程运行完成后,p2将会把所拥有资源释放,因此A、B、C资源的数量变为 10:5:5。

进程名称Alloc(A B C)Max(A B C)Need(A B CC)Avail(A B C)
p0(执行完成)0 0 07 5 30 0 0
p1(执行完成)0 0 03 2 20 0 0
p2(执行完成)0 0 09 0 20 0 010 5 5
p3(执行完成)0 0 02 2 20 0 0
p40 0 24 3 34 3 1

现在再次尝试进行新的一轮分配,当前可分配资源满足p4进程所需资源,因此尝试将资源分配给进程p4,分配图更新后如下:

进程名称Alloc(A B C)Max(A B C)Need(A B CC)Avail(A B C)
p0(执行完成)0 0 07 5 30 0 0
p1(执行完成)0 0 03 2 20 0 0
p2(执行完成)0 0 09 0 20 0 0
p3(执行完成)0 0 02 2 20 0 0
p44 3 34 3 30 0 06 2 4

当可剩余资源分配给p4进程运行完成后,p4将会把所拥有资源释放,因此A、B、C资源的数量变为 10:5:7。

进程名称Alloc(A B C)Max(A B C)Need(A B CC)Avail(A B C)
p0(执行完成)0 0 07 5 30 0 0
p1(执行完成)0 0 03 2 20 0 0
p2(执行完成)0 0 09 0 20 0 0
p3(执行完成)0 0 02 2 20 0 0
p4(执行完成)0 0 04 3 30 0 010 5 7

因此资源分配进程顺序可以是P1->P3->P0->P2->P4。

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

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

相关文章

vue拓扑图组件

vue拓扑图组件 介绍技术栈功能特性快速开始安装依赖开发调试构建部署 使用示例演示截图组件源码 介绍 一个基于 Vue3 的拓扑图组件,具有以下特点: 1.基于 vue-flow 实现,提供流畅的拓扑图展示体验 2.支持传入 JSON 对象自动生成拓扑结构 3.自…

go 通过汇编分析函数传参与返回值机制

文章目录 概要一、前置知识二、汇编分析2.1、示例2.2、汇编2.2.1、 寄存器传值的汇编2.2.2、 栈内存传值的汇编 三、拓展3.1 了解go中的Duff’s Device3.2 go tool compile3.2 call 0x46dc70 & call 0x46dfda 概要 在上一篇文章中,我们研究了go函数调用时的栈布…

python-1. 找单独的数

问题描述 在一个班级中,每位同学都拿到了一张卡片,上面有一个整数。有趣的是,除了一个数字之外,所有的数字都恰好出现了两次。现在需要你帮助班长小C快速找到那个拿了独特数字卡片的同学手上的数字是什么。 要求: 设…

算法学习C++需注意的基本知识

文章目录 01_算法中C需注意的基本知识cmath头文件一些计算符ASCII码表数据类型长度运算符cout固定输出格式浮点数的比较max排序自定义类型字符的大小写转换与判断判断字符是数字还是字母 02_数据结构需要注意的内容1.stringgetline函数的使用string::findsubstr截取字符串strin…

从零开始写android 的智能指针

Android中定义了两种智能指针类型,一种是强指针sp(strong pointer),源码中的位置在system/core/include/utils/StrongPointer.h。另外一种是弱指针(weak pointer)。其实称之为强引用和弱引用更合适一些。强…

【leetcode hot 100 152】乘积最大子数组

错误解法:db[i]表示以i结尾的最大的非空连续,动态规划:dp[i] Math.max(nums[i], nums[i] * dp[i - 1]); class Solution {public int maxProduct(int[] nums) {int n nums.length;int[] dp new int[n]; // db[i]表示以i结尾的最大的非空连…

图论整理复习

回溯: 模板: void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {处理节点;backtracking(路径,选择列表); // 递归回溯&#xff…

uniapp离线打包提示未添加videoplayer模块

uniapp中使用到video标签,但是离线打包放到安卓工程中,运行到真机中时提示如下: 解决方案: 1、把media-release.aar、weex_videoplayer-release.aar放到工程的libs目录下; 文档:https://nativesupport.dcloud.net.cn/…

打包构建替换App名称

方案适用背景 一套代码出多个安装包,且安装包的应用名称、图标都不一样考虑三语名称问题 通过 Gradle 脚本实现 gradle.properties 里面定义标识来区分应用,如下文里的 APP_TYPEAAA 、APP_TYPEBBB// 定义 groovy 替换方法 def replaceAppName(String …

DrissionPage移动端自动化:从H5到原生App的跨界测试

一、移动端自动化测试的挑战与机遇 移动端测试面临多维度挑战: 设备碎片化:Android/iOS版本、屏幕分辨率差异 混合应用架构:H5页面与原生组件的深度耦合 交互复杂性:多点触控、手势操作、传感器模拟 性能监控:内存…

达梦数据库用函数实现身份证合法校验

达梦数据库用函数实现身份证合法校验 拿走不谢~ CREATE OR REPLACE FUNCTION CHECK_IDCARD(A_SFZ IN VARCHAR2) RETURN VARCHAR2 IS TYPE WEIGHT_TAB IS VARRAY(17) OF NUMBER; TYPE CHECK_TAB IS VARRAY(11) OF CHAR; WEIGHT_FACTOR WEIGHT_TAB : WEIGHT_TAB(7,9,10,5,8,4,…

3dmax的python通过普通的摄像头动捕表情

1、安装python 进入cdm,打python要能显示版本号 >>>(进入python提示符模式) import sys sys.path显示python的安装路径, 进入到python.exe的路径 在python目录中安装(ctrlz退出python交互模式) 2、pip install mediapipe…

国产Linux统信安装mysql8教程步骤

系统环境 uname -a Linux FlencherHU-PC 6.12.9-amd64-desktop-rolling #23.01.01.18 SMP PREEMPT_DYNAMIC Fri Jan 10 18:29:31 CST 2025 x86_64 GNU/Linux下载离线安装包 浏览器下载https://downloads.mysql.com/archives/get/p/23/file/mysql-test-8.0.33-linux-glibc2.28…

Vite 权限绕过导致任意文件读取(CVE-2025-32395)(附脚本)

免责申明: 本文所描述的漏洞及其复现步骤仅供网络安全研究与教育目的使用。任何人不得将本文提供的信息用于非法目的或未经授权的系统测试。作者不对任何由于使用本文信息而导致的直接或间接损害承担责任。如涉及侵权,请及时与我们联系,我们将尽快处理并删除相关内容。 前言…

poi-tl

官网地址 Poi-tl Documentationword模板引擎https://deepoove.com/poi-tl github 地址 https://github.com/Sayi/poi-tl/tree/master gitcode 加速地址 GitCode - 全球开发者的开源社区,开源代码托管平台GitCode是面向全球开发者的开源社区,包括原创博客,开源代码托管,代码…

操作系统 4.1-I/O与显示器

外设工作起来 操作系统让外设工作的基本原理和过程,具体来说,它概括了以下几个关键步骤: 发出指令:操作系统通过向控制器中的寄存器发送指令来启动外设的工作。这些指令通常是通过I/O指令(如out指令)来实现…

琥珀扫描 2.0.5.0 | 文档处理全能助手,支持扫描、文字提取及表格识别

琥珀扫描是一款功能强大的文档处理应用程序。它不仅仅支持基本的文档扫描功能,还涵盖了文字提取、证件扫描、表格识别等多种实用功能。无论是学生、职员还是教师,都能从中找到适合自己的功能。该应用支持拍照生成电子件,并能自动矫正文档边缘…

jQuery UI 小部件方法调用详解

jQuery UI 小部件方法调用详解 引言 jQuery UI 是一个基于 jQuery 的用户界面和交互库,它提供了一系列小部件,如按钮、对话框、进度条等,这些小部件极大地丰富了网页的交互性和用户体验。本文将详细介绍 jQuery UI 中小部件的方法调用,帮助开发者更好地理解和应用这些小部…

浮点数比较在Eigen数学库中的处理方法

浮点数比较在Eigen数学库中的处理方法 在Eigen数学库中进行浮点数比较时,由于浮点数的精度问题,直接使用运算符通常不是推荐的做法。Eigen提供了几种更安全的方法来进行浮点数比较: 1. 近似相等比较 使用isApprox()函数进行近似比较&#…

Linux-----驱动

一、内核驱动与启动流程 1. Linux内核驱动 Nor Flash: 可线性访问,有专门的数据及地址总线(与内存访问方式相同)。 Nand Flash: 不可线性访问,访问需要控制逻辑(软件)。 2. Linux启动流程 ARM架构: IRAM…