2016-06-30 12 views
6

Si prega di spiegare perché Occupato in attesa è generalmente disapprovato mentre Spinning è spesso visto come ok. Per quello che posso dire, entrambi procedono all'infinito finché non viene soddisfatta una condizione.Spinlock vs Occupato attendere

+1

Penso che in uno spinlock in realtà tu faccia altre cose oltre all'attesa del suo rilascio ... –

+2

Non spinlock a meno che tu non abbia una buona garanzia che puoi acquisire il blocco in un microsecondo o meno. Se impiega più tempo, si trasforma in busy-waiting e in bug. –

+1

un blocco che utilizza l'attesa è chiamato uno spinlock - * Sistema operativo moderno * – walkerlala

risposta

3

A spin-lock viene in genere utilizzato quando la contesa è bassa per la risorsa e pertanto la CPU effettuerà solo poche iterazioni prima di poter proseguire con il lavoro produttivo. Tuttavia, le implementazioni di libreria della funzionalità di blocco spesso utilizzano un blocco di selezione seguito da un blocco regolare. Il blocco regolare viene utilizzato se la risorsa non può essere acquisita in un intervallo di tempo ragionevole. Questo viene fatto per ridurre il sovraccarico con i commutatori di contesto nelle impostazioni in cui i blocchi vengono in genere ottenuti rapidamente.

Il termine busy-waiting tende a significare che si è disposti a girare e attendere una modifica in un registro hardware o in una posizione di memoria. Il termine non significa necessariamente blocco, ma implica l'attesa in un ciclo stretto, ripetutamente cercando un cambiamento.

È possibile utilizzare l'attesa di occupato per rilevare alcuni tipi di cambiamenti nell'ambiente a cui si desidera rispondere immediatamente. Quindi uno spin-lock è implementato usando busy-waiting. L'attesa attesa è utile in qualsiasi situazione in cui una risposta di latenza molto bassa è più importante dello spreco di cicli della CPU (come in alcuni tipi di programmazione incorporata).

collegate a questo sono i termini «senza blocchi» e «l'ora zero»:

cosiddetto senza blocchi algoritmi tendono ad utilizzare stretto busy-attesa con un'istruzione CAS, ma la contesa è in situazioni ordinarie così basse che la CPU di solito deve iterare solo poche volte.

cosiddetti senza attesa algoritmi non fanno alcun busy-in attesa a tutti.

(Si prega di notare che «senza blocchi» e «l'ora zero» è utilizzato in modo leggermente diverso in contesti accademici, vedi l'articolo di Wikipedia su Non-blocking algorithms.)

+0

+1 in generale, ma un po 'di nitpicking: il classico pattern CAS (read-CAS-var-calcola-new-value-try-CAS-if-failed-risciacquo-e-ripeti) non si qualifica realmente come occupato- in attesa (non stiamo davvero aspettando una variabile esterna _to_change_ - che può richiedere un po 'di tempo mentre, ma piuttosto stiamo aspettando che il var sia stabile dall'interferenza esterna - che in pratica non richiede mai più di 2-3 iterazioni); ancora - tali modelli CAS non si qualificano come "senza attese" :-(. –

-2

quando si capisce il motivo preciso per una regola e hanno dettagliato Conoscenza della piattaforma e dell'applicazione, sai quando è opportuno violare quella regola. Gli spinlock sono implementati da esperti che hanno una comprensione completa della piattaforma su cui si stanno sviluppando e delle applicazioni previste per gli spinlock.

I problemi di attesa sono numerosi, ma su molte piattaforme ci sono soluzioni per loro. I problemi includono:

  1. Per le CPU con hyper-threading, un thread in attesa attenta può far morire di fame un altro thread nello stesso core fisico, anche il thread che sta aspettando.
  2. Quando sei impegnato ad aspettare, quando finalmente ottieni la risorsa che stai aspettando, prendi la madre di tutti i rami imprevedibili.
  3. L'attesa occupata interferisce con il risparmio di energia della CPU.
  4. L'attesa eccessiva può saturare i bus inter-core poiché la cosa che si continua a controllare causa il traffico di sincronizzazione della cache.

Ma le persone che progettano gli spinlock capiscono tutti questi problemi e sanno esattamente come mitigarli sulla piattaforma.Non scrivono codice naive, scrivono codice di rotazione intelligente.

Quindi sì, entrambi passano all'infinito fino a quando non viene soddisfatta una condizione, ma eseguono il ciclo in modo diverso.