2009-12-24 12 views
65

Mi sono sempre chiesto che cosa sono: ogni volta che sento su di loro, le immagini di dispositivi a volano-like futuristici andare a ballare (? Rotolamento) attraverso la mia mente ...Cosa sono esattamente i "spin-lock"?

Che cosa sono?

risposta

82

Quando si utilizzano i blocchi regolari (mutex, sezioni critiche ecc.), Il sistema operativo inserisce il thread nello stato WAIT e preempts programmando altri thread sullo stesso core. Questo comporta una penalizzazione delle prestazioni se il tempo di attesa è molto breve, poiché il thread deve attendere il preemption per ricevere nuovamente il tempo della CPU.

Inoltre, oggetti del kernel non sono disponibili in ogni stato del kernel, ad esempio in un gestore di interrupt o quando il paging non è disponibile ecc

spinlocks non causano prelazione, ma aspettare in un ciclo ("spin ") finché l'altro core non rilascia il blocco. Ciò impedisce al thread di perdere il suo quantum e continuare non appena il blocco viene rilasciato. Il semplice meccanismo degli spinlock consente a un kernel di utilizzarlo praticamente in qualsiasi stato.

Ecco perché su una macchina single core uno spinlock è semplicemente un "disable interrupts" o "raise IRQL" che impedisce completamente la schedulazione dei thread.

Gli spinlock in definitiva consentono ai kernel di evitare "Big Kernel Lock" (un blocco acquisito quando il core entra nel kernel e rilasciato all'uscita) e hanno un blocco granulare su primitive del kernel, causando una migliore multielaborazione su macchine multi-core quindi meglio prestazione.

EDIT: Una domanda è venuta: "Significa che dovrei usare gli spinlock ovunque possibile?"e proverò a rispondere:

Come ho già detto gli Spinlock sono utili solo in luoghi in cui il tempo di attesa anticipato è più breve di un quanto (leggi: millisecondi) e la prerogativa non ha molto senso (ad es. 'disponibile)

Se il tempo di attesa non è noto o se si è in modalità utente Gli spinlock non sono efficienti. Si consuma il 100% del tempo di CPU sul nucleo in attesa mentre si controlla se è disponibile uno spinlock. thread da esecuzione su quel core fino alla scadenza del quantum.Questo scenario è possibile solo per brevi burst a livello kernel e improbabile un'opzione per un'applicazione in modalità utente

Ecco una domanda a SO addres cantare quella: Spinlocks, How Useful Are They?

+0

vuol dire che dovrei girare i blocchi (invece di mutex, sezione critica ecc.) Dove possibile? –

+0

Hai risposto anche alla tua domanda. –

+0

qualcuno mi corregga se ho torto, ma uno spinlock non disabilita la prelazione (cioè la riprogrammazione). per la semplice ragione che, se lo spinlock è in attesa di una risorsa bloccata da un altro processo, a quel secondo processo deve essere data la possibilità di eseguire e liberare la risorsa. oppure, l'esecuzione del secondo processo richiede l'interruzione del primo processo (di rotazione). – user1284631

0

È un ciclo che gira intorno finché non viene soddisfatta una condizione.

6
while(something != TRUE){}; 
// it happend 
move_on(); 
15

Si tratta pertty tanto un ciclo che continua a andare fino a una certa condizione è soddisfatta:

while(cantGoOn) {}; 
+0

E/o mentre (cantGoOn) {sleep (0)}; – Jiminion

10

Di 'una risorsa è protetto da una serratura, un filo che vuole l'accesso alla risorsa bisogno di acquisire prima il lucchetto. Se il blocco non è disponibile, il thread potrebbe controllare ripetutamente se il blocco è stato liberato. Durante questo tempo il thread occupato attende, controllando il blocco, usando la CPU, ma non sta facendo alcun lavoro utile. Tale blocco è definito come spin lock.

+0

Bella risposta! +1 –

3

Gli SpinLock sono quelli in cui il thread attende fino a quando il blocco è disponibile. Questo sarà normalmente usato per evitare il sovraccarico di ottenere gli oggetti del kernel quando c'è un ambito di acquisizione dell'oggetto kernel entro un breve periodo di tempo.

Es:

While(SpinCount-- && Kernel Object is not free) 
{} 

try acquiring Kernel object 
1

In poche parole, spinlock impiega atomica confronto e di scambio (CAS) o il test-and-set come istruzioni per realizzare serratura libera, attendere filo libera linguaggio sicura. Tali strutture si adattano bene alle macchine multi-core.

+0

Per definizione, uno spinlock non viene utilizzato per implementare nulla senza bloccare o attendere gratuitamente. – rdb

0

Beh, sì: il punto di rotazione dei blocchi (rispetto a sezioni critiche tradizionali, ecc.) È che offrono prestazioni migliori in alcune circostanze (sistemi multicore ..), perché non producono immediatamente il resto del thread quantistica.

+0

Buon punto, ma questo non fornisce una spiegazione generale. – RCIX

4

Si tratta di un tipo di blocco che fa busy waiting

E 'considerato un anti-modello, tranne che per molto a basso livello di programmazione driver (dove può capitare che si chiama un "proprio" la funzione di attesa ha più in alto del semplice blocco occupato per alcuni cicli).

Vedere ad esempio Spinlocks in Linux kernel.

3

Si consiglia di utilizzare uno spinlock quando si ritiene che sia meno costoso immettere un ciclo di attesa occupato e raggruppare una risorsa anziché bloccare quando la risorsa è bloccata.

filatura può essere utile quando serrature sono a grana fine e grande numero (ad esempio, un blocco per nodo in una lista collegata) e quando i tempi di attesa di blocco sono sempre estremamente breve. In generale, mentre si tiene uno spin lock, si dovrebbe evitare il blocco, chiamando tutto ciò che può bloccare, tenendo più di uno spin lock in una volta, facendo chiamate inviate dinamicamente (interfaccia e virtuals), facendo chiamate spedite staticamente in qualsiasi codice non si fa possedere o allocare memoria

È anche importante notare che SpinLock è un tipo di valore, per motivi di prestazioni. Pertanto, si deve fare molta attenzione a non copiare accidentalmente un'istanza SpinLock, poiché le due istanze (l'originale e la copia) sarebbero completamente indipendenti l'una dall'altra, il che probabilmente porterebbe a un comportamento errato dell'applicazione. Se un'istanza SpinLock deve essere passata, deve essere passata per riferimento anziché per valore.

0

Spinlock, è un tipo di blocco, non bloccabile, & non-bloccabile. Qualsiasi thread che desideri acquisire uno spinlock per qualsiasi risorsa condivisa o critica girerà continuamente, sprecando il ciclo di elaborazione della CPU fino a quando non acquisirà il blocco per la risorsa specificata. Una volta acquisito lo spinlock, tenta di completare il lavoro nel suo quantum e quindi rilasciare la risorsa rispettivamente. Lo spinlock è il tipo di blocco con la priorità più alta, è sufficiente dire che è un tipo di blocco non preventivo.