In che modo lo spinlock è diverso dal polling?

40

Lo spinlock e il polling sono la stessa cosa?

Wikipedia:

a spinlock is a lock which causes a thread trying to acquire it to simply wait in a loop ("spin") while repeatedly checking if the lock is available

Sembra molto simile a:

while(!ready);

Mi è stato insegnato a evitare il polling quando possibile poiché era completamente sub-ottimale. Quindi, lo spinlock è un nome di fantasia per i vecchi sondaggi? In che modo uno spinlock è diverso dal polling?

    
posta Lord Loh. 06.11.2015 - 19:18
fonte

5 risposte

83

Polling si riferisce a controllare ripetutamente se una risorsa ( qualsiasi tipo di risorsa ) è pronta.

Uno spinlock si ha quando la risorsa che stai interrogando è un blocco.

Nota che il polling è non cattivo. In particolare, il polling è efficiente quando di solito i dati sono pronti quando si esegue il polling. Il polling è solo inefficiente se lo fai senza ricevere in cambio alcun dato.

D'altra parte, gli interrupt sono inefficienti se ci sono così tanti dati che vengono costantemente interrotti. Sono efficienti se i dati arrivano abbastanza raramente da poter effettivamente svolgere un lavoro utile prima di essere interrotti.

Posso darti un esempio di vita reale dalla mia esperienza personale: 15 anni fa, avevo il mio programma di posta elettronica impostato per interrompermi ogni volta che arriva una nuova email. Che accadeva una o due volte alla settimana. Controllare costantemente la mia casella di posta sarebbe stata una colossale perdita di tempo.

Al giorno d'oggi, ho tutte le notifiche disattivate. conosco che ogni volta che guardo nella mia casella di posta elettronica, ci saranno nuove e-mail. Il polling ora è molto più efficiente.

Gli spinlock sono efficienti quando a) la probabilità che il blocco venga preso è bassa, e b) se il blocco viene preso, sarà trattenuto solo per un breve periodo. In altre parole: è efficiente per serrature a grana fine per lo più incontrollate, ma inefficiente per serrature a grana grossa molto contese.

(E, naturalmente, gli spinlock funzionano solo quando esiste il vero parallelismo, altrimenti l'altro thread non avrà la possibilità di rilasciare il blocco. Immagino che sia ovvio, ma volevo farlo comunque).

    
risposta data 06.11.2015 - 19:37
fonte
10

Uno spinlock è un tipo di blocco, in particolare, uno ottenuto tramite polling.

Il polling è un metodo per controllare lo stato di qualcosa (chiedendo lo stato, invece di aspettare che venga detto lo stato).

Non tutto il polling è uno spinlock, ad esempio, il polling dello stato dei tasti della tastiera.

Inoltre, il polling non è intrinsecamente cattivo. Molto brevi periodi di polling possono evitare costosi cambiamenti di contesto che richiederebbero l'uso di interrupt, per non parlare del fatto che il polling a volte può essere più semplice da implementare e quindi più facile da mantenere, specialmente a livelli inferiori. Come al solito, gli assoluti sono una cosa terribile, e dovresti usare il metodo che offre il giusto compromesso tra prestazioni e complessità per le tue esigenze come li hai misurati , piuttosto che usare ciecamente o scartare le opzioni.

    
risposta data 06.11.2015 - 19:39
fonte
5

Lo spinlock è diverso dal polling perché si verifica solo per un periodo di tempo molto breve, nell'ordine di pochi millisecondi o meno. Il polling può continuare all'infinito.

Nella programmazione parallela, un episodio di breve di spinning è spesso preferibile al blocco, in quanto evita il costo del cambio di contesto e delle transizioni del kernel.

Ulteriori letture
SpinLock e SpinWait in C #
Spinlock e blocchi di lettura-scrittura in C

    
risposta data 06.11.2015 - 19:26
fonte
4

La differenza è che uno spinlock è (si spera) usato solo in situazioni in cui è appropriato, e in queste situazioni è molto efficiente.

Si utilizza uno spinlock se si prevede che una risorsa verrà bloccata solo per un tempo molto breve, ad esempio se un blocco viene utilizzato solo per aggiornare una variabile. Lo spinlock interroga il blocco alla massima velocità, ma si spera per meno di microsecondi. Un mutex normale richiederebbe la chiamata del sistema operativo. SE il blocco viene mantenuto per un breve periodo di tempo, quindi lo spinlock utilizza solo una piccola quantità di tempo CPU, mentre la chiamata del sistema operativo richiederà più tempo. Ma se questa aspettativa è sbagliata, allora lo spinlock è molto inefficiente - userà il tempo di CPU del 100% su una CPU, mentre il mutex normale impiega solo del tempo per entrare nel sistema operativo e ritornare.

A volte entrambi sono combinati; si esegue lo spin lock per un breve periodo e si passa a una strategia diversa se lo spinlock non funziona.

    
risposta data 08.11.2015 - 23:33
fonte
2

Il polling eccessivo è qualcosa che non dovresti fare perché spreca risorse di sistema. Ne consegue che il polling va bene se non spreca risorse di sistema .

Ad esempio il polling eccessivo porta il carico della CPU al 100% nei casi in cui il lavoro effettivo comporterebbe solo un carico del 2%.

Il polling può essere usato per cose diverse da while(!ready) . Ad esempio significa controllare regolarmente se l'utente ha premuto un tasto. Un'implementazione sana controllerà al massimo una volta ogni 15 millisecondi, quindi è un controllo ogni ~ 20 milioni di cicli di clock. Quel tipo di sondaggio è ottimo, perché non spreca risorse di sistema.

Un SpinLock è non un caso speciale. Se abbiamo uno SpinLock e un thread entra nel blocco, e un altro deve attendere, SpinLock è la scelta sbagliata se e solo se il thread in attesa spreca risorse di sistema. Il thread in attesa sprecherà risorse di sistema se e solo se deve attendere un periodo di tempo significativo prima di poter acquisire il blocco.

Quindi, usare uno SpinLock per proteggere qualcosa che richiede un paio di migliaia di cicli di clock o più prima che si sblocchi nuovamente (ad esempio compilando ed eseguendo un pezzo di javascript al volo) è sbagliato, esattamente per la ragione che hai affermato. Ma usando uno SpinLock per proteggere qualcosa che si completa rapidamente, come l'accesso a una mappa hash correttamente implementata va bene perché il thread in attesa girerà solo 2 o 3 volte e quindi non spreca risorse di sistema.

    
risposta data 08.11.2015 - 18:53
fonte

Leggi altre domande sui tag