两个进程无锁访问共享内存

two processes accessing shared memory without lock

共享内存中有两个变量(由两个进程共享),一个是一般的int变量(称之为intVar),初始值为5 和另一个 pid_t 类型的变量(称之为 pidVar),初始值为 0.

现在要开发的代码是,这两个进程都尝试向共享内存中的 intVar 变量添加一个数字(这两个进程是固定的且不同的)(没有锁定memory ever),如果进程发现共享内存中的 pidVar 变量的值为 0,那么它只会用自己的 pid 更新它.

所以我的困惑点是:

1: 由于两个进程都试图添加一个数字,那么最终在两个进程完成添加数字后 intVar 变量中的最终值将始终相同?

2:共享内存中的pidVar是要完全随机的吗?对吗?

  1. 不一定。添加到 intVar 涉及从内存读取、计算新值然后写回内存。这两个进程可以在 相同的 时间读取,这意味着两次写入,所以最后一个将获胜。

  2. pidVar 被定义为初始为零。一个或两个进程可能会以这种方式找到它,从而导致其中一个或两个更新它。所以你会得到其中之一。

您的作业说没有 锁定,这是一个含糊不清的术语。锁定可以指物理层操作,例如总线协议,直到高级操作,例如进程间通信。我更喜欢同步是锁定;因此,从总线协议到消息传递的一切都是锁定的。

有些处理器会产生原子内存的错觉,例如通过使用“lock: addl $2, (%sp)”这样的操作码;但实际上这是处理器中通过 busy wait 实现的 同步 的一种形式。同步就是锁定;因此这将违反您的任务。

一些处理器将内存协议切分,以便您可以控制干扰。典型的实现使用 加载链接,存储条件 模式,如果任何东西干扰了加载链接指令标识的缓存行,存储就会失败。这允许通过重试操作来组合原子;但又是同步,因此锁定。