【发布时间】:2018-04-17 22:33:27
【问题描述】:
某个计算生成两个数组a 和b,使得a[i]=f(i) for 0 ≤ i < n and b[i] = g(a[i]) for 0 ≤ i < n。假设这个计算被分解成两个并发进程X和Y,这样X计算数组a和Y计算数组b。这些进程使用两个二进制信号量R 和S,都初始化为零。数组a 由两个进程共享。进程的结构如下所示。
Process X:
private i;
for (i=0; i < n; i++) {
a[i] = f(i);
ExitX(R, S);
}
Process Y:
private i;
for (i=0; i < n; i++) {
EntryY(R, S);
b[i]=g(a[i]);
}
以下哪一项代表ExitX 和EntryY 的正确实现?
(A)
ExitX(R, S) {
P(R);
V(S);
}
EntryY (R, S) {
P(S);
V(R);
}
(B)
ExitX(R, S) {
V(R);
V(S);
}
EntryY(R, S) {
P(R);
P(S);
}
(C)
ExitX(R, S) {
P(S);
V(R);
}
EntryY(R, S) {
V(S);
P(R);
}
(D)
ExitX(R, S) {
V(R);
P(S);
}
EntryY(R, S) {
V(S);
P(R);
}
我认为答案应该是 (B),因为进程 Y 中的关键部分在 X 中的关键部分被执行之前不应执行(a[i] 首先被填充,这将必须用于b[i]),所以在执行X 之后,根据Y 中临界区入口处的选项(B)我们会找到R=1,S=1,所以现在临界区在Y可以执行。
问题:正确答案是(C),我哪里错了?
【问题讨论】:
-
B 折叠了两把锁,所以它不可能是正确的。这里的重点是协调两个循环。让我写下来。
标签: operating-system semaphore binary-semaphore