Quali sono le differenze di base tra spin lock e semafori in azione?
Quali sono le differenze di base tra spin lock e semafori in azione?
Risposte:
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)
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.
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