天天看點

X86中的LOCK指令

LOCK字首作用于單個指令上,它對中斷沒有任何影響,因為中斷隻能在指令之間産生。LOCK字首的真正作用是保持對系統總線的控制,直到整條指令執行完畢。它在一條指令多次通路記憶體的時候相當有用。

比如一個共享計數器,我們需要對它進行原子遞增操作,需要做如下工作:

1)從記憶體讀取該計數器的值,臨時将其儲存在CPU内部寄存器中。

2)增加讀取到的值。

3)将被修改後的值寫回記憶體。

在x86體系結構中,這個遞增操作可以在單個指令中完成,是以中斷不會對該遞增操作産生影響。但是該指令有兩次記憶體通路操作,讀和寫,另外一個CPU或者核(core)可能同時對該計數器進行遞增操作。如果另外一個CPU/核(core)在第1步完成後,第3步完成前讀取該計數器的值,那麼兩個CPU/核(core)都使用被修改之前的計數器值并對其進行遞增操作。這樣就出現了錯誤的情況。

繼續閱讀