Spinlock
Da Wikipedia, l'enciclopedia libera.
In informatica uno spinlock o anche spinning è una tecnica di programmazione che utilizza un ciclo di attesa attiva (busy waiting) per implementare la routine di attesa un lock. La tecnica consiste nel verificare periodicamente se il lock è stato sbloccato, effettuando un test che può aver luogo ad intervalli di tempo prestabiliti, oppure nel tempo più breve possibile consentito dal sistema.
[modifica] Pro e contro
L'implementazione di uno spinlock può aver luogo interamente nel contesto del task attivo, senza bisogno di chiamare funzioni del sistema operativo o dell'ambiente runtime; utile nei sistemi a multiprocessore in cui il cambio di contesto risulta molto più oneroso (in termini temporali). Il principale inconveniente è l'enorme spreco di tempo computazionale che può essere contrastato solo a costo di un prolungamento degli intervalli di verifica, prolungando in tal modo anche l'attesa media dei thread o processi che concorrono per il lock.
[modifica] Alternative
Quasi tutti i moderni sistemi operativi offrono un'interfaccia apposta per l'implementazione dei lock come parte dell'API. Le funzioni native del sistema operativo sono assai più efficienti degli spinlock e non presentano i problemi di sincronia inerenti a questi, perché utilizzano direttamente il sistema di monitoraggio dello scheduler. Gli ambienti runtime dei linguaggi di programmazione ad alto livello implementano i lock attraverso le apposite funzioni del sistema operativo.
[modifica] Applicazioni pratiche
L'uso di spinlock può essere necessario quando l'ambiente runtime non offre un'interfaccia adatta alla sincronizzazione per mezzo dei lock. È questo il caso di alcuni sistemi operativi real-time che non dispongono di uno scheduler adatto al multitasking. Sulle piattaforme multiprocessore, dove la comunicazione fra thread in esecuzione su processori diversi può durare centinaia o migliaia di cicli di clock, è anche comune l'uso ibrido di spinlock a scadenza, che se non vengono interrotti entro un periodo di tempo limitato o entro un numero prestabilito di iterazioni decadono delegando l'attesa ad un monitor vero e proprio.