第二章 进程与线程 二十、死锁的处理策略(预防死锁、避免死锁、死锁的检测和解除)

news2024/11/18 22:52:13

目录

一、分类

二、预防死锁

1、破坏互斥条件

2、破坏不剥夺条件

3、破坏请求和保持条件

4、破坏循环等待条件

5、总结

三、避免死锁

1、什么是安全序列

2、安全状态和不安全状态

3、银行家算法

(1)核心思想

(2)例子

(3)代码实现

(4)考点

四、死锁的检测和解除

1、死锁的检测

(1)资源分配图

(2)例子

2、死锁的解除

五、总结


一、分类

二、预防死锁

1、破坏互斥条件

2、破坏不剥夺条件

3、破坏请求和保持条件

4、破坏循环等待条件

5、总结

三、避免死锁

1、什么是安全序列

  • 所谓安全序列,就是指如果系统按照这种序列分配资源,则每个进程都能顺利完成。
  • 只要能找出一个安全序列,系统就是安全状态。
  • 当然,安全序列可能有多个。
     

2、安全状态和不安全状态

  • 如果分配了资源之后,系统中找不出任何一个安全序列,系统就进入了不安全状态。
  • 这就意味着之后可能所有进程都无法顺利的执行下去。
  • 当然,如果有进程提前归还了一些资源,那系统也有可能重新回到安全状态,不过我们在分配资源之前总是要考虑到最坏的情况。
  • 如果系统处于安全状态,就一定不会发生死锁。
  • 如果系统进入不安全状态,就可能发生死锁(处于不安全状态未必就是发生了死锁,但发生死锁时一定是在不安全状态)

3、银行家算法

(1)核心思想

在进程提出资源申请时,先预判此次分配是否会导致系统进入不安全状态。如果会进入不安全状态,就暂时不答应这次请求,让该进程先阻塞等待。

(2)例子

1、若我们有如下例子,我们计算出各个进程最大还需要多少,和剩余多少

2、我们依次对比各个进程需要的资源和剩余资源

此时P1一定可以顺利执行完毕,所以将P1存入安全序列,并增加可用资源的值

此时的安全序列为:P1

3、然后重新从P0开始比对,发现还是不够;接下来是P2,同样不够;

直到P3,剩余资源满足P3的要求资源

此时的安全序列为:P1、P3

4、依此类推最终得到的安全序列为:P1、P3、P0、P2、P4

(3)代码实现
#include <iostream>
#include <vector>

using namespace std;

// 定义函数:银行家算法
bool banker_algorithm(vector<int> &available, vector<vector<int>> &max_request, vector<vector<int>> &allocation)
{
    // 计算出需要的资源和已分配的资源
    vector<vector<int>> need(max_request.size(), vector<int>(max_request[0].size()));
    for (int i = 0; i < allocation.size(); i++) {
        for (int j = 0; j < allocation[0].size(); j++) {
            need[i][j] = max_request[i][j] - allocation[i][j];
        }
    }
    // 定义一些变量
    vector<bool> finish(allocation.size(), false);  // 用于标记每个进程是否完成
    vector<int> work(available);  // 定义工作向量
    // 实现银行家算法
    while (true) {
        // 在未完成的进程中查找一个满足条件的进程
        int i = -1;
        for (int k = 0; k < allocation.size(); k++) {
            if (!finish[k]) {
                bool can_allocated = true;
                for (int j = 0; j < allocation[0].size(); j++) {
                    if (need[k][j] > work[j]) {
                        can_allocated = false;
                        break;
                    }
                }
                if (can_allocated) {
                    i = k;
                    break;
                }
            }
        }
        // 如果找不到满足条件的进程,则返回false表示不能进行资源分配
        if (i == -1) {
            return false;
        }
        // 更新工作向量和已完成的进程
        for (int j = 0; j < allocation[0].size(); j++) {
            work[j] += allocation[i][j];
        }
        finish[i] = true;
        // 如果所有进程都已完成,则返回true表示可以进行资源分配
        if (count(finish.begin(), finish.end(), true) == finish.size()) {
            return true;
        }
    }
}

int main()
{
    // 测试
    vector<int> available = {3, 3, 2};
    vector<vector<int>> max_request = {
        {7, 5, 3},
        {3, 2, 2},
        {9, 0, 2},
        {2, 2, 2},
        {4, 3, 3},
    };
    vector<vector<int>> allocation = {
        {0, 1, 0},
        {2, 0, 0},
        {3, 0, 2},
        {2, 1, 1},
        {0, 0, 2},
    };
    if (banker_algorithm(available, max_request, allocation)) {
        cout << "可以进行资源分配" << endl;
    } else {
        cout << "不能进行资源分配" << endl;
    }
    return 0;
}
 
(4)考点

四、死锁的检测和解除

1、死锁的检测

(1)资源分配图

(2)例子

1、我们有如下例子

2、我们观察P1连接的线,发现它在请求R2的一个资源;而R2此时恰好剩余一个资源,所以P1可以不会发生阻塞;而P2申请的R1资源已经被分配完了,所以P2会被阻塞。

3、当P1释放资源后,P2被唤醒,此时它也可以正常运行

4、当消除所有边后

2、死锁的解除

五、总结

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

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

相关文章

【ElasticSearch】使用 Java 客户端 RestClient 实现对文档的查询操作,以及对搜索结果的排序、分页、高亮处理

文章目录 前言&#xff1a;RestClient 查询文档的 RestAPI一、全文检索查询1.1 match_all 查询1.2 match 查询1.3 multi_match 查询 二、精确查询2.1 term 查询2.2 range 查询 三、复合查询&#xff1a;Boolean 查询与 function score 查询的综合案例四、对查询结果的处理4.1 将…

关于Qualifier你要知道的二三事

&#x1f35e; Qualifier注解的作用-定义Bean-指定Bean的名称 Qualifier注解可以区分具有相同类型的多个Bean&#xff0c;用于明确指定要注入的Bean的名称或限定符。通过为要注入的Bean添加 Qualifier注解&#xff0c;你可以告诉Spring应该使用哪个Bean&#xff0c;以解决Spri…

黑马JVM总结(三十一)

&#xff08;1&#xff09;类加载器-概述 启动类加载器-扩展类类加载器-应用程序类加载器 双亲委派模式&#xff1a; 类加载器&#xff0c;加载类的顺序是先依次请问父级有没有加载&#xff0c;没有加载自己才加载&#xff0c;扩展类加载器在getParent的时候为null 以为Boots…

zabbix监控实战1

1、zabbix监控平台部署 重新克隆纯净虚拟机 数据库初始化 修改密码为WHqwerty123 初始化完成 创建zabbix数据库 基础配置和服务启动 访问 2、zabbix添加监控节点 修改字体文件 在客户端 手动添加监控节点 自动添加监控节点 3、zabbix api 自动注册 停掉自动发现 删掉serve…

VMware 下模拟软 RAID 的创建及故障恢复

Author&#xff1a;rab 目录 前言一、创建 RAID1.1 环境1.2 什么是 RAID&#xff1f;1.3 软 RAID 和硬 RAID1.4 如何创建软 RAID&#xff1f; 二、故障模拟与数据恢复2.1 故障模拟2.2 故障恢复 思考&#xff1f; 前言 一块物理硬盘要投入生产使用&#xff0c;一般会经历一下这…

面试经典 150 题 2 —(滑动窗口)— 3. 无重复字符的最长子串

3. 无重复字符的最长子串 方法 class Solution { public:int lengthOfLongestSubstring(string s) {int result 0, length s.length();int start 0, end 0;while(end < length){// 发现有重复字符时&#xff0c;可以直接把左指针移动到第一个重复字符的下一个位置for(i…

Web前端-Vue2+Vue3基础入门到实战项目-Day3(生命周期, 案例-小黑记账清单, 工程化开发入门)

Web前端-Vue2Vue3基础入门到实战项目-Day3 生命周期生命周期 & 生命周期四个阶段生命周期钩子生命周期案例created应用mounted应用 案例 - 小黑记账清单工程化开发入门工程化开发和脚手架项目运行流程index.htmlmain.js 组件化组件注册局部注册全局注册 来源 生命周期 生命…

1312. 序列统计

1312. 序列统计 - AcWing题库 L~R范围可以等同于0~R-L范围 相当于在R-L1个数中选出k个数 令 则变为 相当于在R-Lk个数中选出k个数 需要计算 #include<bits/stdc.h> #define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); #define endl \nusing namespace std;t…

Filter(过滤器)Intercerptor(拦截器)

Filter过滤器 顾名思义&#xff0c;Filter可以对请求进行过滤&#xff0c;当浏览器发送请求时&#xff0c;首先先会被Filter进行拦截&#xff0c;Filter可以决定此次拦截是否放行&#xff0c;如果选择放行&#xff0c;放行之后还会返回Filter执行剩下的代码。 使用方法&…

YOLOv7独家改进:Multi-Dconv Head Transposed Attention注意力,效果优于MHSA| CVPR2022

💡💡💡本文独家改进:Multi-Dconv Head Transposed Attention注意力,可以高效的进行高分辨率图像处理,从而提升检测精度 MDTA | 亲测在多个数据集能够实现大幅涨点 收录: YOLOv7高阶自研专栏介绍: http://t.csdnimg.cn/tYI0c ✨✨✨前沿最新计算机顶会复现 �…

初识Java 13-2 异常

目录 标准Java异常 新特性&#xff1a;更好的NullPointerException报告机制 使用finally执行清理 finally有什么用 在return时使用finally 缺陷&#xff1a;异常丢失 异常的约束 构造器 本笔记参考自&#xff1a; 《On Java 中文版》 标准Java异常 Throwable类描述了任…

项目生命周期

阶段 项目经理或组织可以将每一个项目划分为若干个阶段&#xff0c;以便于有效地进行管理控制&#xff0c;并实施该项目组织的日常运作联系起来。 项目划分为四个阶段&#xff1a;概念、计划、实施、结束 生命期 项目阶段合在一起称为项目生命期&#xff0c;项目生命期确定了将…

Go流程控制与快乐路径原则

Go流程控制与快乐路径原则 文章目录 Go流程控制与快乐路径原则一、流程控制基本介绍二、if 语句2.1 if 语句介绍2.2 单分支结构的 if 语句形式2.3 Go 的 if 语句的特点2.3.1 分支代码块左大括号与if同行2.3.2 条件表达式不需要括号 三、操作符3.1 逻辑操作符3.2 操作符的优先级…

【k8s】ingress-nginx通过header路由到不同后端

K8S中ingress-nginx通过header路由到不同后端 背景 公司使用ingress-nginx作为网关的项目&#xff0c;需要在相同域名、uri&#xff0c;根据header将请求转发到不同的后端中在稳定发布的情况下&#xff0c;ingress-nginx是没有语法直接支持根据header做转发的。但是这个可以利…

ubuntu配置yolov5环境

本文硬件平台为工控机&#xff0c;系统环境为ubuntu18 配置yolov5步骤 1.下载pytorch和torchvision软件包 由于在线安装容易出现安装失败&#xff0c;所以本文使用的是本地安装。本文是基于miniconda安装的&#xff0c;miniconda安装参考之前的博客&#xff1a;ubuntu中安装m…

ssm+vue的台球厅管理系统(有报告)。Javaee项目,ssm vue前后端分离项目。

演示视频&#xff1a; ssmvue的台球厅管理系统(有报告)。Javaee项目&#xff0c;ssm vue前后端分离项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring S…

差模电感和共模电感的差别

一、初步了解差模、共模的概念 超链接&#xff0c;点击鼠标打开&#xff1a;X电容和Y电容&#xff1b;差模与共模初认识 二、差模和共模电感的二者区别 共模电感和差模电感&#xff0c;是电路中常用的滤波电感、EMI器件&#xff0c;两者经常以环形电感线圈的方式存在。 首先…

理解http中cookie!C/C++实现网络的HTTP cookie

HTTP嗅探&#xff08;HTTP Sniffing&#xff09;是一种网络监控技术&#xff0c;通过截获并分析网络上传输的HTTP数据包来获取敏感信息或进行攻击。其中&#xff0c;嗅探器&#xff08;Sniffer&#xff09;是一种用于嗅探HTTP流量的工具。 在HTTP嗅探中&#xff0c;cookie是一…

Python一步到位实现图像转PDF自动化处理详解

什么是 img2pdf 库&#xff1f; img2pdf 是一个 Python 库&#xff0c;它可以让你轻松地把多张图像转换为 PDF 文件。它支持多种图像格式&#xff0c;如 JPG, PNG, GIF, BMP 等&#xff0c;并且可以自动调整图像的大小和方向&#xff0c;以适应 PDF 的页面大小和方向。它还可以…

跨域问题-笔记

这里写目录标题 一、什么是跨域&#xff1a;二、跨域问题解决思路&#xff1a;1.从浏览器入手2.从域名入手3.从jsonp入手4.从代理入手 一、什么是跨域&#xff1a; 跨域指的是不同服务器之间不能相互访问各自的资源或者数据&#xff0c;这出于一个策略——“同源策略”&#x…