Skip to content

Commit 2fd90cb

Browse files
add
1 parent 17abed9 commit 2fd90cb

File tree

1 file changed

+26
-9
lines changed

1 file changed

+26
-9
lines changed

lec12/p1-syncmutex.md

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -419,7 +419,24 @@ exit section
419419

420420
---
421421

422-
##### 尝试一
422+
##### 尝试一 根据turn值进入临界区
423+
![bg right:50% 100%](figs/soft-1.png)
424+
- 满足“忙则等待”,但是有时不满足“空闲则入”
425+
```c
426+
// 线程 Tj
427+
do {
428+
while (turn != j) ;
429+
critical section
430+
turn = i;
431+
remainder section
432+
} while(1)
433+
```
434+
435+
436+
437+
---
438+
439+
##### 尝试一 根据turn值进入临界区
423440
![bg right:50% 100%](figs/soft-1.png)
424441
- 满足“忙则等待”,但是有时不满足“空闲则入”
425442
- Ti不在临界区,Tj想要继续运行,但是必须等待Ti进入过临界区后
@@ -430,7 +447,7 @@ exit section
430447

431448
---
432449

433-
##### 尝试二
450+
##### 尝试二 根据flag进入临界区
434451
![bg right:50% 100%](figs/soft-2.png)
435452
- 互相依赖(线程忙等)
436453
- 不满足“忙则等待”
@@ -449,7 +466,7 @@ do {
449466

450467
---
451468

452-
##### 尝试三
469+
##### 尝试三 根据flag进入临界区
453470
![bg right:50% 100%](figs/soft-3.png)
454471
- 满足“忙则等待”,但是不满足“空闲则入”
455472
- flag[i]=flag[j]=1
@@ -466,15 +483,15 @@ do {
466483

467484
---
468485

469-
##### Peterson算法
486+
##### Peterson算法 turn+flag
470487

471488
![bg right:50% 100%](figs/soft-peterson.png)
472489
- 满足线程Ti和Tj之间互斥的经典的基于软件的解决方法(1981年)
473490
- 孔融让梨
474491

475492
---
476493

477-
##### Peterson算法
494+
##### Peterson算法 turn+flag
478495
```
479496
// 共享变量
480497
let mut flag = [false; N]; // 标识进程是否请求进入临界区
@@ -501,7 +518,7 @@ while (true) {
501518

502519
---
503520

504-
##### Peterson算法
521+
##### Peterson算法 turn+flag
505522
![bg right:50% 100%](figs/soft-peterson-2.png)
506523
```
507524
//进程Pi
@@ -565,7 +582,7 @@ Eisenberg和McGuire
565582

566583
---
567584

568-
##### N线程
585+
##### N线程 - 初始化
569586
```c
570587
INITIALIZATION:
571588

@@ -578,7 +595,7 @@ for (index=0; index<n; index++) {
578595

579596
---
580597

581-
##### N线程
598+
##### N线程 - 进入临界区
582599
```c
583600
ENTRY PROTOCOL (for Process i ):
584601
repeat {//从turn到i是否存在请求进程:若存在,则不断循环,直至不存在这样的进程,将当前进程标记为ACTIVE
@@ -600,7 +617,7 @@ turn = i;//获得turn并处理
600617
601618
---
602619
603-
##### N线程
620+
##### N线程 - 离开临界区
604621
```c
605622
EXIT PROTOCOL (for Process i ):
606623

0 commit comments

Comments
 (0)