@@ -27,16 +27,41 @@ backgroundColor: white
27
27
28
28
** 提纲**
29
29
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
+
30
43
### 1. 死锁问题
31
44
2 . 死锁处理办法
32
45
46
+ </div >
47
+
48
+ <div class =" col " >
49
+
50
+ #### 1.1 什么是死锁?
51
+ 1.2 资源分配图
52
+
53
+ </div >
54
+
55
+ </div >
56
+
57
+
33
58
---
34
59
35
60
##### 死锁问题
36
61
![ w:700] ( figs/deadlock-bridge.png )
37
62
- 桥梁只能单向通行
38
63
- 桥的每个部分可视为一个资源
39
- - 可能出现死锁
64
+ - 可能 ** 出现死锁 **
40
65
- 对向行驶车辆在桥上相遇
41
66
- 解决方法:一个方向的车辆倒退(资源抢占和回退)
42
67
@@ -47,15 +72,15 @@ backgroundColor: white
47
72
![ w:700] ( figs/deadlock-bridge.png )
48
73
- 桥梁只能单向通行
49
74
- 桥的每个部分可视为一个资源
50
- - 可能发生饥饿
75
+ - 可能 ** 发生饥饿 **
51
76
- 由于一个方向的持续车流,另一个方向的车辆无法通过桥梁
52
77
53
78
54
79
55
80
---
56
81
57
82
##### 死锁问题
58
- 由于竞争资源或者通信关系,两个或更多线程在执行中出现,永远相互等待只能由其他进程引发的事件
83
+ 由于竞争资源或者通信关系,两个或更多线程在执行中出现,** 永远相互等待 ** 只能由其他进程引发的事件
59
84
```
60
85
Thread 1: Thread 2:
61
86
lock(L1); lock(L2);
@@ -65,7 +90,39 @@ lock(L2); lock(L1);
65
90
66
91
---
67
92
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
+ ##### 资源请求与使用关系
69
126
- 资源类型$R_1, R_2, . . .,R_m$
70
127
- CPU执行时间、内存空间、I/O设备等
71
128
- 每类资源$R_i$有$W_i$个实例
@@ -78,8 +135,8 @@ lock(L2); lock(L1);
78
135
79
136
---
80
137
81
- ##### 死锁问题 -- 资源
82
- ** 资源分类 **
138
+ ##### 资源分类
139
+
83
140
- 可重用资源(Reusable Resource)
84
141
- 任何时刻只能有一个线/进程使用资源
85
142
- 资源被释放后,其他线/进程可重用
@@ -93,8 +150,8 @@ lock(L2); lock(L1);
93
150
94
151
---
95
152
96
- ##### 死锁问题 -- 资源
97
- ** 资源分类 **
153
+ ##### 资源分类
154
+
98
155
- 可消耗资源(Consumable resource)
99
156
- 资源可被销毁
100
157
- 可消耗资源示例
@@ -105,7 +162,7 @@ lock(L2); lock(L1);
105
162
106
163
---
107
164
108
- ##### 死锁问题 -- 资源分配图
165
+ ##### 资源分配图
109
166
描述资源和进程间的分配和占用关系的有向图
110
167
- 顶点:系统中的进程
111
168
- $P = \{ P_1, P_2, …, P_n \} $
@@ -120,14 +177,15 @@ lock(L2); lock(L1);
120
177
121
178
---
122
179
123
- ##### 死锁问题 -- 资源分配图
180
+ ##### 资源分配图示例
181
+
124
182
![ w:1000] ( figs/deadlock-resource-problem.png )
125
183
是否有死锁?
126
184
127
185
128
186
---
129
187
130
- ##### 死锁问题 -- 必要条件
188
+ ##### 形成死锁的必要条件
131
189
- 互斥
132
190
- 任何时刻只能有一个进/线程使用一个资源实例
133
191
- 持有并等待
@@ -266,7 +324,7 @@ lock(L2); lock(L1);
266
324
267
325
---
268
326
269
- ##### 死锁避免
327
+ ##### 系统安全状态
270
328
资源分配中,系统处于安全状态
271
329
- 针对所有已占用进程,存在安全执行序列$<P_1,P_2,...,P_N>$
272
330
- $P_i$要求的资源 $\le$ 当前可用资源 $+$ 所有$P_j$ 持有资源,其中$j<i$
@@ -277,8 +335,7 @@ lock(L2); lock(L1);
277
335
278
336
---
279
337
280
- ##### 死锁避免
281
- 安全状态与死锁的关系
338
+ ##### 安全状态与死锁的关系
282
339
- 系统处于安全状态,一定没有死锁
283
340
- 系统处于不安全状态,可能出现死锁
284
341
- 避免死锁就是确保系统不会进入不安全状态
@@ -289,8 +346,8 @@ lock(L2); lock(L1);
289
346
290
347
---
291
348
292
- ##### 死锁避免
293
- 银行家算法(Banker's Algorithm)-- 概述
349
+ ##### 银行家算法(Banker's Algorithm)
350
+
294
351
- 银行家算法是一个避免死锁产生的算法。以银行借贷分配策略为基础,判断并保证系统处于安全状态
295
352
- 客户在第一次申请贷款时,声明所需最大资金量,在满足所有贷款要求并完成项目时,及时归还
296
353
- 在客户贷款数量不超过银行拥有的最大值时,银行家尽量满足客户需要
@@ -300,75 +357,70 @@ lock(L2); lock(L1);
300
357
301
358
---
302
359
303
- ##### 死锁避免
304
- 银行家算法(Banker's Algorithm)-- 算法思路
360
+ ##### 银行家算法的算法思路
305
361
306
- - 1、 对于一个线程T的请求,判断请求的资源是否超过最大可用资源
362
+ 1 . 对于一个线程T的请求,判断请求的资源是否超过最大可用资源
307
363
- 如果超过,不分配,T阻塞等待
308
364
- 如果不超过,继续2
309
- - 2、 如果分配给该请求资源,判断是否安全
365
+ 2 . 如果分配给该请求资源,判断是否安全
310
366
- 安全则分配给T资源;否则不分配,T阻塞等待
311
- - 3、 如何判断是否安全?
367
+ 3 . 如何判断是否安全?
312
368
- 判断是否每个线程都可以安全完成
313
369
- 如果每个都可以完成则安全;否则不安全
314
370
315
371
316
372
---
317
373
318
- ##### 死锁避免
319
- 银行家算法(Banker's Algorithm)-- 数据结构
374
+ ##### 银行家算法的数据结构
320
375
![ w:800] ( figs/deadlock-banker-data.png )
321
376
322
377
323
378
---
324
379
325
- ##### 死锁避免
326
- 银行家算法(Banker's Algorithm)-- 判断安全状态的例程
380
+ ##### 安全状态的判断
327
381
![ w:1000] ( figs/deadlock-banker-code.png )
328
382
329
383
330
384
---
331
385
332
- ##### 死锁避免
333
- 银行家算法(Banker's Algorithm)-- 完整算法
386
+ ##### 银行家算法的完整描述
334
387
![ w:700] ( figs/deadlock-banker-algorithm.png )
335
388
336
389
337
390
---
338
391
339
- ##### 死锁避免
340
- 银行家算法(Banker's Algorithm)-- 示例1
392
+ ##### 银行家算法示例1
341
393
![ w:1000] ( figs/deadlock-banker-ex1.png )
342
394
343
395
---
344
396
345
- ##### 死锁避免
346
- 银行家算法(Banker's Algorithm)-- 示例1
397
+ ##### 银行家算法示例1
398
+
347
399
![ w:1000] ( figs/deadlock-banker-ex2.png )
348
400
349
401
---
350
402
351
- ##### 死锁避免
352
- 银行家算法(Banker's Algorithm)-- 示例1
403
+ ##### 银行家算法示例1
404
+
353
405
![ w:1000] ( figs/deadlock-banker-ex3.png )
354
406
355
407
356
408
---
357
409
358
- ##### 死锁避免
359
- 银行家算法(Banker's Algorithm)-- 示例1
410
+ ##### 银行家算法示例1
411
+
360
412
![ w:1000] ( figs/deadlock-banker-ex4.png )
361
413
362
414
---
363
415
364
- ##### 死锁避免
365
- 银行家算法(Banker's Algorithm)-- 示例2
416
+ ##### 银行家算法示例2
417
+
366
418
![ w:1000] ( figs/deadlock-banker-ex5.png )
367
419
368
420
---
369
421
370
- ##### 死锁避免
371
- 银行家算法(Banker's Algorithm)-- 示例2
422
+ ##### 银行家算法示例2
423
+
372
424
![ w:1000] ( figs/deadlock-banker-ex6.png )
373
425
374
426
@@ -418,76 +470,71 @@ lock(L2); lock(L1);
418
470
419
471
---
420
472
421
- ##### 死锁检测
422
- 死锁检测算法:数据结构
473
+ ##### 死锁检测算法数据结构
423
474
- Available:长度为m的向量:每种类型可用资源的数量
424
475
- Allocation:一个n×m矩阵:当前分配给各个进程每种类型资源的数量
425
476
- 进程$P_i$ 拥有资源$R_j$的$Allocation[ i, j] $个实例
426
477
427
478
428
479
---
429
480
430
- ##### 死锁检测
431
- 死锁检测算法:完整算法
481
+ ##### 死锁检测算法的完整描述
432
482
![ w:1000] ( figs/deadlock-check-algorithm.png )
433
483
434
484
435
485
---
436
486
437
- ##### 死锁检测
438
- 死锁检测算法:-- 示例1
487
+ ##### 死锁检测示例1
439
488
![ w:800] ( figs/deadlock-check-ex1.png )
440
489
441
490
442
491
---
443
492
444
- ##### 死锁检测
445
- 死锁检测算法:-- 示例1
493
+ ##### 死锁检测示例1
494
+
446
495
![ w:800] ( figs/deadlock-check-ex2.png )
447
496
448
497
449
498
---
450
499
451
- ##### 死锁检测
452
- 死锁检测算法:-- 示例1
453
- ![ w:800] ( figs/deadlock-check-ex3.png )
500
+ ##### 死锁检测示例1
454
501
502
+ ![ w:800] ( figs/deadlock-check-ex3.png )
455
503
456
504
---
457
505
458
- ##### 死锁检测
459
- 死锁检测算法:-- 示例1
506
+ ##### 死锁检测示例1
507
+
460
508
![ w:800] ( figs/deadlock-check-ex4.png )
461
509
462
510
463
511
---
464
512
465
- ##### 死锁检测
466
- 死锁检测算法:-- 示例1
513
+ ##### 死锁检测示例1
514
+
467
515
![ w:800] ( figs/deadlock-check-ex5.png )
468
516
469
517
470
518
---
471
519
472
- ##### 死锁检测
473
- 死锁检测算法:-- 示例1
520
+ ##### 死锁检测示例1
521
+
474
522
![ w:800] ( figs/deadlock-check-ex6.png )
475
523
序列$<T_0, T_2, T_1, T_3, T_4>$ 对于所有的i,都可满足Finish[ i] = true
476
524
477
525
478
526
---
479
527
480
- ##### 死锁检测
481
- 死锁检测算法:-- 示例2
528
+ ##### 死锁检测示例2
529
+
482
530
![ w:700] ( figs/deadlock-check-ex7.png )
483
531
可通过回收线程$T_0$占用的资源,但资源不足以完成其他线程请求
484
532
线程$T_1, T_2, T_3, T_4$形成死锁
485
533
486
534
487
535
---
488
536
489
- ##### 死锁检测
490
- 使用死锁检测算法
537
+ ##### 使用死锁检测算法
491
538
492
539
- 死锁检测的时间和周期选择依据
493
540
- 死锁多久可能会发生
@@ -553,7 +600,3 @@ lock(L2); lock(L1);
553
600
- 返回到一些安全状态, 重启进程到安全状态
554
601
- 可能出现饥饿
555
602
- 同一进程可能一直被选作被抢占者
556
-
557
-
558
-
559
-
0 commit comments