Was sind die grundlegenden Unterschiede zwischen Spinlocks und Semaphoren in Aktion?
Akzeptierte Antwort:
Beide verwalten eine begrenzte Ressource. Ich werde zuerst den Unterschied zwischen binärem Semaphor (Mutex) und Spinlock beschreiben.
Spin Locks führen ein Busy Wait durch – d.h. es läuft weiter loop:
while (try_acquire_resource ());
...
release();
Es führt ein sehr leichtes Sperren/Entsperren durch, aber wenn der sperrende Thread von einem anderen, der versucht, auf dieselbe Ressource zuzugreifen, unterbrochen wird, wird der zweite einfach versuchen, Ressourcen zu erwerben, bis ihm die CPU-Quanten ausgehen.
Andererseits verhalten sich Mutex eher wie:
if (!try_lock()) {
add_to_waiting_queue ();
wait();
}
...
process *p = get_next_process_from_waiting_queue ();
p->wakeUp ();
Wenn der Thread daher versucht, blockierte Ressourcen zu erwerben, wird er ausgesetzt, bis er dafür verfügbar ist. Das Sperren/Entsperren ist viel schwerer, aber das Warten ist „kostenlos“ und „fair“.
Semaphore ist eine Sperre, die mehrfach (bekannt aus der Initialisierung) verwendet werden darf – zum Beispiel dürfen 3 Threads gleichzeitig die Ressource halten, aber nicht mehr. Es wird zum Beispiel bei Producer/Consumer-Problemen oder allgemein in Queues verwendet:
P(resources_sem)
resource = resources.pop()
...
resources.push(resources)
V(resources_sem)