📜  操作系统|流程同步|问题5

📅  最后修改于: 2021-07-02 16:03:42             🧑  作者: Mango

原子获取并设置x,y指令无条件地将内存位置x设置为1,并获取y中x的旧值,而无需任何中间访问内存位置x。考虑在二进制信号量上P和V函数的以下实现。

void P (binary_semaphore *s) {
  unsigned y;
  unsigned *x = &(s->value);
  do {
     fetch-and-set x, y;
  } while (y);
}

void V (binary_semaphore *s) {
  S->value = 0;
}

以下哪一项是正确的?
(A)如果在P中禁用了上下文切换,则该实现可能不起作用。
(B)可以使用一对正常的加载/存储来代替使用获取并设置
(三)执行V是错误的
(D)代码未实现二进制信号量答案: (A)
说明:让我们谈谈操作P()。它将s的值存储在x中,然后获取x的旧值,将其存储在y中并将x设置为1。如果某个其他进程不执行V()并设置,则该进程的while循环将永远继续。 s的值为0。如果在P中禁用了上下文切换,则while循环将永远运行,因为其他进程将无法执行V()。