128 votes

SpinLock versus sémaphore

Ce qui est des différences fondamentales entre les sémaphores & Spinlock ? & Dans quelles meilleures situations ou conditions, nous pouvons utiliser ces.

148voto

Damon Points 26437

Spinlock et sémaphore diffèrent principalement dans quatre choses:

1. Ce qu'ils sont
Un spinlock est une implémentation possible de la serrure, à savoir celui qui est mis en œuvre par occupé attente ("spinning"). Un sémaphore est une généralisation d'un verrou (ou, à l'inverse, un verrou est un cas particulier d'un sémaphore). Généralement, mais pas nécessairement, spinlocks ne sont valables que dans un seul processus, alors que les sémaphores peuvent être utilisés pour la synchronisation entre les différents processus.

Une serrure fonctionne pour l'exclusion mutuelle, qui est l'un thread à la fois peut acquérir le verrou et de procéder à une "section critique" de code. Habituellement, cela signifie que le code qui modifie certaines données partagées par plusieurs threads.
Un sémaphore est un compteur et permettra même d'être acquis par un ou plusieurs threads, selon la valeur que vous publiez, et (dans certaines implémentations) en fonction de ce que sa valeur maximale admissible est.

Pour autant, la possibilité de verrouiller un cas particulier d'un sémaphore avec une valeur maximale de 1.

2. Ce qu'ils font
Comme indiqué ci-dessus, un spinlock est un verrou, et, par conséquent, une exclusion mutuelle (strictement 1 à 1) mécanisme. Il travaille à plusieurs reprises par l'interrogation et/ou de la modification d'un emplacement de mémoire, généralement dans une manière atomique. Cela signifie que l'acquisition d'un spinlock est "occupé" fonctionnement que, éventuellement, les brûlures de cycles CPU pour un long moment (peut-être pour toujours!) alors qu'il atteint efficacement "rien".
La principale motivation d'une telle approche est le fait qu'un changement de contexte a une charge équivalente à la filature de quelques centaines (ou milliers) de fois, donc si un verrou peut être acquis par la gravure d'un certain nombre de cycles de tourner, ce qui peut dans l'ensemble très bien être plus efficace. Aussi, pour des applications temps-réel, il peut ne pas être acceptable pour bloquer et d'attendre que le planificateur de revenir au loin dans l'avenir.

Un sémaphore, en revanche, ne tourne pas ou tourne pendant un temps très court (comme une optimisation pour éviter le syscall généraux). Si un sémaphore ne peut pas être acquis, il bloque, en donnant de temps PROCESSEUR à un autre thread qui est prêt à s'exécuter. Cela peut évidemment dire que quelques millisecondes avant de passer votre fil est prévu à nouveau, mais si ce n'est pas un problème (en général, il n'est pas), alors il peut être très efficace, L'approche conservatrice.

3. Comment ils se comportent en présence de congestion
C'est une idée fausse commune que les spinlocks ou sans verrouillage des algorithmes sont "généralement plus rapide", ou qu'ils ne sont utiles que pour les "très court tâches" (idéalement, un objet de synchronisation doivent être conservées plus longtemps que nécessaire, jamais).
La seule différence importante est de savoir comment les différentes approches se comporter en présence de congestion.

Un système bien conçu a normalement peu ou pas de congestion (ce qui ne signifie pas tous les threads tentent d'acquérir le verrou à l'exact même temps). Par exemple, on pourrait normalement pas d'écrire le code qui acquiert un verrou, puis charge la moitié d'un mégaoctet de zip compressé des données à partir du réseau, décode et analyse les données, et enfin modifie une référence partagée (ajout de données à un conteneur, etc.) avant de relâcher le verrou. Au lieu de cela, on pourrait acquérir le verrou dans le seul but d'accéder à la ressource partagée.
Car cela signifie qu'il existe beaucoup plus de travail à l'extérieur de la section critique qu'à l'intérieur d'elle, naturellement, la probabilité pour un thread qui est à l'intérieur de la section critique est relativement faible, et donc quelques fils sont à la lutte pour le verrouiller en même temps. Bien sûr, chaque maintenant et puis les deux fils va essayer d'acquérir le verrou dans le même temps (si cela ne pouvait pas arriver, vous n'auriez pas besoin d'une serrure!), mais c'est l'exception plutôt que la règle dans une "bonne santé" du système.

Dans un tel cas, un spinlock grandement surpasse un sémaphore parce que si il n'y a pas de verrouillage de la congestion, les frais généraux de l'acquisition de la spinlock est une simple dizaine de cycles par rapport à des centaines/milliers de cycles pour un changement de contexte ou de 10 à 20 millions de cycles pour perdre le reste de la tranche de temps.

D'autre part, étant donné le niveau élevé d'encombrement, ou si le verrou est détenu pendant de longues périodes (parfois vous ne pouvez pas l'aider!), spinlock brûlera fou quantités de cycles CPU pour parvenir à rien.
Un sémaphore (ou mutex) est un bien meilleur choix dans ce cas, car elle permet à un thread différent pour exécuter utile tâches pendant ce temps. Ou, si aucun autre thread a quelque chose d'utile, il permet au système d'exploitation de ralentir le CPU et réduire la chaleur / économiser de l'énergie.

Aussi, sur un single-core, un système de spinlock sera tout à fait inefficace en présence de verrouillage de la congestion, comme un coup de fil de déchets de son temps à attendre un changement d'état qui ne peut pas arriver (pas jusqu'à la libération fil est prévu, ce qui n'est pas le cas alors que le thread en attente en cours d'exécution!). Par conséquent, compte tenu de tout montant de contention, de l'acquisition du verrou prend environ 1 1/2 tranches de temps dans le meilleur des cas (en supposant que la libération fil conducteur est le suivant étant prévu), ce qui n'est pas un très bon comportement.

4. La façon dont ils sont mis en œuvre
Un sémaphore sera aujourd'hui enveloppez sys_futex sous Linux (éventuellement avec un spinlock qui se ferme après quelques tentatives).
Spinlock est généralement mis en œuvre à l'aide d'opérations atomiques, et sans l'aide de rien fourni par le système d'exploitation. Dans le passé, cela signifie en utilisant soit le compilateur intrinsèques ou non-portable instructions en assembleur. Pendant ce temps les deux C++11 et C11 ont des opérations atomiques dans le cadre de la langue, donc, en dehors de la difficulté générale de l'écriture prouvable de verrouillage correct sans code, il est maintenant possible de mettre en œuvre sans verrouillage de code dans un lieu entièrement portable et (presque) sans douleur.

77voto

gbjbaanb Points 31045

très simplement, un sémaphore est un "rendement" de la synchronisation de l'objet, spinlock est un "busywait". (il y a un peu plus de sémaphores en ce qu'elles synchroniser plusieurs threads, contrairement à un mutex ou de la garde ou à un moniteur ou une section critique qui protège une région de code à partir d'un seul thread)

Il vous suffit d'utiliser un sémaphore dans plusieurs circonstances, mais l'utilisation d'un spinlock où vous allez à verrouiller pour un très court laps de temps - il y a un coût pour le verrouillage surtout si vous verrouillez beaucoup. Dans de tels cas, il peut être plus efficace de spinlock pour un peu de temps d'attente pour la ressource protégée pour devenir déverrouillé. Évidemment, il y a un gain de performance si vous tournez trop longtemps.

en règle générale, si vous faites tourner pendant plus d'un fil quantique, alors vous devriez utiliser un sémaphore.

28voto

Jonathan Leffler Points 299946

Au-delà de ce Yoav Aviram et gbjbaanb dit, l'autre point clé est utilisé pour être que vous n'auriez jamais utiliser un spin-lock sur une machine mono-PROCESSEUR, alors qu'un sémaphore aurait du sens sur une telle machine. Aujourd'hui, vous êtes souvent du mal à trouver une machine sans noyaux multiples, ou de l'hyperthreading, ou l'équivalent, mais dans les circonstances que vous avez juste un seul PROCESSEUR, vous devez utiliser les sémaphores. (J'ai confiance en la raison en est évidente; si le CPU est occupé attente de quelque chose d'autre pour libérer le spin-lock, mais il est en cours d'exécution sur le seul CPU, la serrure est peu probable d'être publié.)

19voto

Zbyszek Points 151

Des pilotes de périphériques sous Linux par Rubinni

À la différence des sémaphores, verrouillages spinlock peut être utilisé dans le code qui ne peut pas dormir, comme les gestionnaires d’interruption

8voto

Raman Chalotra Points 81

Je ne suis pas un noyau d'experts, mais voici quelques points:

Même monoprocesseur machine peut utiliser spin-serrures si le noyau de préemption est activé lors de la compilation du noyau. Si le noyau de préemption est désactivé alors spin-lock (peut-être) se développe à un vide déclaration.

Aussi, lorsque nous essayons de comparer Sémaphore vs Spin-lock, je crois sémaphore se réfère à celui utilisé dans le noyau et non PAS celui utilisé pour la CIB (userland).

Fondamentalement, le spin-lock doit être utilisé si la section critique est petite (plus petite que la surcharge du sommeil et de réveil) et de la section critique ne fait pas appel à tout ce qui peut dormir! Un sémaphore doit être utilisé si la section critique est plus grand et il peut dormir.

Raman Chalotra.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X