qual'è la differenza tra spin lock e semafori?


15

Quali sono le differenze di base tra spin lock e semafori in azione?



@Gilles Ho anche guardato quello, ma l'unica menzione di semafori sulla pagina è Warren che commenta che "Se si vuole sapere la differenza tra un blocco di spin e, diciamo, un semaforo, questa è una domanda diversa".
— Michael Mrozek

@Michael: ok, penso che le risposte siano state indirizzate al punto principale, ma hai ragione nel dire che nessuno ha dichiarato esplicitamente che i semafori erano uno degli altri tipi di lucchetti.
— Gilles 'SO- smetti di essere malvagio' il

Spiegazione di Linus Torvalds: yarchive.net/comp/linux/semaphores.html
— myaut

Duplicato di stackoverflow.com/questions/195853/spinlock-versus-semaphore Nel thread che ho chiesto sono presenti molte buone spiegazioni.
— iankits,

Risposte:


13

Entrambi gestiscono una risorsa limitata. Descriverò innanzitutto la differenza tra semaforo binario (mutex) e spin lock.

I blocchi di spin eseguono un'attesa di occupato, ovvero continuano a funzionare in loop:

while (try_acquire_resource ());
...
release();

Esegue funzioni di blocco / sblocco molto leggere, ma se il thread di blocco sarà impedito da altri che proveranno ad accedere alla stessa risorsa, il secondo tenterà semplicemente di acquisire risorse fino a quando non si esauriscono i quanti CPU.

D'altra parte il mutex si comporta più come:

if (!try_lock()) {
    add_to_waiting_queue ();
    wait();
}
...
process *p = get_next_process_from_waiting_queue ();
p->wakeUp ();   

Pertanto, se il thread tenterà di acquisire risorse bloccate, verrà sospeso fino a quando non sarà disponibile. Il blocco / sblocco è molto più pesante, ma l'attesa è "libera" e "corretta".

Semaphore è un blocco che può essere utilizzato più volte (noto dall'inizializzazione) più volte - ad esempio, 3 thread possono contenere la risorsa contemporaneamente, ma non di più. Viene utilizzato ad esempio nel problema produttore / consumatore o in generale nelle code:

P(resources_sem)
resource = resources.pop()
...
resources.push(resources)
V(resources_sem)

Buona spiegazione, voglio solo sottolineare un punto. Semaphore vs mutex è una questione di interfaccia: un mutex è tenuto o meno, mentre un semaforo è tenuto da un massimo di N thread; un mutex è un caso speciale di semafori con N = 1. Spinlock vs altri tipi di blocco è una questione di implementazione: uno spinlock continua a cercare di acquisire il blocco, mentre altri tipi attendono una notifica. In un contesto del kernel Linux, l'unico blocco con un'implementazione di spin ha un'interfaccia mutex.
— Gilles 'SO- smetti di essere malvagio' il

In un contesto del kernel Linux, l'unico blocco con un'implementazione di spin ha un'interfaccia mutex. Non capisco questa linea. Potresti per favore espanderci?
— Sen

@Sen: intendeva che il blocco degli spin in Linux si comportava in modo binario (è bloccato o no). È possibile avere un blocco rotante che si comporta come una semafora.
— Maciej Piechotka,

"Ma se il thread di blocco sarà impedito da altri che proveranno ad accedere alla stessa risorsa, il secondo tenterà semplicemente di acquisire risorse fino a quando non si esauriranno i suoi quanti CPU.": Ma rimane ancora un problema con Mutex. Cosa succede se un'attività con più priorità deve accedere alla risorsa ... è solo in coda? Potrebbe essere meglio annullare la condivisione delle risorse tra attività con priorità diverse.
— Hibou57,

@ Hibou57: Sì, è bloccato poiché lo stato non è coerente e l'utilizzo della risorsa avrebbe effetti "divertenti" (dire che il thread a bassa priorità era nel mezzo dell'aggiunta o della rimozione di qualcosa da / dall'elenco collegato). Il punto di questa affermazione era che se il thread è bloccato non è pianificato, quindi non consuma risorse mentre lo fa il thread in attesa su spinlock. Il blocco per sistemi in tempo reale (soprattutto difficile) è un argomento diverso e non ho sufficienti conoscenze per rispondere, tuttavia a volte tali sistemi implementano donazioni prioritarie o altre tecniche.
— Maciej Piechotka,

2

Gli spinlock vengono utilizzati in un contesto di interrupt, in cui non è consentito dormire. Eseguono il polling in un circuito ristretto, non facendo altro fino a quando la risorsa non viene acquisita. Utilizzato principalmente negli ISR ​​e più sicuro ed efficiente.

I semafori possono essere utilizzati in un contesto di processo, in cui dormire è ok.


1

Ecco la mia rapida risposta a una risposta: uno spin lock e un semaforo binario (che gestisce una risorsa che può essere utilizzata solo da una cosa) sono quasi identici. La loro distinzione è che gli spin lock gestiscono l'esecuzione del codice mentre i semafori binari gestiscono un qualche tipo di risorsa singolare (es. Tempo della CPU, output di visualizzazione)

Un semaforo regolare, tuttavia, è in grado di gestire diversi thread accedendo a una risorsa che può essere suddivisa tra più, ma è limitata (ad es. Memoria, larghezza di banda della rete)

In breve, è probabile che uno spin-lock continui a chiedere a un semaforo se può usare una risorsa. (Immagina che un bambino debba usare il bagno e aspettare che qualcun altro finisca.)

Fonti: Introduzione alla programmazione di sistemi, sistemi operativi e wikipedia

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.