Skip to content

Commit 6ec2c8a

Browse files
authored
lec12-p5
1 parent e178c80 commit 6ec2c8a

File tree

1 file changed

+107
-64
lines changed

1 file changed

+107
-64
lines changed

lec12/p5-deadlock.md

Lines changed: 107 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -27,16 +27,41 @@ backgroundColor: white
2727

2828
**提纲**
2929

30+
<style>
31+
.container{
32+
display: flex;
33+
}
34+
.col {
35+
flex: 1;
36+
}
37+
</style>
38+
39+
<div class="container">
40+
41+
<div class="col">
42+
3043
### 1. 死锁问题
3144
2. 死锁处理办法
3245

46+
</div>
47+
48+
<div class="col">
49+
50+
#### 1.1 什么是死锁?
51+
1.2 资源分配图
52+
53+
</div>
54+
55+
</div>
56+
57+
3358
---
3459

3560
##### 死锁问题
3661
![w:700](figs/deadlock-bridge.png)
3762
- 桥梁只能单向通行
3863
- 桥的每个部分可视为一个资源
39-
- 可能出现死锁
64+
- 可能**出现死锁**
4065
- 对向行驶车辆在桥上相遇
4166
- 解决方法:一个方向的车辆倒退(资源抢占和回退)
4267

@@ -47,15 +72,15 @@ backgroundColor: white
4772
![w:700](figs/deadlock-bridge.png)
4873
- 桥梁只能单向通行
4974
- 桥的每个部分可视为一个资源
50-
- 可能发生饥饿
75+
- 可能**发生饥饿**
5176
- 由于一个方向的持续车流,另一个方向的车辆无法通过桥梁
5277

5378

5479

5580
---
5681

5782
##### 死锁问题
58-
由于竞争资源或者通信关系,两个或更多线程在执行中出现,永远相互等待只能由其他进程引发的事件
83+
由于竞争资源或者通信关系,两个或更多线程在执行中出现,**永远相互等待**只能由其他进程引发的事件
5984
```
6085
Thread 1: Thread 2:
6186
lock(L1); lock(L2);
@@ -65,7 +90,39 @@ lock(L2); lock(L1);
6590

6691
---
6792

68-
##### 死锁问题 -- 资源
93+
**提纲**
94+
95+
<style>
96+
.container{
97+
display: flex;
98+
}
99+
.col {
100+
flex: 1;
101+
}
102+
</style>
103+
104+
<div class="container">
105+
106+
<div class="col">
107+
108+
1. **死锁问题**
109+
2. 死锁处理办法
110+
111+
</div>
112+
113+
<div class="col">
114+
115+
1.1 什么是死锁?
116+
#### 1.2 资源分配图
117+
118+
</div>
119+
120+
</div>
121+
122+
123+
---
124+
125+
##### 资源请求与使用关系
69126
- 资源类型$R_1, R_2, . . .,R_m$
70127
- CPU执行时间、内存空间、I/O设备等
71128
- 每类资源$R_i$有$W_i$个实例
@@ -78,8 +135,8 @@ lock(L2); lock(L1);
78135

79136
---
80137

81-
##### 死锁问题 -- 资源
82-
**资源分类**
138+
##### 资源分类
139+
83140
- 可重用资源(Reusable Resource)
84141
- 任何时刻只能有一个线/进程使用资源
85142
- 资源被释放后,其他线/进程可重用
@@ -93,8 +150,8 @@ lock(L2); lock(L1);
93150

94151
---
95152

96-
##### 死锁问题 -- 资源
97-
**资源分类**
153+
##### 资源分类
154+
98155
- 可消耗资源(Consumable resource)
99156
- 资源可被销毁
100157
- 可消耗资源示例
@@ -105,7 +162,7 @@ lock(L2); lock(L1);
105162

106163
---
107164

108-
##### 死锁问题 -- 资源分配图
165+
##### 资源分配图
109166
描述资源和进程间的分配和占用关系的有向图
110167
- 顶点:系统中的进程
111168
- $P = \{ P_1, P_2, …, P_n \}$
@@ -120,14 +177,15 @@ lock(L2); lock(L1);
120177

121178
---
122179

123-
##### 死锁问题 -- 资源分配图
180+
##### 资源分配图示例
181+
124182
![w:1000](figs/deadlock-resource-problem.png)
125183
是否有死锁?
126184

127185

128186
---
129187

130-
##### 死锁问题 -- 必要条件
188+
##### 形成死锁的必要条件
131189
- 互斥
132190
- 任何时刻只能有一个进/线程使用一个资源实例
133191
- 持有并等待
@@ -266,7 +324,7 @@ lock(L2); lock(L1);
266324

267325
---
268326

269-
##### 死锁避免
327+
##### 系统安全状态
270328
资源分配中,系统处于安全状态
271329
- 针对所有已占用进程,存在安全执行序列$<P_1,P_2,...,P_N>$
272330
- $P_i$要求的资源 $\le$ 当前可用资源 $+$ 所有$P_j$ 持有资源,其中$j<i$
@@ -277,8 +335,7 @@ lock(L2); lock(L1);
277335

278336
---
279337

280-
##### 死锁避免
281-
安全状态与死锁的关系
338+
##### 安全状态与死锁的关系
282339
- 系统处于安全状态,一定没有死锁
283340
- 系统处于不安全状态,可能出现死锁
284341
- 避免死锁就是确保系统不会进入不安全状态
@@ -289,8 +346,8 @@ lock(L2); lock(L1);
289346

290347
---
291348

292-
##### 死锁避免
293-
银行家算法(Banker's Algorithm)-- 概述
349+
##### 银行家算法(Banker's Algorithm)
350+
294351
- 银行家算法是一个避免死锁产生的算法。以银行借贷分配策略为基础,判断并保证系统处于安全状态
295352
- 客户在第一次申请贷款时,声明所需最大资金量,在满足所有贷款要求并完成项目时,及时归还
296353
- 在客户贷款数量不超过银行拥有的最大值时,银行家尽量满足客户需要
@@ -300,75 +357,70 @@ lock(L2); lock(L1);
300357

301358
---
302359

303-
##### 死锁避免
304-
银行家算法(Banker's Algorithm)-- 算法思路
360+
##### 银行家算法的算法思路
305361

306-
- 1、对于一个线程T的请求,判断请求的资源是否超过最大可用资源
362+
1. 对于一个线程T的请求,判断请求的资源是否超过最大可用资源
307363
- 如果超过,不分配,T阻塞等待
308364
- 如果不超过,继续2
309-
- 2、如果分配给该请求资源,判断是否安全
365+
2. 如果分配给该请求资源,判断是否安全
310366
- 安全则分配给T资源;否则不分配,T阻塞等待
311-
- 3、如何判断是否安全?
367+
3. 如何判断是否安全?
312368
- 判断是否每个线程都可以安全完成
313369
- 如果每个都可以完成则安全;否则不安全
314370

315371

316372
---
317373

318-
##### 死锁避免
319-
银行家算法(Banker's Algorithm)-- 数据结构
374+
##### 银行家算法的数据结构
320375
![w:800](figs/deadlock-banker-data.png)
321376

322377

323378
---
324379

325-
##### 死锁避免
326-
银行家算法(Banker's Algorithm)-- 判断安全状态的例程
380+
##### 安全状态的判断
327381
![w:1000](figs/deadlock-banker-code.png)
328382

329383

330384
---
331385

332-
##### 死锁避免
333-
银行家算法(Banker's Algorithm)-- 完整算法
386+
##### 银行家算法的完整描述
334387
![w:700](figs/deadlock-banker-algorithm.png)
335388

336389

337390
---
338391

339-
##### 死锁避免
340-
银行家算法(Banker's Algorithm)-- 示例1
392+
##### 银行家算法示例1
341393
![w:1000](figs/deadlock-banker-ex1.png)
342394

343395
---
344396

345-
##### 死锁避免
346-
银行家算法(Banker's Algorithm)-- 示例1
397+
##### 银行家算法示例1
398+
347399
![w:1000](figs/deadlock-banker-ex2.png)
348400

349401
---
350402

351-
##### 死锁避免
352-
银行家算法(Banker's Algorithm)-- 示例1
403+
##### 银行家算法示例1
404+
353405
![w:1000](figs/deadlock-banker-ex3.png)
354406

355407

356408
---
357409

358-
##### 死锁避免
359-
银行家算法(Banker's Algorithm)-- 示例1
410+
##### 银行家算法示例1
411+
360412
![w:1000](figs/deadlock-banker-ex4.png)
361413

362414
---
363415

364-
##### 死锁避免
365-
银行家算法(Banker's Algorithm)-- 示例2
416+
##### 银行家算法示例2
417+
366418
![w:1000](figs/deadlock-banker-ex5.png)
367419

368420
---
369421

370-
##### 死锁避免
371-
银行家算法(Banker's Algorithm)-- 示例2
422+
##### 银行家算法示例2
423+
372424
![w:1000](figs/deadlock-banker-ex6.png)
373425

374426

@@ -418,76 +470,71 @@ lock(L2); lock(L1);
418470

419471
---
420472

421-
##### 死锁检测
422-
死锁检测算法:数据结构
473+
##### 死锁检测算法数据结构
423474
- Available:长度为m的向量:每种类型可用资源的数量
424475
- Allocation:一个n×m矩阵:当前分配给各个进程每种类型资源的数量
425476
- 进程$P_i$ 拥有资源$R_j$的$Allocation[i, j]$个实例
426477

427478

428479
---
429480

430-
##### 死锁检测
431-
死锁检测算法:完整算法
481+
##### 死锁检测算法的完整描述
432482
![w:1000](figs/deadlock-check-algorithm.png)
433483

434484

435485
---
436486

437-
##### 死锁检测
438-
死锁检测算法:-- 示例1
487+
##### 死锁检测示例1
439488
![w:800](figs/deadlock-check-ex1.png)
440489

441490

442491
---
443492

444-
##### 死锁检测
445-
死锁检测算法:-- 示例1
493+
##### 死锁检测示例1
494+
446495
![w:800](figs/deadlock-check-ex2.png)
447496

448497

449498
---
450499

451-
##### 死锁检测
452-
死锁检测算法:-- 示例1
453-
![w:800](figs/deadlock-check-ex3.png)
500+
##### 死锁检测示例1
454501

502+
![w:800](figs/deadlock-check-ex3.png)
455503

456504
---
457505

458-
##### 死锁检测
459-
死锁检测算法:-- 示例1
506+
##### 死锁检测示例1
507+
460508
![w:800](figs/deadlock-check-ex4.png)
461509

462510

463511
---
464512

465-
##### 死锁检测
466-
死锁检测算法:-- 示例1
513+
##### 死锁检测示例1
514+
467515
![w:800](figs/deadlock-check-ex5.png)
468516

469517

470518
---
471519

472-
##### 死锁检测
473-
死锁检测算法:-- 示例1
520+
##### 死锁检测示例1
521+
474522
![w:800](figs/deadlock-check-ex6.png)
475523
序列$<T_0, T_2, T_1, T_3, T_4>$ 对于所有的i,都可满足Finish[i] = true
476524

477525

478526
---
479527

480-
##### 死锁检测
481-
死锁检测算法:-- 示例2
528+
##### 死锁检测示例2
529+
482530
![w:700](figs/deadlock-check-ex7.png)
483531
可通过回收线程$T_0$占用的资源,但资源不足以完成其他线程请求
484532
线程$T_1, T_2, T_3, T_4$形成死锁
485533

486534

487535
---
488536

489-
##### 死锁检测
490-
使用死锁检测算法
537+
##### 使用死锁检测算法
491538

492539
- 死锁检测的时间和周期选择依据
493540
- 死锁多久可能会发生
@@ -553,7 +600,3 @@ lock(L2); lock(L1);
553600
- 返回到一些安全状态, 重启进程到安全状态
554601
- 可能出现饥饿
555602
- 同一进程可能一直被选作被抢占者
556-
557-
558-
559-

0 commit comments

Comments
 (0)