From 9c5ed4e52890708e26fd0774c883956bc5e46cbd Mon Sep 17 00:00:00 2001 From: Shine wOng <1551885@tongji.edu.cn> Date: Tue, 1 Oct 2019 14:56:02 +0800 Subject: [PATCH] add conclusion on deadlock . --- thu_os/chp20.md | 100 +++++++++++++++++++++++ thu_os/images/deadlock_circular_wait.png | Bin 0 -> 36713 bytes thu_os/lab7_report.md | 4 +- 3 files changed, 102 insertions(+), 2 deletions(-) create mode 100644 thu_os/chp20.md create mode 100644 thu_os/images/deadlock_circular_wait.png diff --git a/thu_os/chp20.md b/thu_os/chp20.md new file mode 100644 index 0000000..491768c --- /dev/null +++ b/thu_os/chp20.md @@ -0,0 +1,100 @@ +进程管理(5):死锁 +================= + +## 死锁的基本概念 + +> 为什么会发生死锁? + +其实在前面进程管理的总结中,已经多次出现了死锁的概念,比如在信号量机制中,如果信号量使用不慎,就会出现死锁。实际上,在现实生活中,死锁现象也经常会出现,比如两个胖子过独木桥,比如[哲学家就餐问题](philosopher.md)。比如我去清华面试,面试老师和蔼地让我陈述一下自己的科研经历,我说<我很厉害的,真的!你们先答应录我我就跟你们讲我的科研经历>,老师说<那不行,你得先讲讲你的科研经历,我们再录你>,然后我们双方就僵持不下,谁也不让谁,也就是发生了死锁。当然了,最后这个死锁会因为我被扔出面试教室而被打破。 + +可以看到,死锁之所以会发生,是因为所有进程都占有了一些资源,却仍然在请求另一个进程的资源,它们相互之间形成了一种`循环等待`的死局,因此可以总结出死锁发生的两个条件,即`持有并等待条件`与`循环等待条件`。需要指出的是,这两个条件都是必要条件,缺一不可的,如下图所示: + +![deadlock_circular_wait](images/deadlock_circular_wait.png) + +可以看到,左边的情形是会出现死锁的,而右边则不会。究其原因,是因为右边的情形中,有两个进程`P2`和`P4`并不满足`持有并等待`条件,因此尽管满足`循环等待条件`,仍然是不会出现死锁的。 + +但是也是并非满足上面两个条件就一定会出现死锁,比如两个胖子过独木桥,如果一个胖子把另一个挤下去,就不会出现这种情况了。可见,出现死锁对资源的类型也有一定的要求,资源需要是不可抢占的,即`非抢占条件`。最后,如果独木桥很宽,可以容纳这两个胖子一起通过,则也不会出现死锁,即资源还应该满足`互斥性条件`。 + +综上,可以总结出死锁出现的四个必要条件,即 + ++ `互斥条件` ++ `非抢占条件` ++ `持有并等待条件` ++ `循环等待条件` + +死锁现象显然是我们不想要看到的,那么应该如何解决死锁呢?这就是下面重点讨论的问题。 + +## 死锁的解决 + +可以从多个方面来解决死锁问题。比如说,我可以防患于未然,一开始就从原理上完全杜绝死锁的出现,即`死锁预防`;或者可以退一步,在临了要分配资源的时候,对整个系统的状态进行检查,看如果分配了这个资源是否会出现死锁,如果的确会,就拒绝分配资源,这就是`死锁避免`;与预防措施相对,我也可以提前做好预案,即允许死锁的发生,在死锁发生后再去对系统进行调控,从而恢复正常的状态,即`死锁检测与恢复`。下面就分配讨论各种措施。 + +### 死锁预防 + +死锁预防是从死锁发生的源头,即从基本原理上,妥善地设计操作系统,使得死锁根本就不可能发生。它的基本思路,其实就是破坏死锁发生的四个必要条件,因此可以从四个方面来进行`死锁预防`。 + +> 破坏互斥条件 + +可以通过一些软件的抽象,使得互斥资源可以被多个进程同时访问。比如打印机原来一次只能有一个进程访问的,但是通过`spooling`技术,就可以由多个用户多个进程共同访问了。 + +> 破坏持有并等待条件 + +其实就是让进程不可能持有一些资源的同时,又还在等待其他资源。一种做法是在为进程分配资源的时候,要么就为它分配全部的资源,要么就一个也不分配。很明显,使用这种策略时资源利用率低下,因为空闲资源无法被分配。 + +此外还有一种策略,老师是把它归到了`破坏非抢占条件`里面的,我觉得本质还是破坏`持有并等待条件`。即在进程请求资源时,要么为它分配相应的资源,如果进程不能得到请求的资源,将释放已占有的资源,这样`持有`和`等待`的状态就不能并存了。老师可能是觉得强制释放进程的资源,是`抢占`策略的一种体现,所以是破坏了`非抢占条件`。 + +> 破坏循环等待条件 + +例如当前有`n`类资源,分别将它们编号为`1, 2, ..., n`号资源,`循环等待条件`是指,`1`号进程占有`1`号资源,然后请求`2`号资源;`2`号进程占有`2`号资源,请求`3`号资源,......,`n`号进程占有`n`号资源,请求`1`号资源。因此各个进程就僵持不下。 + +为了破坏`循环等待条件`,可以让进程按资源编号的顺序请求资源。这样,`n`号进程请求`1`号和`n`号资源时,是首先请求`1`号资源,此时就会因为不能获得资源而进入阻塞状态,也就因此不能请求并持有`n`号资源了。`循环等待条件`因此被打破。 + +需要注意的是,这种策略会引起大量空闲资源无法被请求,因此资源的利用率低。 + +### 死锁避免 + +死锁避免并不是从操作系统的设计上着手,而是在客观上承认死锁发生的可能性,但是在分配资源的时候,对整个系统进行检查,判断是否有可能会发生死锁,然后避免可能会发生死锁的情况。 + +把不会出现死锁的状态称为`安全状态`,因此死锁避免要解决的主要问题,就是如何识别`安全状态`。一般地,当系统处于`安全状态`时,所有占有资源的进程总是存在`安全序列`,即``,系统可以按照该序列的次序执行进程,而不会出现死锁的情况。 + +为了找到这样的一个安全序列,需要各个进程告知操作系统其最大的资源需求量。在一个进程请求资源时,假想地将资源分配给该进程,随后对所有占有资源的进程做一次遍历,找到第一个这样的进程,它的资源需求量小于操作系统的资源剩余量,这样该进程一定可以成功执行完毕,然后将它当前占有的资源全部归还给操作系统,此时操作系统的资源剩余量就可以加上该进程的资源占有量。重复上面的过程,直到所有进程都遍历完毕,则的确存在这样一个`安全序列`,或者某一次遍历中找不到一个这样的进程,表示系统当前处于`不安全状态`。 + +上述算法类似于银行家在向多个客户放贷的时候,采取的借贷分配策略,因此称之为`银行家算法(banker's algorithm`。下面给出`银行家算法`的算法描述: + +设系统中存在`n`个进程,`m`类资源,设置一个`m`维列向量`available`,表示操作系统中各类资源的剩余数量;为了表示各个进程对每个资源的占用情况,设置一个`n x m`的矩阵`allocation`,其中第`i`行表示第`i`个进程对`m`个资源的占用情况;此外还设置两个`n x m`的矩阵`need`和`max`,分别表示每个进程对各个资源的需求量和最大需求量,容易看出, + +```c +need[i, j] = max[i, j] - allocation[i, j] +``` + +当一个进程请求资源时,设置`m`维列向量`request`,表示对各个资源的请求量,算法流程如下: + ++ 如果`request > available`,表示资源请求量已经超过了操作系统的剩余资源总量,直接返回`不安全状态`。 ++ 如果`request > need[i]`,即资源请求量超过了该进程的最大需求量,拒绝资源申请,返回`不安全状态`。 ++ 更新`availble -= request`,`allocation[i] += request, need[i] -= request`,即假想将资源分配给该进程。 ++ 遍历所有的进程,直到发现第一个进程,满足`need[i] < available`,将该进程标记为`finish`状态,表示加入`安全序列`中,更新`available += allocation[i]`。重复该过程,直到全部进程都加入了`安全序列`中,返回`安全状态`;否则,如果没有找到满足条件的进程,则返回`不安全状态`。 + +从`银行家算法`可以看出,`不安全状态`并非就一定会发生死锁,实际上,死锁只是不安全状态的一个真子集。这是因为`银行家算法`在判断`不安全状态`的时候,总是从最坏的打算出发,即每个进程只有在得到它所要求的全部资源时,才会执行完毕并归还资源给操作系统。实际上,进程未必会申请它告知系统的最大需求量,而在进程执行的过程中,也会因为某些资源使用完毕就归还给操作系统了。 + +### 死锁检测与恢复 + +`死锁检测与恢复`策略客观上允许死锁的发生,它相当于是做好预案,在死锁发生后及时去检查到这种情况,并且将之恢复到正常状态。因此,它主要需要解决两个问题,即如何检测到死锁,又如何将之恢复。 + +死锁的检测在本质上和`银行家算法`是一样的思路,即取决于是否可以找到一个`安全序列`,与银行家算法不同的是,这里不需要假想将资源分配给某个进程,而是资源已经分配出去了,现在只是检查整个系统的状态是否出现了死锁,因此是没有银行家算法的前三步的。 + +如果的确检测到了死锁的发生,就需要采取措施恢复死锁,即`死锁恢复`。为了恢复死锁,可以有许多不同的策略。 + +> 进程终止策略 + +即直接将发生死锁的进程终止。最简单暴力的是把所有死锁进程给终止了,得劲是挺得劲的,这个开销未免太大。 + +柔和一点的就是一次终止一个进程,直到死锁被解除。所以这里就涉及到应该选择进程被终止的问题,一般说来,总是选择优先级较低的,已经运行时间较短的,以及后台的批处理进程(交互进程留下),此外,还要考虑进程占有的资源数量,进程完成需要的资源,以及终止的进程数量越少越好。进程终止策略其实就是类似于我被清华的面试老师直接赶出了面试教室。 + +> 资源抢占策略 + +资源抢占策略是不终止任意一个进程,而是将进程的资源进行抢占,将这些资源分配给其他死锁的进程,来解决死锁。但是这种策略可能会导致饥饿,即每次都抢占同一个进程,让该进程一直得不到资源。 + +> 进程回退策略 + +`进程回退策略`的核心思想和`资源抢占策略`是一致的,即将某些进程的资源分配给其他进程。但是进程回退策略并非是`剥夺`某一个进程的资源,而是该进程主动让出自己的资源,通过让进程回退到`安全状态`来从死锁中恢复。这就好比两个过桥的胖子中的一个主动后退,让出了自己的资源。而`资源抢占策略`是一个胖子把另一个撞了下去。 + + diff --git a/thu_os/images/deadlock_circular_wait.png b/thu_os/images/deadlock_circular_wait.png new file mode 100644 index 0000000000000000000000000000000000000000..9e0aec6b62ad42fbfe5eda0ae012707f52cee944 GIT binary patch literal 36713 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 Q_TOCu+604oj&O_qAN!HGa{vGU literal 0 HcmV?d00001 diff --git a/thu_os/lab7_report.md b/thu_os/lab7_report.md index e946797..b28ccb0 100644 --- a/thu_os/lab7_report.md +++ b/thu_os/lab7_report.md @@ -74,7 +74,7 @@ void Semaphore::up(){ 为了在ucore中实现信号量机制,首先应该保证信号量的`PV`操作都是原子操作,按理说是应该用硬件原语实现的锁机制来保证这一点的,但是ucore只是在模拟器上运行嘛,可能这些硬件外设的条件有限,这里就简单地禁用中断来实现`PV`操作的原子性。 -为了实现`P`操作,按照在[进程管理(4):信号量与管程](chp18.md)中的描述,应该首先执行`--sem`表示占用了一个资源,随后检查`sem >= 0`来判断进程请求的资源是否空闲,如果空闲就可以获得资源直接退出了;否则该进程将进入等待队列等待这个资源。在ucore中,`P`操作的实现到目前为止都与我们分析的逻辑一致。但是当该进程从等待中被唤醒时,该进程实质上已经获得了请求的资源,但是此时在退出之前还需要将进程中等待队列中删除。ucore中`P`操作的实现如下: +为了实现`P`操作,按照在[进程管理(4):信号量与管程](chp18.md)中的描述,应该首先执行`--sem`表示占用了一个资源,随后检查`sem >= 0`来判断进程请求的资源是否空闲,如果空闲就可以获得资源直接退出了;否则该进程将进入等待队列等待这个资源。在ucore中,`P`操作的实现到目前为止都与我们分析的逻辑一致。但是当该进程从等待中被唤醒时,该进程实质上已经获得了请求的资源,此时在退出之前还需要将进程中等待队列中删除。ucore中`P`操作的实现如下: ```c static __noinline uint32_t __down(semaphore_t *sem, uint32_t wait_state) { @@ -205,7 +205,7 @@ int philosopher_using_semaphore(void * arg) /* i:哲学家号码,从0到N-1 ![Hoare_monitor](images/hoare.png) -因此,对于`Hoare`管程的`wait`操作,基本的操作与原理中叙述的是一致的,即将当前进程加入到等待队列中,并且执行`num_waiting++`。但是,随后应该首先选择`signal queue`中的进程并将其唤醒,如果没有这样的进程才释放管程锁,允许其他进程进入管程。在ucore中,是使用一个`next`信号量来表示`signal queue`的,该条件变量初始化为零,一个进程通过执行`next.P()`来进入`next`条件变量的等待队列中,一个进程退出管程时,通过`next.V()`操作来唤醒`signal queue`中的一个进程。再引入一个`next_count`变量来表示等待`next`条件变量的进程数量。管程的类定义如下: +因此,对于`Hoare`管程的`wait`操作,基本的操作与原理中叙述的是一致的,即将当前进程加入到等待队列中,并且执行`num_waiting++`。但是,随后应该首先选择`signal queue`中的进程并将其唤醒,如果没有这样的进程才释放管程锁,允许其他进程进入管程。在ucore中,是使用一个`next`信号量来表示`signal queue`的,该信号量初始化为零,一个进程通过执行`next.P()`来进入`next`信号量的等待队列中,一个进程退出管程时,通过`next.V()`操作来唤醒`signal queue`中的一个进程。再引入一个`next_count`变量来表示等待`next`信号量的进程数量。管程的类定义如下: ```c typedef struct monitor{