进程(四)

news2025/1/23 2:08:02

进程四

    • 2.21 管程
    • 2.22 死锁的概念
    • 2.23 死锁的处理策略
      • 2.23.1 破坏四个条件
      • 2.23.2 动态策略: 避免死锁
      • 2.23.3 死锁的检测和解除

2.21 管程

本小计知识概览

image-20230522223010964

为什么要引入管程

image-20230522223229669

管程的定义和基本特征

管程是一种特殊的软件模块,有这些部分组成:

  1. 局部于管程的共享数据结构说明;
  2. 对该数据结构进行操作的一组过程;
  3. 对局部于管程的共享数据设置初始值的语句:
  4. 管程有一个名字。

共享数据结构可以理解为临界资源,一组过程其实就是一些访问临界资源的函数(方法)。

管程的基本特征:

  1. 局部于管程的数据只能被局部于管程的过程所访问;
  2. 一个进程只有通过调用管程内的过程才能进入管程访问共享数据:
  3. 每次仅允许个进程在管程内执行某个内部过程

进程只能通过特定的函数(方法)才能访问临界资源。并且在某一时刻,只能有一个进程访问。

用管程解决生产者消费者的问题

image-20230522224040659

image-20230522224716106

Java中类似于管程的机制

image-20230522224926815

总结

image-20230522225013302

2.22 死锁的概念

本小节概览

image-20230523214041686

什么是死锁

image-20230523214435134

死锁、饥饿、死循环的区别

死锁: 各进程互相等待对方手里的资源,导致各进程都阻塞,无法向前推进的现象。

饥饿:由于长期得不到想要的资源,某进程无法向前推进的现象。比如:在短进程优先 (SPF) 算法中,若有源源不断的短进程到来,则长进程将一直得不到处理机,从而发生长进程“饥饿”

死循环:某进程执行过程中一直跳不出某个循环的现象。有时是因为程序逻辑 bug 导致的,有时是程序员故意设计的。

image-20230523214756655

死锁产生的必要条件

产生死锁必须同时满足一下四个条件,只要其中任一条件不成立,死锁就不会发生。

互斥条件:只有对必须互斥使用的资源的争抢才会导致死锁(如哲学家的筷子、打印机设备)像内存、扬声器这样可以同时让多个进程使用的资源是不会导致死锁的(因为进程不用阻塞等待这种资源)。

不剥夺条件:进程所获得的资源在未使用完之前,不能由其他进程强行夺走,只能主动释放。

请求和保持条件: 进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源又被其他进程占有,此时请求进程被阻塞,但又对自己已有的资源保持不放

循环等待条件 :存在一种进程资源的循环等待链,链中的每一个进程已获得的资源同时被下一个进程所请求

注意!发生死锁时一定有循环等待,但是发生循环等待时未必死锁 (循环等待是死锁的必要不充分条件)

如果同类资源数人于1,则即使有循环等待,也未必发生死锁。但如果系统中每类资源都只有个,那循环等待就是死锁的充分必要条件了

什么时候会发生死锁

  1. 对系统资源的竞争。各进程对不可剥夺的资源(如打印机)的竞争可能引起死锁,对可剥夺的资源(CPU)的竞争是不会引起死锁的。

  2. 进程推进顺序非法。请求和释放资源的顺序不当,也同样会导致死锁。例如,并发执行的进程P1.P2 分别申请并占有了资源 R1、R2,之后进程P1又紧接着申请资源R2,而进程P2又申请资源R1,两者会因为申请的资源被对方占有而阻塞,从而发生死锁。

  3. 信号量的使用不当也会造成死锁。如生产者-消费者问题中,如果实现互斥的P操作在实现同步的(可以把互斥信号量、同步信号量也看做是一种抽象的系统资P操作之前,就有可能导致死锁。)

总之,对不可剥夺资源的不合理分配,可能导致死锁。

死锁的处理策略

  1. 预防死锁。破坏死锁产生的四个必要条件中的一个或几个。
  2. 避免死锁。用某种方法防止系统进入不安全状态,从而避免死锁(银行家算法)
  3. 死锁的检测和解除。允许死锁的发生,不过操作系统会负责检测出死锁的发生,然后采取某种措施解除死锁。

总结

image-20230523215924275

2.23 死锁的处理策略

本小节概览

image-20230523220020239

2.23.1 破坏四个条件

破坏互斥条件

image-20230523220237282

该策略的缺点: 并不是所有的资源都可以改造成可共享使用的资源。并且为了系统安全,很多地方还必须保护这种互斥性。因此,很多时候都无法破坏互斥条件。

破坏不可剥夺条件

image-20230523220526036

破坏请求和保持条件

image-20230523220747110

破坏循环等待条件

image-20230523221103460

总结

image-20230523221217401

2.23.2 动态策略: 避免死锁

image-20230523221604313

什么是安全序列

image-20230523221909280

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

安全序列、不安全状态与死锁的关系

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

如果系统处于安全状态,就一定不会发生死锁。如果系统进入不安全状态,就可能发生死锁 ( 处于不安全状态未必就是发生了死锁,但发生死锁时一定是在不安全状态)

因此可以在资源分配之前预先判断这次分配是否会导致系统进入不安全状态,以此决定是否答应资源分配请求。这也是“银行家算法”的核心思想。

银行家算法

银行家算法是荷兰学者 Dijkstra 为银行系统设计的,以确保银行在发放现金贷款时,不会发生不能满足所有客户需要的情况。后来该算法被用在操作系统中,用于避免死锁

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

image-20230523222858610

检查剩余可用资源换 {3,3,2} 满足 P1,先分配给P1,P1结束后归还资源,此时剩余资源 {5,3,2}

image-20230523223009437

检查剩余可用资源 {5,3,2} 满足P3,先分配给P3,P3结束后归还资源,此时剩余资源 {7,4,3}

image-20230523223207922

按照以上的逻辑,顺序将资源分配给 {P1,P3,P0,P2,P4}。

说明该系统处于安全状态,暂时不会发生死锁。

image-20230523223348677

代码实现思想

image-20230523223941107

image-20230523224137081

2.23.3 死锁的检测和解除

死锁的检测

image-20230523224815472

image-20230523224846302

R1 有三个资源,分配P1俩个,P2一个,P2请求R1时,会被阻塞。

R2 有俩个资源,分配 P2 一个资源剩余一个,P1请求R2分配资源,R2正好还有一个,因此分配给P1,P1执行完归还。

此时 R1 剩余俩个,分配给P2,P2执行。

按上述过程分析,就不会发生死锁。

image-20230523224923696

以下这种 R2 无法满足 P1 的请求,就会发生死锁。

image-20230523225234605

image-20230523225441516

死锁的解除

一旦检测出死锁的发生,就应该立即解除死锁。

补充:并不是系统中所有的进程都是死锁状态,用死锁检测算法化简资源分配图后,还连着边的那些进程就是死锁

进程解除死锁的主要方法有:

  1. 资源剥夺法: 拄起(暂时放到外存上) 某些死锁进程,并抢占它的资源,将这些资源分配给其他的死锁进程。但是应防止被挂起的进程长时间得不到资源而饥饿。

  2. 撤销进程法(或称终止进程法):强制撤销部分、甚至全部死锁进程,并剥夺这些进程的资源。这种方式的优点是实现简单,但所付出的代价可能会很大。因为有些进程可能已经运行了很长时间,已经接近结束了,一旦被终止可谓功亏一簧,以后还得从头再来。

  3. 进程回退法 : 让一个或多个死锁进程回退到足以避免死锁的地步。这就要求系统要记录进程的历史信息。设置还原点。

image-20230523230017318

优先考虑对 优先级低、执行时间短、需要时间长,使用资源多,交互式进程 进程撤销。

总结

image-20230530140540916

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

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

相关文章

javaWeb ssh微博系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 java ssh微博系统是一套完善的web设计系统(系统采用ssh框架进行设计开发),对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开 发。开发环境为TOMCAT7.0,Myecli…

智慧校园建设主要包括哪些方面的内容?

在当今数字化的时代,越来越多的学校开始实施智慧校园计划,旨在为学生和教师提供更加高效、便捷的学习和教学环境。 那么,究竟什么是智慧校园呢?智慧校园建设主要包括哪些方面的内容?这篇就来详细讲一讲! …

3年外包出来,华为、字节全都一面挂,我哭死.....

测试员可以先在外包积累经验,以后去大厂就很容易,基本不会被卡,事实果真如此吗?但是在我身上却是给了我很大一巴掌... 所谓今年今天履历只是不卡简历而已,如果面试答得稀烂,人家根本不会要你。况且要不是大…

字节软测划水四年,内容过于真实......

先简单交代一下吧,潇潇是某不知名211的本硕,18年毕业加入一个小厂,之后跳槽到了字节跳动,一直从事测试开发相关的工作。之前没有实习经历,算是四年半的工作经验吧。 这四年半之间他完成了一次晋升,换了一家…

(转载)基于多层编码遗传算法的车间调度算法(matlab实现)

以下内容大部分来源于《MATLAB智能算法30个案例分析》,仅为学习交流所用。 1 理论基础 遗传算法具有较强的问题求解能力,能够解决非线性优化问题。遗传算法中的每个染色体表示问题中的一个潜在最优解,对于简单的问题来说,染色体…

【ProtoBuf】2.环境配置

————————————每一个不曾起舞的日子都是对生命的辜负。 ProtoBuf安装 一. 安装Protofbuf-Win二. 配置环境变量三.验证是否添加成功四. Linux下Protobuf安装包的安装1. 下载ProtoBuf2. 解压压缩包3. 安装ProtoBuf4. 最后添加内容5.检查是否安装成功 五. 升级g到8版本…

Java 高级应用-多线程-(一)实现 Runnable 接口与继承 Thread 类

1.1 程序、进程与线程 • 程序(program):为完成特定任务,用某种语言编写的一组指令的集合。即指一段 静态的代码,静态对象。 • 进程(process):程序的一次执行过程,或是正…

支持图片扩展等AI功能,PS 2023 v24.5 安装教程

主要功能 PS发布了革命性的AI功能,创意填充,创意工具,图像预设,智能移除,上下文任务栏,智能渐变。 “创意填充”是一套具有革命性且神奇的全新功能,它由 AI 提供支持,基于您与生俱…

Spring Boot如何实现定时任务调度?

Spring Boot如何实现定时任务调度? Spring Boot提供了非常方便的方式来实现定时任务调度,我们可以使用Spring框架自带的Scheduled注解来实现。在本文中,我们将介绍如何使用Scheduled注解进行定时任务调度。 什么是定时任务调度? …

网瘾少年转行软件测试,月薪20k? 叛逆少年终归成长...

前言: 高中住校期间沉迷游戏(DNF),尤其是高三那年,晚上翻墙出去通宵,白天上课睡觉,高考自然是考了个稀碎,高考结束那个暑假刚开始觉得整个人都自由了,爸妈看我没考上大学,知道我心情…

使用kong网关来实现负载均衡

一、负载均衡 当前一个服务进行多实例部署后,外部调用其中任意一个服务地址都可以得到响应。但是外部不可能记住也不应该记住所有的服务地址,这个时候就需要一个统一入口提供给外部进行调用,类似提供一个虚拟主机形式进行实现。后续就请求这…

Socket(七)

文章目录 1. 单文件服务器2. 重定向器Redirector3. 功能完备的HTTP服务器 1. 单文件服务器 要研究HTTP服务器,先从一个简单的服务器开始,无论接受什么请求,这个服务器都始终发送同一个文件。这个单文件服务器名为SingleFileHTTPServer&#…

泛型的介绍以及原理

目录 一、前言 二、什么泛型 三、为什么要使用泛型 3.1、保证了类型的安全性。 3.2、消除强制转换 3.3、提高程序的性能 3.4、 提高了代码的重用性 四、如何使用泛型 4.1、 泛型类 4.2、泛型接口 4.3、泛型方法 五、泛型通配符 5.1、无边界的通配符 5.2、固定上边…

telnet 120.XX8888会超时或者无反应,防火墙加入8888,安全组也加入8888,但是访问120.XX:8888也没有反应

⚠️命令都是远程登录的哦 选这个远程连接: 初次密码自己设置别忘了 1、看是否8888端口是否有正常监听 netstat -ntlp我这边清楚看到没有8888 2、如果没有监听是无法连接,需要安装对应的程序同时监听8888端口 比如我想用宝塔面板 我就需要下载宝塔面…

一步步入门编写PHP扩展

1、写在最前 随着互联网飞速发展,lamp架构的流行,php支持的扩展也越来越多,这样直接促进了php的发展。 但是php也有脚本语言不可避免的问题,性能比例如C等编译型语言相差甚多,所以在考虑性能问题的时候最好还是通过php…

00后实在太强了,98年的我被卷废了,太离谱了...

前言 最近在公司我真的感受到了什么叫“卷”,以往的我划划水日子过的轻轻松松,直到公司最近招了一个00后进来,真的让我感受到了危机,刚进来工资就和我差不多,我刚开始其实有点不太舒服,凭什么我辛辛苦苦干…

在pycharm中调用qt界面功能

目录 一、新建designer文件 1、打开pycharm中的designer 2、创建个widget 3、拖动几个简单按钮 4、保存一下 5、右击test1.ui 这边首先环境已经配置完毕,可以参考之前写的博客: 关于PyQt5的环境搭建_Littlehero_121的博客-CSDN博客 一、新建desi…

如何使用PHM技术提高汽车工业的效率和性能?

在汽车工业中,预测性健康管理(PHM)技术正日益受到关注。作为一种基于数据驱动的解决方案,PHM技术通过实时监测和分析设备和系统的状态,实现对设备健康状况的预测和管理。 图.汽车制造(iStock) 汽…

代码示范【FabEdge v0.8.0】配置 connector 公开端口

FabEdge项目简介: FabEdge是博云在2021年8月发起,基于Kubernetes 构建的专注于边缘计算场景的容器网络方案,支持 KubeEdge 、SuperEdge、OpenYurt 等主流边缘计算框架。旨在解决边缘计算场景下容器网络配置管理复杂、网络割裂互不通信、缺少…

hadoop单机版部署

1.下载hadoop wget --no-check-certificate https://mirrors.bfsu.edu.cn/apache/hadoop/common/hadoop-3.3.1/hadoop-3.3.1.tar.gz 2.解压重命名 tar -zxvf hadoop-3.3.1.tar.gz mv hadoop-3.3.1.tar.gz hadoop 3.编辑hosts vim /etc/hosts 172.17.1.1 hadoop925 4.进入配置…