管程与死锁

本文探讨了管程在并发编程中的作用,强调了其数据保护和函数互斥性。同时介绍了死锁的概念、预防策略(如破坏互斥条件和使用银行家算法),以及检测和解除死锁的方法,包括资源分配图分析。
摘要由CSDN通过智能技术生成

一、管程

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
(1)管程中定义的共享数据结构只能被管程中定义的函数进行修改,想要修改共享数据结构只能进行函数调用。
(2)管程中定义了很多函数,但是同一时刻只允许一个进程使用管程中的某个函数。
在这里插入图片描述
管程调用中,代码由用户编写,编译器负责实现个进程互斥的进入管程中的过程,即调用管程中的函数。
此时管程中的empty与full可以看作临界区中有没有产品。
在这里插入图片描述
在这里插入图片描述

二、死锁

1、死锁概念

在这里插入图片描述
死锁:在并发环境下,各进程因竟争资源而造成的一种互相等待对方手里的资源,导致各进程都阻塞,都无法向前推进的现象,就是“死锁”。发生死锁后若无外力干涉,这些进程都将无法向前推进。
在这里插入图片描述
操作系统更关心死锁和饥饿,死循环由程序员造成。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、死锁的处理策略

在这里插入图片描述

2.1、预防死锁

2.1.1 破坏互斥条件

例:使用spooling技术,设置一个输出进程对各进程进行响应,打印机仍然是互斥的访问,但是可以在输出进程中对进程一个一个执行。这样就在逻辑上把独占设备改为共享设备。
在这里插入图片描述

2.2.2破坏不剥夺条件

在这里插入图片描述

2.2.3 破坏请求和保持条件

在这里插入图片描述

2.2.4 破坏循环等待条件

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.2、避免死锁

在这里插入图片描述
在这里插入图片描述

银行家算法安全序列:

在这里插入图片描述
银行家安全性算法(回溯):

在这里插入图片描述
在这里插入图片描述
能找到安全序列,则此时资源分配是安全的,可以进行分配,但是如果找不到安全序列,则让进程进入阻塞状态从而避免死锁。

2.3、死锁的检测和解除
2.3.1 死锁的检测

(1)利用某种数据结构来保存资源的请求和分配信息。
(2)提供(图)算法,利用上述信息来检测系统是否已进入死锁状态。
(3)图中分为两种结点和两种边,资源结点和进程结点。进程申请资源的边和资源分配给进程的边。
在这里插入图片描述
对于这样的图结构,此时R1中三个资源,已经分配给进程P1两个,P2一个,R2中两个资源已经分配给P2一个,还有一个资源剩余。此时,P1向R2求求一个资源那么便可以分配。而P2向R1申请资源由于R1已经没有资源了便会阻塞,只能等P1执行完毕归还给R1资源,P2才可以开始执行。因此找到一个安全序列{P1,P2}。先消除P1的所有边,再消除P2的所有边。如果最终不能消除所有边,那么此时就是发生了死锁,而连着边的进程便会陷入死锁状态。在这里插入图片描述

在这里插入图片描述

2.3.2死锁的解除

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值