怎么理解操作系统的 Peterson 算法的特殊情况

2022-04-10 00:46:08 +08:00
 amiwrong123

我理解正常一个进程的程序是这样写的:

int number;
enter_region(number);
这里是临界区的操作;
leave_region();

当进程 0 执行了 enter_region(0);,但还没有执行 leave_region 时。此时进程 1 去执行 enter_region(1);,会发现:

但是现在有这种特殊情况:

1210 次点击
所在节点    程序员
5 条回复
churchmice
2022-04-10 01:18:42 +08:00
不会啊,进程 0 做完之后对于进程 1 的 while 条件 interested[other] 就不成立了,进程 1 就会跳出 while 去 critical region 了
amiwrong123
2022-04-10 11:28:47 +08:00
@churchmice #1
是的,确实如你所说,能够正常工作的。

我的纠结点在于:
- 我觉得应该既要判断 turn 的值,也要判断 interested 数组的值。两个都判断完事之后,才可以去临界区。
- 但是我帖子里这种特殊情况的话,进程 1 只判断 turn == process ,后面那个条件就直接短路了(它就根本没判断 interested 数组)

但是,后来我一想。既然执行到 turn == process ,说明 interested 数组的自己索引位置已经变成 True 。然后 turn == process 不成立,说明另一个进程也至少执行到了 trun = process 这句,那么另一个进程肯定会进入无限循环,所以 这里可以短路判断。
heiher
2022-04-10 15:28:57 +08:00
刚执行过 turn = self_process ,随后的判断 turn == self_process 就不成立,则说明一定有其它进程也执行了 turn = process ,但也一定会卡在 interested[other] == true 条件上,所以当前线程可以安全进入临界区。另外,挺有意思的是这个算法在 x86 的内存模型上需要使用内存屏障指令。
amiwrong123
2022-04-10 16:54:25 +08:00
@heiher #3
应该在哪里加 内存屏障阿,另外,应该加什么内存屏障阿
heiher
2022-04-10 17:47:27 +08:00
@amiwrong123 需要防止 Store interested[process] 乱序到 Load turn 之后:

interested[process] = TRUE;
turn = process;
storeload_barrier (mfence on x86)
while (turn == process && interested[other] == TRUE);

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/845977

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX