Que signifie l'instruction "verrouiller" dans l'assemblage x86?

j'ai vu un montage x86 dans la source de Qt:

q_atomic_increment:
    movl 4(%esp), %ecx
    lock 
    incl (%ecx)
    mov "151900920",%eax
    setne %al
    ret

    .align 4,0x90
    .type q_atomic_increment,@function
    .size   q_atomic_increment,.-q_atomic_increment
  1. D'après Googling, je savais que l'instruction lock obligerait le CPU à verrouiller le bus, mais je ne sais pas quand le CPU libérera le bus?

  2. à propos du code ci-dessus, je ne comprends pas comment ce code implémente le Add ?

45
demandé sur unwind 2012-01-17 11:33:34
la source

3 ответов

  1. LOCK n'est pas une instruction elle-même: c'est un ordre préfixe, qui s'applique à l'instruction suivante. Cette instruction doit être quelque chose qui fait une lecture-modifier-écrire sur la mémoire ( INC , XCHG , CMPXCHG etc.)- - - dans ce cas, c'est l'instruction incl (%ecx) qui inc rappelle le mot l à l'adresse figurant dans le registre ecx .

    le préfixe LOCK s'assure que L'UNITÉ CENTRALE DE TRAITEMENT possède la propriété exclusive de la ligne de cache appropriée pendant toute la durée de l'opération, et fournit certaines garanties supplémentaires pour les commandes. Pour ce faire, il peut être nécessaire d'installer une serrure de bus, mais L'UNITÉ CENTRALE DE TRAITEMENT évitera de le faire dans la mesure du possible. Si l'autobus est verrouillé, alors il est seulement pour la durée de l'instruction verrouillée.

  2. ce code copie l'adresse de la variable à incrémenter de la pile dans le ecx enregistrer, puis il fait lock incl (%ecx) pour atomiquement incrémenter cette variable par 1. Les deux instructions suivantes placent le eax Registre (qui détient la valeur de retour de la fonction) à 0 si la nouvelle valeur de la variable est 0, et 1 autrement. L'opération est un incrément , pas un add (d'où le nom).

70
répondu Anthony Williams 2012-01-17 12:46:09
la source

ce que vous ne comprenez peut-être pas, c'est que le microcode requis pour incrémenter une valeur exige que nous lisions d'abord dans l'ancienne valeur.

le mot clé Lock Force les micro-instructions multiples qui se produisent effectivement à sembler fonctionner atomiquement.

si vous aviez 2 threads chacun essayant d'incrémenter la même variable, et ils lisent tous les deux la même valeur originale en même temps, alors ils augmentent tous les deux à la même valeur, et ils les deux écrivent la même valeur.

au lieu d'avoir la variable incrémentée deux fois, ce qui est l'attente typique, vous finissez par incrémenter la variable une fois.

le mot clé lock empêche que cela se produise.

11
répondu Dan 2013-03-24 03:36:54
la source

de google, je savais que l'instruction de verrouillage causerait le verrouillage cpu du bus,mais je vous ne savez pas quand le cpu libère le bus ?

LOCK est un préfixe d'instruction, donc il ne s'applique qu'à l'instruction suivante, la source ne l'indique pas très clairement ici, mais la vraie instruction est LOCK INC . Donc le Bus est verrouillé pour l'incrément, puis déverrouillé

à propos du code ci-dessus, je ne comprendre comment ce code mise en œuvre de l'Ajouter?

ils n'implémentent pas un Add, ils implémentent un increment, avec une indication de retour si l'ancienne valeur était 0. Un ajout utiliserait LOCK XADD (cependant, windows entrelacé incrément/décrément sont également mis en œuvre avec LOCK XADD ).

10
répondu Necrolis 2012-01-17 11:47:06
la source

Autres questions sur