Accueil🇫🇷Chercher

Spinlock

En programmation informatique et plus particulièrement en programmation concurrente, le spinlock ou verrou tournant est un mécanisme simple de synchronisation basé sur l'attente active[1].

Le spinlock base son principe sur l'attente active. En attendant leur tour, les threads l'utilisant vont le tester de manière répétée jusqu'à ce qu'il se libère. Pour ce faire, les threads doivent impérativement utiliser une opération atomique afin de garder le principe de l'exclusion mutuelle.

Quand utiliser le spinlock ?

L'attente active rend le spinlock gourmand en ressources. C'est pourquoi il ne faut l'utiliser que dans une des situations suivantes :

  • lorsque le changement de contexte est impossible (par exemple en l'absence de système d'exploitation) ;
  • lorsque le changement de contexte est plus long que le temps d'attente moyen (contrainte temps rĂ©el souple) ou maximum (contrainte temps rĂ©el dur). Ce n'est en gĂ©nĂ©ral le cas que dans les systèmes Ă  multiprocesseurs. En effet, le verrou tournant est souvent utilisĂ© pour synchroniser le noyau Linux sur des systèmes SMP (il est mĂŞme souvent couplĂ© avec une autre mĂ©thode de synchronisation).
  • Le spinlock n'a d’intĂ©rĂŞt que pour les systèmes multiprocesseur pour exĂ©cuter des tâches pseudo-atomiques. Sur un monoprocesseur le principe est le suivant : [taskLock - ma tâche - taskUnlock]. Comme avec plusieurs cĹ“urs on ne contrĂ´le pas les autres processeurs il faut se prĂ©venir de leur intrusion avec le spinlock en plus : [taskLock - spinLock - ma tâche - spinUnlock - taskUnlock]. Si les interruptions peuvent interfĂ©rer dans le processus il faut remplacer le taskLock par un intLock. Si on oublie de verrouiller le scheduler, un changement de tâche peut amener une autre tâche Ă  utiliser 100 % du CPU sur la prise du spinLock jusqu'au prochain schedulling et si elle est prioritaire Ă  un deadlock.

Variantes

Il existe des variantes du verrou tournant visant Ă  le rendre plus efficace :

  • Le verrou tournant lecture/Ă©criture qui est formĂ© de 2 verrous : un pour la lecture et l'autre pour l'Ă©criture. L'amĂ©lioration vient du fait que le verrou de lecture bloque seulement les accès en Ă©criture et non les tentatives de lectures.
  • Le verrou sĂ©quentiel.

Exemple

 TestAndSet(*s, v) {
   s<-v
   return prev(s)
 } //Instruction Atomique (ie non interruptible)
 init(s) {
   TestAndSet(&s,1)
 }
 wait(s) {
   while(TestAndSet(&s,1))
   {
     //Attente active
   }
 }
 signal(s) {
   TestAndSet(&s,0)
 }

Références

  1. (en) Maurice Herlihy, Nir Shavit, Victor Luchangco et Michael Spear, The art of multiprocessor programming, Morgan Kaufmann, 2e Ă©d. (ISBN 978-0-12-415950-1), p. 147
Cet article est issu de wikipedia. Text licence: CC BY-SA 4.0, Des conditions supplémentaires peuvent s’appliquer aux fichiers multimédias.