Quali sono le differenze fondamentali tra spin lock e semafori in azione?
Risposta accettata:
Entrambi gestiscono una risorsa limitata. Descriverò prima la differenza tra semaforo binario (mutex) e blocco dello spin.
Gli spin lock eseguono un'attesa intensa, ovvero continua a funzionare in loop:
while (try_acquire_resource ());
...
release();
Esegue un blocco/sblocco molto leggero, ma se il thread di blocco verrà anticipato da altri che proveranno ad accedere alla stessa risorsa, il secondo proverà semplicemente ad acquisire la risorsa fino a quando non esaurirà i suoi quanti di 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 ();
Quindi, se il thread tenterà di acquisire una risorsa bloccata, verrà sospeso fino a quando non sarà disponibile per esso. Il blocco/sblocco è molto più pesante, ma l'attesa è "gratuita" e "equa".
Il semaforo è un blocco che può essere utilizzato più volte (conosciuto dall'inizializzazione), ad esempio 3 thread possono contenere contemporaneamente la risorsa 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)