Spinlock

Dans la technologie de la programmation , un spinlock est une serrure où le fil attend simplement dans une boucle (" ; spins" ;) à plusieurs reprises la vérification jusqu'à la serrure devient disponible. Car le fil reste actif mais n'effectue pas une tâche utile, l'utilisation d'une telle serrure est un genre de attente occupé. Une fois qu'acquis, des spinlocks seront habituellement tenus jusqu'à ce qu'ils soient explicitement libérés, bien que dans quelques réalisations ils puissent être automatiquement libérés si les blocs de fil (" d'aka ; va au sleep" ;).

Spinlocks sont efficace si les fils sont seulement pour être bloqués pendant une courte période, car ils évitent des frais généraux du du système d'exploitation le transfert du contexte d'une transaction de remise à plus tard de processus de ou . Pour cette raison, les spinlocks sont les grains du système d'exploitation intérieur employé souvent cependant, les spinlocks deviennent inutiles si tenus pour plus longtemps, l'empêchement d'autre filète de courir et d'exiger la remise à plus tard. Plus vous tenez la serrure longtemps, plus est grand le risque que vous sera interrompu par le programmateur d'O/S tout en le tenant. Si ceci se produit, d'autres fils seront laissés le " ; spinning" ; (à plusieurs reprises essayant d'acquérir la serrure), malgré le fait que vous n'accomplissez pas le progrès vers le libérer. C'est particulièrement vrai sur un système de simple-processeur, où chaque fil de attente de la même priorité est susceptible de gaspiller son timeslice assigné entier (" ; quantum" ;) la rotation jusqu'au fil qui se tient la serrure est finalement remise à plus tard.

La mise en oeuvre des serrures de rotation est correctement difficile, parce qu'on doit tenir compte de la possibilité d'accès simultané à la serrure pour empêcher les conditions de compétitivité généralement que c'est seulement possible avec des instructions langage d'assemblage du spécial , telles que le atomique du Essai-et-placer les opérations de , et ne peut pas être mis en application des langages de haut niveau évolués comme le C . Sur des architectures sans de telles opérations, ou si l'exécution de langage de haut niveau évolué est exigée, un algorithme de verrouillage non atomique peut être employé, par exemple algorithme de Peterson de . Mais noter qu'une telle exécution peut exiger plus de mémoire qu'un spinlock, être plus lent permettre le progrès après avoir ouvert, et ne peut pas être implantable dans un langage de haut niveau évolué si l'exécution en panne est en service.

Exécution d'exemple

L'exemple suivant emploie x86 langage d'assemblage pour mettre en application un spinlock. Cela fonctionnera sur n'importe quel processeur compatible du 80386 d'Intel .

serrure : # la variable de serrure. 1 = a fermé à clef, 0 = débloqué. densité double 0 spin_lock : l'eax de mouvements, 1 # a placé le registre d'EAX à 1. boucle : eax de xchg, # atomique échange l'inscription d'EAX à # la variable de serrure. # ceci stockera toujours 1 à la serrure, partant # valeur précédente dans le registre d'EAX. examiner l'eax, eax # essai EAX avec lui-même. Entre autres, ceci # placer le drapeau zéro du processeur si EAX est 0. # si EAX est 0, puis la serrure a été ouvert et # nous l'avons juste fermé à clef. # autrement, EAX est 1 et nous n'avons pas acquis la serrure. boucle # saut de jnz de nouveau à l'instruction de XCHG si le drapeau zéro est # non réglé, la serrure était verrouillée, et nous devons tourner. rouir # la serrure a été acquis, revient à appeler # fonction. spin_unlock : l'eax de mouvements, 0 # a placé le registre d'EAX à 0. eax de xchg, # atomique échange l'inscription d'EAX à # la variable de serrure. rouir # la serrure a été libéré.

Optimisations significatives

Ce qui précède est une exécution simple il est facile comprendre que (pour un programmeur qui comprend l'assembleur du X86 ), et travaille sur toutes les unités centrales de traitement de l'architecture x86. Cependant un certain nombre d'optimisations d'exécution sont possibles :

Sur des réalisations postérieures de l'architecture x86, le spin_unlock de peut sans risque employer un MOUVEMENT débloqué au lieu du XCHG verrouillé, qui est beaucoup plus rapide. C'est dû à la mémoire subtile de commandant les règles de qui soutiennent ceci, quoique le MOUVEMENT ne soit pas une pleine barrière de mémoire de . Cependant quelques processeurs (quelques processeurs de Cyrix , quelques révisions du Pentium pro d'Intel (dû aux bogues), et un Pentium plus tôt et des systèmes de la SMP de I486 ) feront la chose et les données fausses protégées par la serrure pourraient être corrompus. Sur la plupart des architectures non-x86, des instructions explicites de barrière de mémoire ou les instructions atomiques (comme dans l'exemple) doivent être employées, ou là peuvent être " spécial ; unlock" ; instructions (comme sur IA64 ) qui fournissent la commande nécessaire de mémoire.

Pour réduire le trafic d'autobus du inter-UNITÉ CENTRALE DE TRAITEMENT , quand la serrure n'est pas acquise, le code devrait faire une boucle la lecture sans essayer d'écrire n'importe quoi, jusqu'à ce qu'il lise une valeur changée. En raison du MESI la mise en antémémoire des protocoles, ceci fait devienne la ligne de cachette pour que la serrure " ; Shared" ; ; alors il y a remarquablement aucun trafic d'autobus de tandis qu'une unité centrale de traitement attend la serrure. Cette optimisation est efficace sur toutes les architectures d'unité centrale de traitement qui ont une cachette par unité centrale de traitement, parce que MESI est si omniprésent.

Pour réduire la puissance d'énergie, pendant la boucle ci-dessus on emploie l'instruction du nop de représentant de qui indique les unités centrales de traitement un certain x86 détendre et sauver la puissance. (Elle est ignorée sur d'autres). Cette instruction peut également améliorer l'equitabilité de l'acquisition de serrure, bien que l'equitabilité soit plus d'un problème avec quelques autres architectures d'unité centrale de traitement.

Solutions de rechange

L'inconvénient primaire d'un spinlock est qu'il perd le temps tout en attendant pour acquérir la serrure qui pourrait être productivement dépensée ailleurs. Il y a deux solutions de rechange qui évitent ceci :

n'acquièrent pas la serrure. Dans beaucoup de situations il est possible aux structures de données de conception que le n'exigent pas fermer à clef , par exemple par l'utilisation par données de fil, ou en employant les données par-unité centrale de traitement et en désactivant des interruptions.

  • Commuter à un fil différent tout en attendant (parfois appelé le Sleeplocks de '). Ceci implique typiquement d'attacher le fil courant à une file d'attente des fils attendant la serrure, commutant alors à encore. Cet arrangement a également les avantages qu'il garantit que la famine de ressource de ne se produit pas tant que tous les fils abandonnent par la suite des serrures qu'ils acquièrent et on peut dont prendre des décisions de établissement du programme au sujet le fil devrait progresser d'abord.

    Quelques logiciels d'exploitation emploient une approche hybride où un spinlock est employé au commencement, mais le fil se suspend s'il ne progresse pas rapidement. Le Solaris emploiera un spinlock quand essayant d'accéder à une ressource a fermé à clef par un fil courant-courant, mais dormira si le fil ne fonctionne pas actuellement (qui se produit toujours sur des systèmes de simple-processeur).

    Voir également

    synchronisation
    Impasse
    Seqlock
  • .

    Random links:Fédération internationale de Kendo | Bataille de Roliça | Université de technologie fédérale Akure | Boise hebdomadaire | Points extrêmes de la Grèce | Spinlock