Operating system test_和_set()指令如何仍能在多处理器上工作?

Operating system test_和_set()指令如何仍能在多处理器上工作?,operating-system,critical-section,instructions,Operating System,Critical Section,Instructions,亲爱的堆栈溢出社区, 我正在阅读Silberschatz、Galvin和Gagne的《操作系统概念》(2012),书中说“如果两条test_和_set()指令同时执行(每个指令在不同的CPU上),它们将以任意顺序依次执行。”在第210页,我无法理解为什么即使在多处理器上,两个这样的机构也会按顺序执行。如果每个指令都在不同的处理器上执行会怎样?据我所知,这两个机构必须同时执行 我对指令和多处理器的原子性的理解还停留在一个相当肤浅的层次上,所以我可能认为这个问题是理所当然的。有人能帮我吗 结果取决于

亲爱的堆栈溢出社区,

我正在阅读Silberschatz、Galvin和Gagne的《操作系统概念》(2012),书中说“如果两条test_和_set()指令同时执行(每个指令在不同的CPU上),它们将以任意顺序依次执行。”在第210页,我无法理解为什么即使在多处理器上,两个这样的机构也会按顺序执行。如果每个指令都在不同的处理器上执行会怎样?据我所知,这两个机构必须同时执行


我对指令和多处理器的原子性的理解还停留在一个相当肤浅的层次上,所以我可能认为这个问题是理所当然的。有人能帮我吗

结果取决于机器指令。让我以VAX为例,因为它是一种易于理解的处理器:

VAX有一条BBSS(位集和位集上的分支)指令和一条BBSSI(位集和位集联锁上的分支)指令

如果您有两个处理器在同一个清除位上执行BBS,您可以得到:

P1 Tests Bit (Clear)
P2 Tests Bit (Clear) 
P1 Sets Bit and does not branch
P2 Sets Bit and dot not branch
如果对同一位执行BBSSI,处理器将锁定内存。你得到

p1 locks the memory
p1 Tests Bit (Clear)    
P2 Tests Bit and is Blocked
P1 Sets Bit and does not branch
p1 unlocks the memory
P2 Tests Bit (SET)
P2 Branches

指令在大多数情况下不会在一个步骤中执行,处理器可以彼此独立运行。

结果取决于机器指令。让我以VAX为例,因为它是一种易于理解的处理器:

VAX有一条BBSS(位集和位集上的分支)指令和一条BBSSI(位集和位集联锁上的分支)指令

如果您有两个处理器在同一个清除位上执行BBS,您可以得到:

P1 Tests Bit (Clear)
P2 Tests Bit (Clear) 
P1 Sets Bit and does not branch
P2 Sets Bit and dot not branch
如果对同一位执行BBSSI,处理器将锁定内存。你得到

p1 locks the memory
p1 Tests Bit (Clear)    
P2 Tests Bit and is Blocked
P1 Sets Bit and does not branch
p1 unlocks the memory
P2 Tests Bit (SET)
P2 Branches

大多数情况下,指令不会在一个步骤中执行,处理器可以彼此独立运行。

测试和设置的全部要点是,一个处理器将首先执行指令,然后另一个处理器将执行指令,并且它们不会同时执行指令


为了实现这一点,两个处理器之间将进行一些通信。基本上,一个处理器将从内存加载缓存线,包括内存位置,并告诉另一个处理器在测试和设置完成之前不能拥有该缓存线

测试和设置的全部要点是,一个处理器将首先执行它,然后另一个处理器将执行它,并且它们不会同时执行


为了实现这一点,两个处理器之间将进行一些通信。基本上,一个处理器将从内存加载缓存线,包括内存位置,并告诉另一个处理器在测试和设置完成之前不能拥有该缓存线

谢谢大家!!非常好的答案和材料!我已经从链接中阅读了BBSSI的解释。我有点困惑于“如果位包含在内存中,读取位的状态并将位设置为新状态是一个联锁操作”,这是否意味着要测试和设置的位可以包含在内存或处理器的寄存器中?如果它包含在一个寄存器中,那么我们不需要联锁该位,但程序员如何使用BBSSI,因为该位在寄存器中?VAX具有正交指令集,这意味着它允许任何操作数的任何寻址模式(使用寄存器的内存移动地址除外)。因此,可以将BBSSI指令与寄存器操作数一起使用。在这种情况下,执行没有联锁,就像BBS指令一样。这真的没有多大意义。谢谢!非常好的答案和材料!我已经从链接中阅读了BBSSI的解释。我有点困惑于“如果位包含在内存中,读取位的状态并将位设置为新状态是一个联锁操作”,这是否意味着要测试和设置的位可以包含在内存或处理器的寄存器中?如果它包含在一个寄存器中,那么我们不需要联锁该位,但程序员如何使用BBSSI,因为该位在寄存器中?VAX具有正交指令集,这意味着它允许任何操作数的任何寻址模式(使用寄存器的内存移动地址除外)。因此,可以将BBSSI指令与寄存器操作数一起使用。在这种情况下,执行没有联锁,就像BBS指令一样。这真的没有多大意义。