操作系统专栏——死锁

news/2024/5/20 12:48:11 标签: 死锁

文章目录

死锁

首先我们要明白,什么是死锁

死锁是指两个及以上进程在执行过程中,由于竞争资源或者由于彼此通信而造成阻塞,无法继续推进进程的一种情况,此时称系统处于死锁状态或者系统产生了死锁

打个比方,我们有线程A和线程B,资源C和资源D,现在线程A正在占有资源C,线程B正在占有资源D,而又只有当线程A或者线程B同时拥有资源C和D的时候才能释放内存,这时候,就产生了阻塞,最后,成为了死锁

1. 死锁的产生

先来说说,为什么会产生死锁

一共有两个原因:

  • 竞争资源

也就是说,共享资源数量不满足各个进程需求从而发生死锁

  • 进程调度顺序不当

如果按照ABCD执行,必然会造成竞争资源而死锁,但如果我们ADBC就没事了,这也就是由于进程调度顺序不当而产生的问题。

而当死锁产生的时候,必然会满足以下四个条件:

  1. 互斥条件

意思也就是说,进程对资源的使用是排他性的使用,而资源对于某一个进程,也是唯一的,其他线程只能排队。

  1. 请求保持条件

也就是说,进程至少保持一个资源,又提出新的资源请求,新的资源被占用,请求被阻塞,而本来就占用的资源,因为阻塞,也无法释放。

  1. 不可剥夺条件

进程获得的资源在未完成使用前不能被剥夺,而获得到的资源又只能由进程自身释放。

  1. 环路等待条件

发生死锁的时候,必然存在进程-资源的环形等待链。

2. 死锁的处理

我们针对死锁的处理,将会分成两个方面去说。

上面,我们也说了,死锁产生的条件,共有四个,分别是互斥条件,请求保持条件,不可剥夺条件,环路等待条件,而当这四个条件全部被触发的时候,死锁才会产生。

那么,我么我们只需要破坏其中的一个条件或者多个条件,就可以将死锁的产生,破坏掉。

而我们可以人为去进行破坏的有:请求保持条件,不可剥夺条件,环路等待条件。

首先说一下如何破坏请求保持条件:

我们可以让系统规定进程运行之前,一次性申请所有需要的资源。因为进程在运行期间不会提出资源请求,所以就可以摒弃掉请求保持条件。

接着是如何破坏不可剥夺条件:

当一个进程请求新的资源得不到满足的时候,必须释放占有的资源。而当进程运行的时候占有的资源可以被释放,意味着可以被剥夺。

最后是如何破坏环路等待条件:

我们只需要将可用资源线性排序,申请必须按照需要递增申请,线程申请不再形成环路,就摒弃了环路等待条件。

  • 银行家算法:

先描述一下银行家算法的背景:

客户申请的贷款是有限的,每次申请需要声明最大资金量,银行家在能够满足贷款的时候,都应该给用户贷款,客户在使用贷款之后,能够立刻归还。

在这里插入图片描述

在这里插入图片描述
然后我来描述一下,P1 P2 P3 P4代表四个进程,A B C D代表四种资源。第一张图四个进程对于四种资源一共需求的情况,已分配的情况,和所剩下的资源的情况。

第二张图,则是对比了四个进程还需要多少资源的情况和我们还剩下多少资源的情况,通过对比,我们发现,可以优先满足P2线程,从而打破死锁的形成条件。


http://www.niftyadmin.cn/n/784328.html

相关文章

QT登录窗口闪退的代码分析

最初使用:frmLogin w;w.show();//显示登录界面没问题,登录界面可正常运行 加了条件判据发现登录界面闪退 if(g_Caller ia) {//用户调用才显示登录界面 frmLogin w; w.show();//显示登录界面 } 改成如下写法登录界面正常显示 if(g_Caller ia) …

操作系统专栏——内存分配与回收

文章目录存储管理之内存分配与回收1. 内存分配2. 内存回收存储管理之内存分配与回收 在早期的计算机编程中,并不需要过多的存储管理,但是随着计算机和程序的越来越复杂,存储管理成为必要。 而存储管理的意义也就在于: 确保计算…

MSP430 波特率寄存器配置以及反推真实波特率

首先看上图,usart模块的波特率值设定是通过以下三个寄存器决定的:UxBR0,UxBR1,UxMCTL ,其中UxBR1UxBR0为整数部分,UxMCTL为设定小数部分,两者结合起来为一个16位的字 举例1:波特率=9600,时钟源…

SpringCloud实践专栏——网关Zuul

代码已上传至github: 1. 网关Zuul的简介 什么是Zuul? 我们已知,开启整个微服务工程项目的时候,都会在发送http请求的时候,通过一个路由的选择来到达指定的module,而网关的作用就是 为什么需要微服务网关…

QT QTableWidget控件按内容自动换行

1,在初始化时用了如下代码: connect(m_pCurTblWdg,SIGNAL(itemChanged(QTableWidgetItem*)),m_pCurTblWdg,SLOT(resizeRowsToContents()) ); 能看到效果,内容确实能自动换行,可是出现一个更郁闷的问题,界面卡死&…

操作系统专栏——段页式存储管理

文章目录1. 页式存储管理2. 段式存储管理3. 段页式存储管理上一节,从物理内存角度讲述了内存管理,这一节,将会从进程的角度来讲述一下存储管理。所以,我们思考一下,操作系统是怎么去管理进程的内存空间的呢&#xff1f…

cmd指令记录

1,跳转指令 如果同一个盘就用 cd 路径 如 cd c:\11 如果不同分区就用 cd /d 盘符\11 如 cd /d c:\11 注:进入含有特殊字符目录时需要加引号 例如 cd "c:\program files" 2,运行jar软件 java -jar 需要运行的jar名称.jar …

gdb+gdbserver远程调试技术—调试环境搭建

一,gdb下载 【这里使用gdb-7.12..tar.gz】 建议先下载到home目录下的Download文件夹里 #cd home #mkdir Download #cd Download #wget http://mirror.bjtu.edu.cn/gnu/gdb/gdb-7.12.1.tar.gz 说明:【http://ftp.gnu.org/gnu/gdb/下载地址亦可…