Question

Je me demandais toujours ce qu'ils sont: à chaque fois que je l'entends à leur sujet, des images de futuriste dispositifs comme volant vont danser (rouler?) Dans mon esprit ...

Que sont-ils?

Était-ce utile?

La solution

Lorsque vous utilisez des verrous réguliers (mutex, sections critiques, etc.), le système d'exploitation met votre fil dans l'état WAIT et préempte il en programmant d'autres fils sur le même noyau. Cela a une pénalité de performance si le temps d'attente est très court, parce que votre fil doit maintenant attendre une préemption pour recevoir le temps CPU à nouveau.

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 est pas disponible, etc.

Spinlocks ne causent pas, mais attendent dans la préemption d'une boucle ( « spin ») jusqu'à ce que les autres versions de base de la serrure. Cela empêche le fil de perdre son et continuer dès que le verrou est libéré. Le mécanisme simple de spinlocks permet un noyau de l'utiliser dans presque tout Etat.

Voilà pourquoi sur une seule machine de base spinlock est simplement un « désactiver les interruptions » ou « augmenter IRQL » qui empêche l'ordonnancement des threads complètement.

Spinlocks finalement permettre à des grains à éviter de « Big Kernel Lock » (un verrou acquis lorsque le noyau entre noyau et libéré à la sortie) et ont blocage granulaire sur les primitives du noyau, ce qui provoque une meilleure multi-traitement sur les machines multi-core ainsi de meilleures performances .

EDIT: Une question a été posée: "Est-ce que ça veut dire que je devrais utiliser spinlocks autant que possible?" et je vais essayer de répondre:

Comme je l'ai mentionné, Spinlocks ne sont utiles que dans des endroits où le temps d'attente prévus est plus court qu'un quantique (lire: millisecondes) et ne fait pas preemption beaucoup de sens (par exemple des objets noyau ne sont pas disponibles).

Si le temps d'attente est inconnu ou si vous êtes dans Spinlocks en mode utilisateur ne sont pas efficaces. Vous consommez temps CPU à 100% sur le noyau d'attente tout en vérifiant si un spinlock est disponible. Vous empêchez les autres threads de courir sur ce noyau jusqu'à ce que votre quantum expire. Ce scénario est seulement possible pour de courtes rafales au niveau du noyau et une option peu probable pour une application en mode utilisateur.

Voici une question à résoudre de manière que: Spinlocks, Quelle est l'utilité sont-ils

Autres conseils

Dites une ressource est protégée par un verrou, un fil qui veut avoir accès à la ressource doit acquérir le verrou d'abord. Si le verrou n'est pas disponible, le fil peut vérifier à plusieurs reprises si le verrou a été libéré. Pendant ce temps, le thread attend occupé, la vérification de la serrure, en utilisant CPU, mais pas faire un travail utile. Un tel verrou est appelé comme un verrou de rotation.

Il est beaucoup pertty une boucle qui continue à aller jusqu'à une certaine condition est remplie:

while(cantGoOn) {};
 while(something != TRUE ){};
 // it happend
 move_on();

Il est un type de verrou qui fait occupé attente

Il est considéré comme un anti-modèle, sauf pour la programmation de pilotes très bas niveau (où il peut arriver que l'appel d'une fonction d'attente « appropriée » a plus de frais généraux que le verrouillage simplement occupé pendant quelques cycles).

Voir par exemple Spinlocks dans le noyau Linux .

spinlocks sont ceux dans lesquels thread attend jusqu'à ce que le verrou est disponible. Ce sera normalement utilisé pour éviter la surcharge d'obtenir les objets du noyau quand il y a un champ d'acquisition de l'objet du noyau à l'intérieur une petite période de temps.

Ex:

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

try acquiring Kernel object

Vous voulez utiliser un spinlock quand vous pensez qu'il est moins cher d'entrer dans une boucle d'attente active et mettre en commun une ressource au lieu de bloquer lorsque la ressource est verrouillée.

  

Spinning peut être bénéfique lorsque les verrous sont à grains fins et un grand nombre (par exemple, un verrou par nœud dans une liste chaînée), ainsi que lorsque les temps d'attente de verrouillage sont toujours extrêmement courts. En général, tout en maintenant un verrou de rotation, il faut éviter de bloquer, appeler tout ce qui se peut bloquer, détenir plus d'un verrou de rotation à la fois, ce qui rend dynamiquement EXPEDIE appels (interface et Virtuelles), ce qui rend statiquement expédié appels en tout code un doesn » t propre, ou l'allocation de mémoire.

     

Il est également important de noter que SpinLock est un type de valeur, pour des raisons de performance. En tant que tel, il faut être très prudent de ne pas copier accidentellement une instance SpinLock, comme les deux cas (l'original et la copie) seraient alors complètement indépendants les uns des autres, ce qui conduirait probablement à un comportement erroné de l'application. Si une instance SpinLock doit être passé autour, il doit être passé par référence plutôt que par valeur.

En bref, spinlock emploie atomique comparer et swap (CAS) ou de test et Posé comme des instructions pour mettre en œuvre sans verrouillage, attendre fil idiome coffre-fort gratuit. De telles structures échelle bien dans les machines multi-core.

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

Eh bien, oui - le point de verrouillage de spin (vs une des sections critiques traditionnelles, etc.) est qu'ils offrent de meilleures performances dans certaines circonstances (systèmes multi-cœurs ..), parce qu'ils ne donnent pas immédiatement le reste du quantum du fil .

Spinlock, est un type de verrou, qui est non-bloc mesure et non-sommeil capable. Tout thread qui veulent acquérir un spinlock pour une ressource partagée ou critique tourneront, perdre en permanence le cycle de traitement du processeur jusqu'à ce qu'il acquiert le verrou pour la ressource spécifiée. Une fois spinlock est acquise, il essaie de terminer les travaux dans son quantum, puis relâchez respectivement la ressource. Spinlock est le plus haut type de verrouillage de priorité, il suffit peut dire, il est une sorte de verrouillage non préemptif.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top