Wat is Spinlock?

Lock waarbij wordt gewacht door in een lus de lockvariabele te blijven controleren tot de lock vrij is. Snel als de wachttijd kort is, maar de CPU blijft ook tijdens het wachten in gebruik.

Japanse benaming: スピンロック

“Spinlock” komt voor in 4 oefenvragen uit 1 onderwerpen, bijv. Multicore en synchronisatie.

Vakgebied: Multicore en synchronisatie

Hoe een spinlock wordt verkregen en vrijgegeven

Een spinlock is een gedeelde variabele, meestal 0 als hij vrij is en 1 als hij bezet is. Om hem te verkrijgen gebruikt een thread een atomaire read-modify-write-instructie zoals test-and-set, swap of compare-and-swap, die de variabele in één ondeelbare stap op 1 zet en de oude waarde teruggeeft; op RISC-V is dat een atomaire swap of een load-reserved/store-conditional-paar. Was de oude waarde 0, dan bezit de thread de lock; anders probeert hij het in een lus opnieuw. Vrijgeven is simpelweg 0 opslaan. Verkrijgen en vrijgeven moeten ook als geheugenbarrière werken, zodat toegangen binnen de kritieke sectie ertussen blijven.

Test-and-test-and-set en cacheverkeer

De atomaire instructie in een strakke lus blijven herhalen presteert slecht op multicorechips. Elke atomaire bewerking heeft exclusief eigendom van de cacheline nodig, dus wachtende cores trekken de line steeds in de modified-toestand (M) en invalideren elkaars kopieën, wat het coherentienetwerk overspoelt. Het patroon test-and-test-and-set wacht in plaats daarvan met gewone loads: elke wachtende core leest zijn eigen gedeelde kopie in zijn cache, wat geen verkeer veroorzaakt, en probeert de atomaire bewerking pas als hij ziet dat de lock vrij komt. Exponentiële backoff en ticket- of wachtrijgebaseerde locks verminderen de contentie verder en voegen eerlijkheid (fairness) toe.

Spinlock vs. mutex

Een slapende mutex zet een wachtende thread in een geblokkeerde toestand en geeft de CPU aan andere threads; het besturingssysteem wekt hem wanneer de lock wordt vrijgegeven. Dat verspilt geen CPU-tijd, maar kost een systeemaanroep, scheduling en een contextswitch, doorgaans enkele microseconden. Een spinlock vermijdt die overhead volledig en wint als de lock maar kort wordt vastgehouden, korter dan een slaap- en wekcyclus zou duren. Bij lange houdtijden slaat de balans om; daarom spinnen veel mutexen in bibliotheken eerst even en gaan ze daarna slapen, zodat de sterke punten van beide worden gecombineerd.

Waar spinlocks passen en waar ze falen

Spinlocks komen veel voor in kernels van besturingssystemen, voor korte kritieke secties op multiprocessors en voor data die wordt gedeeld met interrupthandlers, die niet mogen slapen. Code die een spinlock vasthoudt mag niet slapen, en kernels schakelen tijdens het vasthouden meestal preemption uit, en waar nodig interrupts, zodat een interrupthandler op dezelfde core niet eeuwig blijft spinnen op een lock die zijn eigen core vasthoudt. Op een systeem met één core is een spinlock op gebruikersniveau extra verspillend: de houder kan niet draaien om de lock vrij te geven terwijl de wachtende thread spint, dus die verbruikt zijn hele tijdsslot.

Nu oefenen: vragen over Spinlock

Welke uitleg over een spinlock is juist?

  1. AEen lock waarbij de thread slaapt en door het besturingssysteem wordt gewekt tot de lock vrij is
  2. BEen lock waarbij wordt gewacht door in een lus voortdurend de lockvariabele te controleren tot de lock vrij is
  3. CEen mechanisme waarbij een schijf wordt rondgedraaid om gegevens te beschermen
Antwoord en toelichting tonen

Antwoord: B. Een lock waarbij wordt gewacht door in een lus voortdurend de lockvariabele te controleren tot de lock vrij is

Een spinlock probeert met een atomaire instructie de lock te nemen en probeert het, als dat niet lukt, direct opnieuw. Omdat de moeite van het besturingssysteem aanroepen om te slapen en te ontwaken ontbreekt, werkt het snel wanneer de lock zeer kort wordt vastgehouden. Het wordt veel gebruikt in de kernel van het besturingssysteem en voor uitsluiting met interrupthandlers. Het nadeel is dat tijdens het wachten ook CPU-tijd wordt gebruikt.

In welke situatie is een spinlock het minst geschikt?

  1. AWanneer de lock lang wordt vastgehouden en wachtende threads nodeloos CPU-tijd blijven gebruiken
  2. BWanneer de lock zeer kort, enkele tientallen nanoseconden, wordt vastgehouden
  3. CBij bewerkingen in de kernel van het besturingssysteem die niet mogen slapen
Antwoord en toelichting tonen

Antwoord: A. Wanneer de lock lang wordt vastgehouden en wachtende threads nodeloos CPU-tijd blijven gebruiken

Een thread die bij een spinlock wacht, gebruikt CPU-tijd tot de lock vrij is. Bij een lange vasthoudtijd is al die CPU-tijd verspild en worden ook andere threads gehinderd. Met name als er maar één core is, komt de lock niet vrij zolang de lockhoudende thread niet draait, dus duurt het wachten tot de tijdsindeling is afgelopen. Voor lange wachttijden wordt een slapende mutex gebruikt, en er is ook een methode die een korte tijd draait en dan gaat slapen.

Veelgestelde vragen

Wat is het verschil tussen een spinlock en een mutex?

Een spinlock wacht door in een lus de lockvariabele te controleren en houdt de CPU bezig, wat alleen efficiënt is bij heel korte wachttijden. Een mutex laat de wachtende thread slapen en andere threads draaien, wat beter past bij langere wachttijden maar de kosten van slapen, wekken en contextswitches toevoegt.

Wanneer gebruik je een spinlock?

Gebruik er een als de kritieke sectie heel kort is en threads op verschillende cores draaien, of in kernelcontexten zoals interrupthandlers die niet mogen slapen. Vermijd hem als de lock lang kan worden vastgehouden of op systemen met één core.

Wat is test-and-test-and-set?

Het is een spinlocktechniek waarbij wachtende threads de lock herhaaldelijk met gewone loads uit hun eigen cache lezen en de atomaire test-and-set pas proberen als de lock vrij lijkt. Dat voorkomt voortdurende invalidaties van de cacheline en vermindert het coherentieverkeer sterk.

“Spinlock” in de toelichting

Vragen met “Spinlock” (4)

  1. Welke uitleg over een spinlock is juist?
  2. In welke situatie is een spinlock het minst geschikt?
  3. Waarom wordt bij een spinlock niet meteen met een atomaire instructie de lockvariabele proberen te wijzigen, maar wordt normaal met gewoon lezen gewacht tot de lock vrij lijkt en dan pas een atomaire instructie gebruikt (test-and-test-and-set)?
  4. Welke vergelijking van een mutex (slapende lock) en een spinlock is juist?

Vergelijkingen met deze term

Verwante termen

CPU-tijd Atomaire instructie Mutex ABA-probleem Acquire-release Barrièresynchronisatie Compare-and-swap Conditievariabele Data race Deadlock

Naar de woordenlijst