【发布时间】:2014-11-02 17:02:18
【问题描述】:
我正在尝试理解 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的 for 循环 之前开始,那么所有 转弯值将被设置为不同的值,而不是给定的值 给我们。如果我们假设通过执行问题意味着进程
0在它的 关键部分,然后下一个进程的 for 循环将设置 将价值转化为其他东西。
为什么给我们状态值以及它如何帮助我们找到从哪里开始跟踪代码。
如果我能得到一些提示来帮助我开始追踪代码,那就太好了。
谢谢你,很抱歉这个冗长的问题。
【问题讨论】:
标签: c algorithm concurrency process