其他分享
首页 > 其他分享> > 操作系统第五章:死锁

操作系统第五章:死锁

作者:互联网

1 思索地概念和产生原因

1.1 死锁的基本概念

1.所谓死锁,是指一组并发执行的进程彼此等待对方释放资源,而在没有得到对方占有的资源之前不释放自己占有的资源,导致彼此都不能向前推进,称该组进程发生了死锁。
2.死锁产生后,在无外力干预下,陷入死锁的各个进程都永远不能向前推进,导致这些进程不能正常结束。同时,要求共享使用死锁进程所占资源的其他进程、或者需要与死锁进行某种合作的其他进程也会受到牵连,不能正常结束。最终可能导致系统瘫痪,给系统和用户带来极大损失。因此,操作系统设计者必须对死锁现象给予充分重视。
在这里插入图片描述
通过上面介绍的例子可以发现,死锁具有以下特点:
① 陷入死锁的进程是系统并发进程中的一部分,且至少要有2个进程,单个进程不能形成死锁。
② 陷入死锁的进程彼此都在等待对方释放资源,形成一个循环等待链。
③ 死锁形成后,在没有外力干预下,陷入死锁的进程不能自己解除死锁,死锁进程无法正常结束。
④ 如不及时解除死锁,死锁进程占有的资源不能被其他进程所使用,导致系统中更多进程阻塞,造成资源利用率下降

1.2 产生死锁的原因

  1. 资源竞争
    死锁产生的根本原因是资源竞争其分配不当。因为多道程序并发执行,造成多个进程在执行中所需的资源数远远大于系统能提供的资源数
    计算机系统中有很多种资源,按照占用方式来分,可分为可剥夺资源与不可剥夺资源。
    (1)可剥夺资源
    某进程在获得这类资源后,即使该进程没有使用完,该类资源也可以被其他进程剥夺使用。例如:CPU、内存、磁盘等
    (2)不可剥夺资源
    当系统把这类资源分配给某进程后,不能强行收回,只能在进程使用完后自行释放,然后其他进程才能使用。这类资源众多,例如:打印机、刻录机、CD-ROM驱动器等

  2. 推进顺序不当
    并发执行的诸进程在运行中存在异步性,彼此间相对执行速度不定,存在着多种推进顺序。并发进程间推进顺序不当时会引起死锁。
    不可剥夺资源少未必一定产生死锁。死锁在一种很巧合的推进顺序中才会发生。在不能增加不可剥夺资源数量的前提下,我们要采取各种措施,尽量避免产生死锁的不合理推进顺序出现.
    在这里插入图片描述
    在这里插入图片描述

由以上分析我们得出以下两个结论:
(1)用户编写应用程序时或操作系统进行资源分配时应采取相应措施,避免导致死锁发生的进程间的推进顺序出现。
为避免死锁现象的产生,用户在编写应用程序时,除了考虑如何实现某种功能外,还要考虑避免死锁发生。
(2)死锁是在特定的推进顺序中才会出现,具有一定的隐蔽性。
有的死锁隐藏的很深,只有在很巧合的情况下,导致死锁的推进顺序才会发生。发生死锁的可能性远低于不发生死锁的可能性。应用程序编写者或操作系统设计者往往需要花费大量精力去测试程序或系统,才能发现死锁并解决它

2 死锁的必要条件

死锁发生必须具备一定的条件。Coffman首先提出死锁发生的4个必要条件,故又称为Coffman条件。
由于这4个条件是必要条件,一旦死锁出现,这4个条件都必然成立。因此,只要有一个必要条件被系统或用户破坏掉,就不会出现死锁现象。
四个必要条件:
(1)互斥条件
(2)请求和保持条件
(3)不剥夺条件
(4)环路等待条件

3 死锁的处理

3.1 死锁的处理方法

(1)预防死锁
(2)避免死锁
(3)检测死锁
(4)解除死锁

3.2 资源分配图

4 死锁的静态预防

4.1 破坏互斥条件

4.2 破坏请求和保持条件

4.3 破坏不剥夺条件

破坏“不剥夺”条件存在以下主要缺点:

① 系统代价较大。在剥夺用户资源时,要保存进程的上下文现场,在进程重新获得资源时,要恢复进程上下文现场,系统开销较大,程序执行延迟。
② 临界资源不可以剥夺。如果强行剥夺,会产生不良后果。

4.4 破坏环路等待条件

环路等待出现的根本原因是并发执行进程请求资源的顺序是随机的。假如有两个进程,一个进程先申请资源A再申请资源B,另一个进程先申请资源B再申请资源A。这两个进程随机推进时,就可能产生死锁。如果系统事先把全部资源按类型进行线性排队,并对每类资源赋予不同的序号,然后按序进行分配,规定进程不能连续两次申请同类资源。这样一来,进程在申请、占用资源时就不会形成资源申请环路,也就不会发生环路等待。

5 死锁的静态避免

5.1 系统的安全状态

5.2 银行家算法

银行家算法的基本思想是:在资源分配前,资源分配程序计算资源分配后系统是否处于安全状态,如处于安全状态则把资源分配给申请进程,如处于不安全状态则令申请资源的进程阻塞,不响应其资源申请。
银行家算法的核心理念是把资源分配给那些最容易执行完成的进程,保证系统中各个进程最终都能正常完成。
银行家算法的本质是死锁的避免,由于它并没有破坏产生死锁的4个必要条件之一,不属于死锁预防。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6 死锁的检测和死锁

6.1 等待图检测死锁

在这里插入图片描述

6.2 多体资源类死锁检测算法

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

6.3 死锁解除方法

当死锁发生并被检测出来后,必须采取相应措施解除死锁。一种可能的方法是通知系统管理员进行人工干预,另一种方法是操作系统自动解除死锁并在适当时机恢复相应进程运行。
具体来说,主要有以下三种方式 :
(1)剥夺资源恢复
(2)进程退回
(3)撤销进程

6.4 鸵鸟算法

7 线程死锁

在支持多线程的操作系统中.除了会发生进程之间的死锁外,还会发生线程之间的死锁。由于不同的线程可以属于同一进程,也可属于不同的进程。因此,与进程死锁比较,线程死锁分为属于同一进程的线程死锁和属于不同进程的线程死锁。
(1)同一进程的线程死锁
线程的同步工具有互斥锁。由于同一进程的线程共享该进程资源,为了实现线程对进程内变量的同步访问,可以采用互斥锁。
(2)不同进程的线程死锁
如果在进程P1内存在一组线程{P11,P12,…,P1m},在进程P2内存在一组线程{P21,P22,…,P2n}。同一时间段内,进程P1内的线程获得资源R1,进程P2内的线程获得资源R2。之后,进程P1内的某个线程P1i请求资源R2,由于不能满足而进入阻塞状态;进程P2内的某个线程P2j请求资源R1,由于不能满足也进入阻塞状态。线程P1i和线程P2j相互等待对方释放资源,这时出现了不同进程线程间的死锁。

标签:操作系统,系统,死锁,第五章,线程,进程,资源,资源分配
来源: https://blog.csdn.net/weixin_42260102/article/details/100569315