- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在阅读“Operating System Concepts”并试图理解 Peterson 的解决方案(第 208 页),这是一种确保共享内存的两个进程不会同时访问共享资源的算法(可能会产生竞争条件) ).
在 Peterson 的解决方案中,有两个有助于同步的共享变量:“boolean flag[2]”和“int turn”。 “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 开始。为什么这个算法没有实现进程同步?
最佳答案
因为简化版有饿死的几率。
正如您所说:
j finishes its critical section, at which point j will set "turn = i", allowing i to begin.
好的,现在说 Process i
完成并将设置 turn = j
。现在如果Process i
,再次想要进入临界区,它不能作为turn = j
进入。 进程 i
能够进入临界区的唯一方法是 进程 j
再次进入临界区并设置 turn = i
。
因此,如您所见,简化版本要求进程必须严格交替进入临界区,否则会导致饥饿。
关于multithreading - 为什么使用单个 'turn' 变量的 Peterson 算法的简化不提供进程同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48385998/
经典的无竞争复杂性 Peterson-2 algorithm是 4(因为它对共享寄存器内存执行 4 次读/写操作)是否有某种版本的 Peterson-2 算法,它需要较少的访问共享寄存器内存?显然1次
bool in_critical[2] = {false,false}; int turn; enter(int me, int other) { (S1:) in_critical[me] =
我编写了以下 Peterson 算法模型: bool want[2], turn ltl { []<>P[0]@cs } active [2] proctype P() { pid me =
今天我正在阅读有关同步的内容。读完 Peterson solution 后我有点困惑对于临界区问题是一个基于软件的解决方案。现在我的问题是:“基于软件的解决方案”是什么意思? 最佳答案 解决临界区问题
我有以下代码,我试图用它来理解彼得森的解决方案。当我对循环的小值运行此实现直到 9999 时,输出正确显示为 0,但是当我使用更高的循环值(如 9999999)测试它时,我得到的值接近 0,但不是 0
我读过这个关于 Peterson 的互斥算法。然后有一个问题,如果我们重新排序 do...while 循环中的第一个和第二个命令会发生什么?如果我们这样做,我看不到会发生什么......有人能告诉我我
我用多线程用 C++ 编写了 Peterson 算法的简单实现。该程序通过两个线程更改字符串。但我没有得到最终结果。我哪里错了? using namespace std; int flag[2]={0
我正在阅读“Operating System Concepts”并试图理解 Peterson 的解决方案(第 208 页),这是一种确保共享内存的两个进程不会同时访问共享资源的算法(可能会产生竞争条件
我正在尝试实现 Peterson's algorithm在 Java 中,暂时创建了以下内容 public class Peterson { private volatile boolean[
我需要对我的代码的反馈以执行以下声明,我走的路对吗? 问题陈述: 一个。实现一个具有私有(private) int 和三个公共(public)方法的信号量类:init、wait 和 signal。 w
大家好,我正在用 C 语言实现 Peterson 的算法。我有两个函数将由创建的线程执行,一个将变量加 1,另一个将同一个变量减 1。 该程序接收一个 int 类型的参数,该整数是我要创建的线程数的平
是的,这是一项家庭作业,但我已经尝试了所有可能的方法,但无法想出一个可能的方案。这个作业的目的是为了说明,在实现dekker算法/peterson算法之前,很可能两个进程不会先后走下去。 impor
我试图理解 Peterson 的 N-Process 算法,但我遇到了这个问题。 问题:假设 3 个进程具有进程 ID 0, 1 and 2 .这些进程在单处理器上并发执行,并使用 Peterson
我使用的是 Django 1.9、Python 3.6。我进行此迁移是为了尝试为任何缺少用户配置文件的用户填写用户配置文件。 但我收到以下错误。 奇怪的是“user”变量似乎是一个 User 实例。
(这个问题可能与“无软件推荐”规则有关;我理解为什么它可能会被关闭)。 在他们的论文中 F_2 Lanczos revisited 、Peterson 和 Monico 给出了 Lanczos 算法的
我是一名优秀的程序员,十分优秀!