操作系统(二)死锁

资源

  • 可抢占资源:可以从拥有它的进程中抢占而不会产生任何副作用。如存储器
  • 不可抢占资源:在不引起相关的计算失败的情况下,无法把它从战友它的进程处抢占过来。如CD刻录机

多个进程请求多个资源时,是否出现死锁可能取决于资源获取的顺序。第一个示例中若进程A先于进程B获取资源,则进程B就会被阻塞,故无死锁发生;第二个示例中若进程A获取资源1,进程B获取资源2,则进程A阻塞等待获取资源2,进程B阻塞等待获取资源1,出现死锁。

//无死锁的编码
typedef int semaphore;
	semaphore resource_1;
	semaphore resource_2;
	
	void process_A(void) {
		down(&resource_1);
		down(&resource_2);
		use_both_resources();
		up(&resource_2);
		up(&resource_1);
	}
	
	void process_B(void) {
		down(&resource_1);
		down(&resource_2);
		use_both_resources();
		up(&resource_2);
		up(&resource_1);
	}
	//可能出现死锁的编码
	semaphore resource_1;
	semaphore resource_2;
	
	void process_A(void) {
		down(&resource_1);
		down(&resource_2);
		use_both_resources();
		up(&resource_2);
		up(&resource_1);
	}
	
	void process_B(void) {
		down(&resource_2);
		down(&resource_1);
		use_both_resources();
		up(&resource_1);
		up(&resource_2);
	}

死锁概述

死锁的规范定义:如果一个进程集合中的每个进程都在等待只能由该进程集合中的其他进程才能引发的事件,那么,该进程集合就是死锁的。

1. 资源死锁的必要条件

  • 互斥条件。 每个资源要么已经分配给了一个进程,要么就是可用的。
  • 占有和等待条件。 已经得到了某个资源的进程可以再请求新的资源。
  • 不可抢占条件。 已经分配给一个进程的资源不能强制性地被抢占,它只能被占有它的进程显式地释放。
  • 环路等待条件。 死锁发生时,系统中一定有由两个或两个以上的进程组成的一条环路,该环路中的每个进程都等待着下一个进程所占有的资源。

死锁发生时,四个条件一定同时满足。若其中任何一个条件不成立,则不会发生死锁。

2. 处理死锁的策略

  • 鸵鸟算法:忽略该问题。也许你忽略它,它也会忽略你。
  • 死锁检测与死锁恢复:让死锁发生,检测它们是否发生,一旦发生死锁,采取行动解决问题。
  • 死锁避免:仔细对资源进行分配,动态地避免死锁。
  • 死锁防止:通过破坏引起死锁的四个必要条件之一,防止死锁的产生。

鸵鸟算法

把头埋进沙子里,假装没有事情发生。解决死锁问题一般会产生性能损失和可用性的代价,如果死锁发生的频率很低,或者死锁的发生对于用户没有多大影响,那么可以忽略死锁。大部分操作系统如Linux、Unix、Windows处理死锁的策略就是鸵鸟算法。

死锁检测和死锁恢复

允许死锁发生,当检测到死锁发生后,采取措施进行恢复。

每种类型一个资源的死锁检测:

可以画一张资源分配图,用DFS或者其他算法检测该图是否DAG,若是则无死锁,否则系统存在死锁。
《现代操作系统》

每种类型多个资源的死锁检测

《现代操作系统》
如图列出两个向量:

  • 现有资源向量E:Ei代表第i种资源已存在的资源总数。
  • 可用资源向量A:Ai代表第i种资源当前可供使用的资源数。

两个矩阵:

  • 当前分配矩阵C:第i行表示Pi当前所持有的每一种类型资源的资源数。
  • 请求矩阵R:Rij表示Pi所需要的资源j的数量。

死锁检测算法如下:

  1. 寻找一个没有标记的进程Pi,对于它而言R矩阵的第i行向量小于或等于A
  2. 如果找到了这样一个进程,那么将C矩阵的第i行向量加到A中,标记该进程,并转到第一步
  3. 如果没有这样的进程,算法终止

第一步表示是否有进程可以在当前可用资源的情况下请求到需要的所有资源并运行完毕,第二步表示找到这样的进程,该进程可以运行完毕并且释放其占有的资源,第三步过后若仍然有剩余进程说明系统产生死锁,否则说明无死锁,所有进程都能正常运行完毕

死锁恢复

  1. 利用抢占恢复:临时将某个资源从它的当前所有者那里转移到另一个进程。这种方法恢复通常来说比较困难或者不太可能,若选择挂起某个进程,很大程度上取决于哪个进程拥有比较容易收回的资源。
  2. 利用回滚恢复:周期性地对进程进行检查点检查,即将进程的状态包括存储映像、资源状态写入一个文件以备以后重启。检测到死锁后,就可以找到哪些进程需要资源,并将拥有这些资源的进程回退到其未获得该资源的时间点,并一直阻塞到该资源可用。
  3. 通过杀死进程恢复:第一种方法是杀死环中的一个或若干个进程,第二种方法是杀死环外持有环内所需资源的进程。最好杀死可以从头开始重新运行而不会产生副作用的进程。

死锁避免

死锁检测时假设一个进程请求资源时,它一次性就请求所有的资源,而死锁避免通过动态地判断当前状态下分配资源是否安全,并且只在保证安全的条件下分配资源,来达到避免死锁发生的目的。

安全状态与不安全状态

  • 安全状态:如果没有死锁发生,即使所有进程突然请求对资源的最大需求,也仍然存在某种调度次序能够使得每一个进程运行完毕,则该状态是安全的。

如下图,当B请求2个资源执行完毕后,释放其持有的2个资源,空闲资源变为5个,C再请求剩余5个资源运行完毕,空闲资源变为7个,足够满足A运行完毕
《现代操作系统》

  • 不安全状态:任何分配资源的序列都无法保证工作的完成。

如下图,A请求1个资源后系统到达不安全状态,接下来即使B请求2个资源释放其占有资源后,空闲只有4个资源,不足以使任何一个进程执行完毕
《现代操作系统》
不安全状态不等于死锁,在A请求其他资源前,A可以先释放1个资源,就可以让C先完成,从而避免了死锁。

单个资源的银行家算法

将操作系统比作银行家,对每一请求进行检查,若满足这一请求会达到安全状态,则满足该请求,否则推迟对这一请求的满足。为了看状态是否安全,银行家看他是否有足够的资源满足某一个客户,若可以,则说明该投资可以收回,并接着检查最接近最大限额的另一客户。若所有投资都被收回,则该状态是安全的,最初的请求可以批准。
《现代操作系统》
图c中B的请求不会得到批准,因为这会使系统到达不安全状态

多个资源的银行家算法

与死锁检测非常类似,作出每个进程已分配资源矩阵和为了运行完成仍然需要的资源矩阵,与三个向量:所有资源向量E、已分配资源向量P、可用资源向量A,检查一个状态是否安全的算法如下:

  1. 查找右边矩阵中是否有一行,其没有被满足的资源数均小于或等于A。若不存在这样的行,则系统将会死锁,因为任何进程都无法运行结束。
  2. 假若找到这样一行,则可以假设它获得所需的资源并运行结束,将该进程标记为终止,并将其加到向量A上。
  3. 重复以上两步,或者直到所有进程都标记为终止,其初始状态是安全的;或者所有进程的资源需求都得不到满足,此时就是发生了死锁。

在这里插入图片描述
若在第一步中同时又若干进程均符合条件,则不管挑选哪一个运行都没关系,因为可用资源或者增多,或者至少保持不变。
该算法虽然很有意义但缺乏实用价值,因为很少有进程能够在运行前就知道其所需资源的最大值,且进程数不是固定的,往往在不断变化,原本可用的资源也可能突然变成不可用。

死锁预防

可以通过破坏产生死锁的四个必要条件中一个或多个条件,来预防死锁的发生。

破坏互斥条件

如果资源不被一个进程独占,那么死锁肯定不会产生。
通过采用假脱机打印机技术可以允许若干个进程同时产生输出。该模型中唯一真正请求使用物理打印机的进程是打印机守护进程,由于守护进程绝不会请求别的资源,所以不会因打印机而产生死锁。
避免分配那些不是绝对必须的资源,尽量做到尽可能少的进程可以真正请求资源。

破坏占有和等待条件

只要禁止已持有资源的进程再等待其他资源便可以消除死锁。
一种实现方法是在一开始就请求需要的全部资源,若资源足够则将其全部分配给该进程让其运行完毕,否则进程等待。这个方法的问题是很多进程运行时才知道它需要多少资源,且资源利用率不是最优的。
另一种方法是一个进程请求资源时,先暂时释放其占有的资源,再一次性请求所需的全部资源。

破坏不可抢占条件

一些资源可以用虚拟化的方式避免因抢占资源造成的混乱。但如数据库中的记录或者操作系统中的表必须被锁定,因此这类资源还是有出现死锁的可能。

破坏环路等待条件

可以对所有资源统一编号,进程必须按照资源编号的顺序提出,在任何时候,总有一个已分配的资源是编号最高的,占用该资源的进程不可能请求其他已分配的各种资源,它或者会执行完毕,或者最坏的情形是去请求编号更高的资源,而编号更高的资源肯定是可用的,故它会结束并释放所有资源。
实际上没必要必须按升序请求资源,而只需要求不允许进程请求比当前所占有资源编号低的资源。如一个进程请求9号和10号资源并释放所有资源,则没必要阻止其接下来请求1号资源。
《现代操作系统》
死锁预防的各种方法如下:
《现代操作系统》

参考资料

  • 《现代操作系统》
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值