两个进程无锁访问共享内存
two processes accessing shared memory without lock
共享内存中有两个变量(由两个进程共享),一个是一般的int
变量(称之为intVar),初始值为5 和另一个 pid_t
类型的变量(称之为 pidVar),初始值为 0.
现在要开发的代码是,这两个进程都尝试向共享内存中的 intVar
变量添加一个数字(这两个进程是固定的且不同的)(没有锁定memory ever),如果进程发现共享内存中的 pidVar
变量的值为 0,那么它只会用自己的 pid
更新它.
所以我的困惑点是:
1: 由于两个进程都试图添加一个数字,那么最终在两个进程完成添加数字后 intVar
变量中的最终值将始终相同?
2:共享内存中的pidVar
是要完全随机的吗?对吗?
不一定。添加到 intVar 涉及从内存读取、计算新值然后写回内存。这两个进程可以在 相同的 时间读取,这意味着两次写入,所以最后一个将获胜。
pidVar 被定义为初始为零。一个或两个进程可能会以这种方式找到它,从而导致其中一个或两个更新它。所以你会得到其中之一。
您的作业说没有 锁定,这是一个含糊不清的术语。锁定可以指物理层操作,例如总线协议,直到高级操作,例如进程间通信。我更喜欢同步是锁定;因此,从总线协议到消息传递的一切都是锁定的。
有些处理器会产生原子内存的错觉,例如通过使用“lock: addl $2, (%sp)”这样的操作码;但实际上这是处理器中通过 busy wait 实现的 同步 的一种形式。同步就是锁定;因此这将违反您的任务。
一些处理器将内存协议切分,以便您可以控制干扰。典型的实现使用 加载链接,存储条件 模式,如果任何东西干扰了加载链接指令标识的缓存行,存储就会失败。这允许通过重试操作来组合原子;但又是同步,因此锁定。
共享内存中有两个变量(由两个进程共享),一个是一般的int
变量(称之为intVar),初始值为5 和另一个 pid_t
类型的变量(称之为 pidVar),初始值为 0.
现在要开发的代码是,这两个进程都尝试向共享内存中的 intVar
变量添加一个数字(这两个进程是固定的且不同的)(没有锁定memory ever),如果进程发现共享内存中的 pidVar
变量的值为 0,那么它只会用自己的 pid
更新它.
所以我的困惑点是:
1: 由于两个进程都试图添加一个数字,那么最终在两个进程完成添加数字后 intVar
变量中的最终值将始终相同?
2:共享内存中的pidVar
是要完全随机的吗?对吗?
不一定。添加到 intVar 涉及从内存读取、计算新值然后写回内存。这两个进程可以在 相同的 时间读取,这意味着两次写入,所以最后一个将获胜。
pidVar 被定义为初始为零。一个或两个进程可能会以这种方式找到它,从而导致其中一个或两个更新它。所以你会得到其中之一。
您的作业说没有 锁定,这是一个含糊不清的术语。锁定可以指物理层操作,例如总线协议,直到高级操作,例如进程间通信。我更喜欢同步是锁定;因此,从总线协议到消息传递的一切都是锁定的。
有些处理器会产生原子内存的错觉,例如通过使用“lock: addl $2, (%sp)”这样的操作码;但实际上这是处理器中通过 busy wait 实现的 同步 的一种形式。同步就是锁定;因此这将违反您的任务。
一些处理器将内存协议切分,以便您可以控制干扰。典型的实现使用 加载链接,存储条件 模式,如果任何东西干扰了加载链接指令标识的缓存行,存储就会失败。这允许通过重试操作来组合原子;但又是同步,因此锁定。