web-dev-qa-db-fra.com

Que sont exactement les "spin-locks"?

Je me suis toujours demandé ce qu'ils sont: chaque fois que j'en entends parler, des images d'appareils futuristes ressemblant à des volants vont danser (rouler?) Dans mon esprit ...

Que sont-ils?

76
RCIX

Lorsque vous utilisez des verrous classiques (mutex, sections critiques, etc.), le système d'exploitation met votre thread dans l'état WAIT et le preempts en programmant d'autres threads sur le même noyau. Cela a un impact négatif sur les performances si le temps d'attente est vraiment court, car votre thread doit maintenant attendre qu'un preemption soit à nouveau utilisé pour prendre le temps processeur.

En outre, les objets du noyau ne sont pas disponibles dans tous les états du noyau, comme dans un gestionnaire d'interruption ou lorsque la pagination n'est pas disponible, etc. 

Les spinlocks ne causent pas de préemption, mais attendent dans une boucle ("spin") jusqu'à ce que l'autre noyau libère le verrou. Cela empêche le thread de perdre son quantum et continue dès que le verrou est libéré. Le mécanisme simple des spinlocks permet à un noyau de l’utiliser dans presque tous les états.

C'est pourquoi, sur une machine simple, un spinlock est simplement une "désactivation des interruptions" ou une "levée IRQL" qui empêche complètement la planification des threads.

Les spinlocks permettent en fin de compte aux noyaux d’éviter les «verrous de noyau gros» (un verrou acquis lorsque le noyau entre dans le noyau et libérés à la sortie) et d’obtenir un verrouillage granulaire sur les primitives du noyau, ce qui entraîne un meilleur multitraitement sur des machines multicœurs et donc de meilleures performances.

EDIT: Une question est venue: "Est-ce que cela signifie que je devrais utiliser des spinlocks autant que possible?" et je vais essayer d'y répondre:

Comme je l'ai mentionné, les verrous spin ne sont utiles que dans les endroits où le temps d'attente anticipé est plus court qu'un quantum (lire: millisecondes) et où la préemption n'a pas beaucoup de sens (par exemple, les objets du noyau ne sont pas disponibles). 

Si le temps d'attente est inconnu ou si vous êtes en mode utilisateur, les verrous anti-rotation ne sont pas efficaces. Vous utilisez 100% de temps CPU sur le core en attente tout en vérifiant si un spinlock est disponible. Vous empêchez d'autres threads de s'exécuter sur ce noyau jusqu'à l'expiration de votre quantum. Ce scénario est uniquement réalisable pour de courtes rafales au niveau du noyau et une option improbable pour une application en mode utilisateur.

Voici une question à SO qui s'adresse à cela: Spinlocks, quelle est leur utilité?

97
Sedat Kapanoglu

C'est à peu près une boucle qui continue jusqu'à ce qu'une certaine condition soit remplie:

while(cantGoOn) {};
17
Oded

Supposons qu'une ressource est protégée par un verrou, un thread qui souhaite accéder à la ressource doit d'abord acquérir le verrou. Si le verrou n'est pas disponible, le thread peut vérifier à plusieurs reprises si le verrou a été libéré. Pendant ce temps, le thread occupé attend, vérifie le verrouillage, utilise le processeur, mais ne fait aucun travail utile. Un tel verrou est qualifié de verrou tournant.

15
codaddict
 while(something != TRUE ){};
 // it happend
 move_on();
7
Luka Rahne

C'est un type de verrou qui fait occupé en attente

Cela est considéré comme un anti-motif, sauf pour la programmation de pilote de très bas niveau (où il peut arriver que l'appel d'une fonction d'attente "appropriée" entraîne plus de temps système que le verrouillage simplement occupé pendant quelques cycles).

Voir par exemple Spinlocks dans le noyau Linux .

5
janesconference

Les SpinLocks sont ceux dans lesquels le fil attend que le verrou soit disponible. Cela sera normalement utilisé pour éviter la surcharge liée à l'obtention des objets du noyau lorsqu'il est possible d'acquérir l'objet du noyau dans un laps de temps réduit.

Ex:

While(SpinCount-- && Kernel Object is not free)
{}

try acquiring Kernel object
3
aJ.

Vous voudriez utiliser un spinlock lorsque vous pensez qu'il est moins coûteux d'entrer dans une boucle d'attente occupée et de mettre en pool une ressource plutôt que de le bloquer lorsque la ressource est verrouillée.

La rotation peut être bénéfique lorsque les verrous sont fins et nombreux (par exemple, un verrou par nœud dans une liste chaînée), ainsi que lorsque les délais de maintien du verrou sont toujours extrêmement courts. En général, tout en maintenant un verrou tournant, il faut éviter de bloquer, appeler tout ce qui peut le bloquer, en tenant plusieurs verrous en même temps, effectuer des appels distribués de façon dynamique (interface et virtuals), faire des appels distribués de manière statique dans tout code ne faisant t posséder, ou allouer de la mémoire.

Il est également important de noter que SpinLock est un type de valeur, pour des raisons de performances. En tant que tel, vous devez faire très attention à ne pas copier accidentellement une instance de SpinLock, car les deux instances (l'original et la copie) seraient alors complètement indépendantes l'une de l'autre, ce qui entraînerait probablement un comportement erroné de l'application. Si une instance de SpinLock doit être transmise, elle devrait l'être par référence plutôt que par valeur.

3
NullReference

En bref, spinlock utilise des instructions de comparaison et d’échange atomiques (CAS) ou de test-and-set pour mettre en œuvre un idiome sécurisé sans fil, sans fil libre. De telles structures évoluent bien dans les machines multicœurs. 

1
Chandra Patni

Spinlock, est un type de verrou qui ne peut ni bloquer ni dormir. Tout thread qui souhaite acquérir un spinlock pour une ressource partagée ou critique tourne continuellement, gaspillant le cycle de traitement du processeur jusqu'à ce qu'il obtienne le verrou pour la ressource spécifiée. Une fois le spinlock acquis, il essaie de terminer le travail dans son quantum, puis libère la ressource, respectivement. Spinlock est le type de verrou de priorité la plus élevée. Vous pouvez simplement dire qu’il s’agit d’un type de verrou non préemptif.

0
akD

C'est une boucle qui tourne jusqu'à ce qu'une condition soit remplie.

0
dreamlax

Eh bien, oui, l’intérêt des verrouillages (par rapport aux sections critiques traditionnelles, etc.) est qu’ils offrent de meilleures performances dans certaines circonstances (systèmes multicœurs ..), car ils ne donnent pas immédiatement le reste du quantum du thread. 

0
Terry Mahaffey