O que significa a instrução" lock " na montagem x86?
q_atomic_increment:
movl 4(%esp), %ecx
lock
incl (%ecx)
mov $0,%eax
setne %al
ret
.align 4,0x90
.type q_atomic_increment,@function
.size q_atomic_increment,.-q_atomic_increment
de pesquisar no Google, eu sabia que as instruções iam fazer com que a CPU fechasse o autocarro, mas não sei quando é que a CPU liberta o autocarro?
sobre todo o código acima, eu não entendo como este código implementa o
Add
?
3 answers
-
LOCK
is not an instruction itself: it is an instruction prefix, which applies to the following instruction. Essa instrução deve ser algo que faz uma leitura-modificar-escrever na memória (INC
,XCHG
,CMPXCHG
etc.)- - - neste caso é a instruçãoincl (%ecx)
queinc
reimenta a palavral
ong no endereço mantido no registoecx
.O prefixo
LOCK
garante que a CPU tem a propriedade exclusiva da linha de cache apropriada durante o período de validade do e fornece certas garantias adicionais de encomenda. Isso pode ser conseguido através da afirmação de um bloqueio de ônibus, mas a CPU evitará isso sempre que possível. Se o autocarro estiver bloqueado, será apenas durante a instrução de bloqueio. Este código copia o endereço da variável a ser incrementada da pilha para o registo
ecx
, depois fazlock incl (%ecx)
para aumentar atomicamente essa variável em 1. As duas instruções seguintes definem o registoeax
(que contém o return value from the function) to 0 if the new value of the variable is 0, and 1 otherwise. A operação é um incremento , não um acréscimo (daí o nome).
O que você pode não entender é que o microcódigo necessário para aumentar um valor requer que nós Lamos primeiro no valor antigo.
A palavra-chave de bloqueio força as múltiplas instruções micro que estão realmente a ocorrer a funcionar atomicamente.
Se você tivesse 2 threads tentam, cada um, para incrementar a mesma variável, e ambos leram o mesmo valor original, ao mesmo tempo, em seguida, ambos de incremento para o mesmo valor, e ambos escrever o mesmo valor.
Em vez de ter a variável incrementada duas vezes, que é a expectativa típica, você acaba aumentando a variável uma vez.
A palavra-chave bloqueia isto.
Do google, eu sabia que as instruções de bloqueio fariam com que a cpu fechasse o autocarro,mas eu ... não sabes quando a cpu liberta o autocarro ?
LOCK
é um prefixo de instrução, portanto só se aplica à seguinte instrução, a fonte não deixa muito claro aqui, mas a instrução real é LOCK INC
. Então o autocarro está trancado para o incremento, e depois desbloqueado.
Quanto ao código acima, não entendo como é que este código implementou o Add?Eles não ... implementar um Add, eles implementam um incremento, juntamente com uma indicação de retorno se o valor antigo era 0. Uma adição usaria
LOCK XADD
(no entanto, windows InterlockedIncrement / Decrement também são implementados com LOCK XADD
).