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.