我想了解Peterson的N进程算法,并且遇到了这个问题。试图了解Peterson的N进程算法
问:假设3个进程具有进程ID 0, 1 and 2
。这些进程在单处理器上同时执行,并使用Peterson的N进程算法来控制关键部分的执行。每个进程运行以下伪代码:
lock(pid);
<critical section>;
unlock(pid
其中lock()
和unlock()
函数的定义如
lock(for Process i):
/* repeat for all partners */
for (count = 0; count < (NUMPROCS-1); count++) {
flags[i] = count;
turn[count] = i;
"wait until (for all k != i, flags[k]<count) or (turn[count] != i)"
}
Unlock (for Process i):
/* tell everyone we are finished */
flags[i] = -1;
假设由<flags[0], flags[1], flags[2], turn[0], turn[1]>
值所定义的系统在任何特定时间的状态和的id当前正在执行的进程。进一步假设系统的当前状态为<0,0,0,2,-1>
而进程0
当前正在执行。显示三个进程从此状态开始运行到完成的一种特殊方式。在跟踪三个进程的并发执行时,请在每个步骤显示系统的状态。
我的意见上的单处理器并行运行
的进程不能在同一时间在CPU上执行。一次只能在CPU上执行其中的一个。 当一个进程在CPU上执行时,它可能会执行其代码的任何部分。
// NUMPROCS = 3
- 对于i = 0
lock(for Process 0):
for (count = 0; count < 2; count++) {
flags[0] = count;
turn[count] = 0;
"wait until (for all k != 0, flags[k]<count) or (turn[count] != 0)"
}
Unlock (for Process 0):
flags[0] = -1;
- 对于i = 1
lock(for Process 1):
for (count = 0; count < 2; count++) {
flags[1] = count;
turn[count] = 1;
"wait until (for all k != 1, flags[k]<count) or (turn[count] != 1)"
}
Unlock (for Process 1):
flags[1] = -1;
- 对于i = 2
lock(for Process 2):
for (count = 0; count < 2; count++) {
flags[2] = count;
turn[count] = 2;
"wait until (for all k != 2, flags[k]<count) or (turn[count] != 2)"
}
Unlock (for Process 2):
flags[2] = -1;
我的问题是,从哪里开始跟踪代码?它被认为是flags[0]=0, flags[1]=0, flags[2]=0, turn[0]=2, turn[1]=-1
,但它将如何帮助我们开始追踪代码?
如果我们开始在之前的过程
0
那么所有的 转值将被设置为比什么是给 给我们不同的值的循环。如果我们通过执行问题的假设意味着过程
0
是在它的 关键部分,则在接下来的过程中会设置 转值别的东西的循环。
为什么他们给了我们状态值以及它如何帮助我们找到从哪里开始跟踪代码。
如果我得到一些提示来帮助我开始跟踪代码,那将会很棒。
谢谢你,对于长期问题抱歉。