9
votes

Pourquoi les spinlocks ne fonctionnent pas dans les systèmes uniprocessor (Unicore)?

Je sais que les spirlocks travaillent avec la brochure, des chemins de noyau différents existent et des noyaux sont préventifs, alors pourquoi les spinlocks ne fonctionnent pas dans des systèmes uniprocesseurs? (Par exemple, sous Linux)


2 commentaires

duplicaté possible de serrure de spin utile en un seul Processeur UNI Core Architecture?


Ce n'est pas que les spinlocks ne fonctionnent pas, c'est qu'ils sont très inutiles des cycles du processeur.


5 Réponses :


29
votes

Si je comprends votre question, vous demandez pourquoi les serrures de spin sont une mauvaise idée sur des machines à base unique.

Ils devraient toujours travailler , mais peuvent être beaucoup plus chers que la vraie concurrence au fil-dormance:

Lorsque vous utilisez un spinlock, vous affirmez essentiellement que vous ne pensez pas que vous devriez attendre longtemps. Vous dites que vous pensez qu'il est préférable de maintenir la tranche de temps de processeur avec une boucle occupée que le coût de votre fil et de votre contexte à un autre fil ou à un autre processus. Si vous devez attendre un peu de temps très court, vous pouvez dormir et être réveillé presque immédiatement, mais le coût de descendre et de monter est plus cher que d'attendre.

Ceci est plus susceptible d'être ok sur des processeurs multicœurs, car ils ont beaucoup mieux de profils de concurrence que des processeurs de base uniques. Sur les processeurs multi-nœuds, entre les itérations de boucle, un autre thread peut avoir pris soin de votre condition préalable. Sur les processeurs de base unique, il n'est pas possible que quelqu'un d'autre aurait pu vous aider - vous avez enfermé le seul et unique noyau.

Le problème ici est que Si vous attendez ou dormez sur une serrure, vous indiquez au système que vous n'avez pas encore tout ce dont vous avez besoin, il devrait donc aller faire d'autres choses et vous reviendrez plus tard . Avec une serrure de spin, vous JAMAIS DIT LE SYSTEME Ceci, alors vous le verrouillez-vous en attendant que quelque chose d'autre se produise - mais, pendant ce temps, vous êtes Tenez tout le système , alors quelque chose d'autre ne peut pas arriver.


1 commentaires

Une préoccupation: pourquoi certains fil-ci / occuperaient-ils une serrure dans un système unicore? Vous avez dit que le fil qui veut entrer dans la section critique indique le système disant qu'il n'a pas ce qu'il cherche! Qui d'autre a alors? Il s'agit d'un système Uni-processeur et des threads tenant des serrures de spin ne sont jamais préemptés. Donc, si ce fil attend quelque chose, est-ce que c'est le cas où un autre fil a mutex sur ce "quelque chose" et est préempté? Sinon, le thread obtiendra toujours ce qu'il veut et nous pouvons simplement utiliser des spinlocks seuls avec la politique : Interruption désactivée et aucune préemption si le verrou est tenu.



2
votes

La nature d'un spinlock est qu'elle ne deschedule pas le processus - elle tourne à la place jusqu'à ce que le processus acquiert la serrure.

sur un uniprocesseur, il sera immédiatement acquérir la serrure ou tournera pour toujours - si la serrure est affirmée, il n'y aura jamais une opportunité pour le processus qui détient actuellement la ressource à l'abandonner. Les spinlocks ne sont utiles que lorsqu'un autre processus peut exécuter tandis que l'on tourne sur le verrou - qui signifie des systèmes multiprocesseurs.


2 commentaires

CAF, j'ai un peu de confusion ici. << Sur un Uniprocesseur, cela acquiert immédiatement la serrure ou elle tournera pour toujours. >> Vous n'avez qu'un seul processeur, lorsque un processeur essaie de contenir le verrou de spin, il l'acquérira immédiatement. Comme vous avez pris une serrure de spin, descheduling n'est pas possible. Donc, aucun autre processus ne sera capable d'exécuter maintenant. Mais vous avez mentionné que la contention est possible? Lorsque vous dites de contention ici, vous entendez un contexte de contexte des procès et de contexte d'interruption? Une fois que la serrure de spin est acquise, aucun autre processus ne sera en mesure d'exécuter?


@kumar: C'est vrai - si un processus tenant un spinlock est interrompu et que l'interruption tente de prendre le même verrou.



1
votes

SpinLocks sont, de par leur nature, destinés à être utilisés sur des systèmes multiprocesseurs, bien qu'un poste de travail uniprocesseur exécutant un noyau préventif se comporte comme SMP, en ce qui concerne la concurrence. Si un système uniprocesseur non imprévé est passé dans une rotation sur une serrure, elle tournerait pour toujours; Aucun autre thread ne pourra jamais obtenir la CPU pour libérer la serrure. Pour cette raison, les opérations SpinLock sur les systèmes uniprocesseurs sans préemption activée sont optimisées pour ne rien faire, à l'exception de celles qui modifient l'état de masquage de l'IRQ. En raison de la préemption, même si vous ne vous attendez jamais à ce que votre code soit exécuté sur un système SMP, vous devez toujours mettre en œuvre un verrouillage correct.

ref: pilotes de périphérique Linux Par Jonathan Corbet, Alessandro Rubini, Greg Kroah-Hartma


0 commentaires

2
votes

Il existe différentes versions de Spinlock: xxx pré>

dans UNI processeur spin_lock_irqsave () code> doit être utilisé lorsque les données doivent être partagées entre le contexte de processus et le contexte d'interruption, comme Dans ce cas, l'IRQ est également désactivé. spin_lock_irqsave () code> Travaillez dans toutes les circonstances, mais en partie car em> ils sont sans danger, ils sont également assez lents. Toutefois, dans le cas où les données doivent être protégées dans différents processeurs, il est préférable d'utiliser des versions ci-dessous, ceux-ci sont moins chers, car les IRQs ne sont pas désactivés dans ce cas: P>

spin_lock(&lock);
...
spin_unlock(&lock);


0 commentaires

1
votes

Rechercher les deux paragraphes suivants dans Système d'exploitation Trois pièces faciles qui pourraient être utiles:

Pour les serrures de spin, dans le boîtier unique de la CPU, des frais généraux de performance peuvent être assez douloureux; Imaginez le cas où le fil tenant la serrure est préempté dans une section critique. Le planificateur pourrait alors courir tous les autres threads (imaginez qu'il y a n - 1 autres), chacun desquels essaie d'accéder à la serrure. Dans ce cas, chacun de ces threads sera tourner pendant la durée d'une tranche de temps avant d'abandonner la CPU, un Déchets de cycles de processeur.

Cependant, sur plusieurs processeurs, des serrures de spin fonctionnent raisonnablement bien (si le nombre de fils est approximativement égal au nombre de Cpus). La pensée se passe comme suit: imaginez fil un sur la CPU 1 et Fil b sur la CPU 2, les deux sous-combinés pour une serrure. Si thread a (CPU 1) Prenez la serrure, puis le fil b essaie de faire tourner (sur la CPU 2). Cependant, probablement la section critique est courte, et donc bientôt le verrouillage devient disponible et est fourni par le fil B. Spinning à attendre une serrure détenue sur un autre processeur ne gaspille pas de nombreux cycles dans ce cas, et peut donc être efficace


0 commentaires