test_and_set() 指令如何在多处理器上仍然有效?

How could the test_and_set() instruction still work on a multiprocessor?

亲爱的堆栈溢出社区,

我正在阅读 Silberschatz、Galvin 和 Gagne 的操作系统概念 (2012),它在第 210 页上说 "if two test_and_set() instructions are executed simultaneously (each on a different CPU), they will be executed sequentially in some arbitrary order.",我不明白为什么两个这样的机构会 顺序执行 甚至在多处理器上。如果每条指令在不同的处理器上执行怎么办?据我所知,这两个机构同时被处决。

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

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

http://www.ece.lsu.edu/ee4720/doc/vax.pdf

VAX有一条BBSS(Branch on Bit Set and Set)指令和一条BBSSI(Branch on Bit Set and Set Interlocked)指令。

如果您有 2 个处理器在同一个清除位上执行 BBSS,您可以获得:

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

大部分指令不会一步执行,处理器可以相互独立运行。

test-and-set 的重点是一个处理器先执行它,然后另一个处理器执行它,它们不会同时执行。

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