我正在阅读 ”操作系统概念 http://iips.icci.edu.iq/images/exam/Abraham-Silberschatz-Operating-System-Concepts---9th2012.12.pdf”并尝试理解 Peterson 的解决方案(第 208 页),这是一种确保共享内存的两个进程不会同时访问共享资源的算法(可能会产生竞争条件)。
在 Peterson 的解决方案中,有两个有助于同步的共享变量:“boolean flag[2]”和“intturn”。 “flag[i]”指示特定进程是否正在尝试进入其“关键部分”,即它访问共享数据的部分。 “turn”包含两个进程的索引之一(0 或 1),并指示哪个进程访问共享数据。
Peterson 算法(对于进程 i,其中另一个进程用 j 表示)如下:
do {
#set flag to say I'm trying to run
flag[i] = true
#let the other process have a turn
turn = j
while(flag[j] == true && turn == j);
#enter critical section
flag[i] = false
#do non-critial remaining stuff
} while (true);
为什么 Peterson 算法的以下简化没有提供进程同步?如果我明白为什么不,我相信它将帮助我理解彼得森的算法。
#initialize turn to i or j
do {
while(turn == j);
#enter critical section
turn = j;
#do non-critial remaining stuff
} while (true);
在这个简化的算法中,在我看来,给定的进程 i 将继续循环,直到另一个进程 j 完成其关键部分,此时 j 将设置“turn = i”,允许 i 开始。为什么这个算法不能实现进程同步呢?
Because 简化版有可能会挨饿。
正如你提到的:
j 完成其关键部分,此时 j 将设置“turn = i”,
让我开始吧。
好,现在说Process i
完成并将设置turn = j
。现在如果Process i
, again想要进入临界区,它不能进入turn = j
。唯一的办法是Process i
能够进入临界区的是Process j
再次进入临界区并设置turn = i
.
因此,正如您所看到的,简化版本要求进程必须严格交替进入临界区,否则会导致饥饿。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)