Was ist der Unterschied zwischen Spin-Locks und Semaphoren?


15

Was sind die grundlegenden Unterschiede zwischen Spin-Locks und Semaphoren in Aktion?



@ Gilles Ich habe mir das auch angeschaut, aber die einzige Erwähnung von Semaphoren auf der Seite ist Warren, der kommentiert: "Wenn man den Unterschied zwischen einer Drehsperre und beispielsweise einem Semaphor wissen will, ist das eine andere Frage."
Michael Mrozek

@Michael: ok, ich denke, die Antworten haben den Hauptpunkt angesprochen, aber du hast recht, dass keiner explizit angegeben hat, dass Semaphore eine der anderen Arten von Sperren sind.
Gilles 'SO- hör auf böse zu sein'

Erklärung von Linus Torvalds: yarchive.net/comp/linux/semaphores.html
myaut

Antworten:


13

Beide verwalten eine begrenzte Ressource. Ich werde zuerst den Unterschied zwischen binärem Semaphor (Mutex) und Spin Lock beschreiben.

Spin-Locks führen eine ausgelastete Wartezeit aus - dh es wird weiterhin eine Schleife ausgeführt:

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

Es führt ein sehr leichtes Sperren / Entsperren durch, aber wenn der Sperr-Thread von einem anderen vorbelegt wird, der versucht, auf dieselbe Ressource zuzugreifen, versucht der zweite einfach, Ressourcen zu beschaffen, bis ihm die CPU-Quanten ausgehen.

Andererseits verhält 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 versucht, gesperrte Ressourcen zu erhalten, wird er ausgesetzt, bis er für ihn verfügbar ist. Das Sperren / Entsperren ist viel schwerer, aber das Warten ist "kostenlos" und "fair".

Semaphore ist eine Sperre, die mehrfach (aus der Initialisierung bekannt) verwendet werden darf - zum Beispiel dürfen 3 Threads gleichzeitig die Ressource halten, aber nicht mehr. Es wird zum Beispiel in Erzeuger- / Verbraucherproblemen oder allgemein in Warteschlangen verwendet:

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

Gute Erklärung, ich möchte nur einen Punkt hervorheben. Semaphore vs Mutex ist eine Frage der Schnittstelle: Ein Mutex wird gehalten oder nicht, während ein Semaphor von bis zu N Threads gehalten wird. Ein Mutex ist ein Sonderfall von Semaphoren mit N = 1. Spinlock im Vergleich zu einer anderen Art von Sperre ist eine Frage der Implementierung: Ein Spinlock versucht immer wieder, die Sperre zu erwerben, während andere Arten auf eine Benachrichtigung warten. In einem Linux-Kernel-Kontext verfügt die einzige Sperre mit einer Spin-Implementierung über eine Mutex-Schnittstelle.
Gilles 'SO- hör auf böse zu sein'

In einem Linux-Kernel-Kontext verfügt die einzige Sperre mit einer Spin-Implementierung über eine Mutex-Schnittstelle. Ich verstehe diese Zeile nicht. Könnten Sie es bitte erweitern?
Sen

@Sen: Er meinte, dass sich Spin Lock in Linux binär verhält (es ist gesperrt oder nicht). Es ist möglich, eine Drehsperre zu haben, die sich wie eine Semaphor verhält.
Maciej Piechotka

"Aber wenn der Sperr-Thread von einem anderen vorbelegt wird, der versucht, auf dieselbe Ressource zuzugreifen, wird der zweite einfach versuchen, Ressourcen zu beschaffen, bis die CPU nicht mehr ausreicht.": Ein Problem bleibt jedoch auch bei Mutex. Was ist, wenn eine Aufgabe mit höherer Priorität auf die Ressource zugreifen muss? Steht sie nur in der Warteschlange? Vielleicht ist es besser, die gemeinsame Nutzung von Ressourcen zwischen Aufgaben mit unterschiedlichen Prioritäten aufzuheben.
Hibou57

@ Hibou57: Ja, es ist blockiert, da der Status nicht konsistent ist und die Verwendung der Ressource 'witzige' Auswirkungen hätte (der Thread mit niedriger Priorität war gerade dabei, der verknüpften Liste etwas hinzuzufügen oder daraus zu entfernen). Der Sinn dieser Anweisung war, dass ein blockierter Thread nicht geplant ist, sodass er keine Ressourcen verbraucht, während der Thread auf spinlock wartet. Das Sperren für Echtzeitsysteme (besonders schwer) ist ein anderes Thema, und ich habe nicht genügend Kenntnisse, um darauf zu antworten. Allerdings implementieren diese Systeme manchmal Prioritätsspenden oder andere Techniken.
Maciej Piechotka

2

Spinlocks werden in einem Interrupt-Kontext verwendet, in dem das Schlafen nicht erlaubt ist. Sie rufen in einer engen Schleife ab und tun nichts anderes, bis die Ressource beschafft ist. Wird hauptsächlich in ISRs verwendet und ist sicherer und effizienter.

Semaphore können in einem Prozesskontext verwendet werden, in dem das Schlafen in Ordnung ist.


1

Hier ist meine kurze Antwort: Eine Drehsperre und ein binäres Semaphor (das eine Ressource verwaltet, die nur von einer Sache verwendet werden kann) sind fast identisch. Sie unterscheiden sich darin, dass Spin-Locks den auszuführenden Code verwalten, während binäre Semaphore eine Art singuläre Ressource verwalten (z. B. CPU-Zeit, Anzeigeausgabe).

Ein reguläres Semaphor kann jedoch mehrere Threads verwalten, die auf eine Ressource zugreifen, die auf mehrere aufgeteilt werden kann, jedoch begrenzt ist (z. B. Speicher, Netzwerkbandbreite).

Kurz gesagt, ein Spin-Lock fragt wahrscheinlich immer wieder ein Semaphor, ob es eine Ressource verwenden kann. (Stellen Sie sich vor, ein Kind muss auf die Toilette und darauf warten, dass jemand anderes fertig wird.)

Quellen: Einführung in die Systemprogrammierung, Betriebssysteme und Wikipedia

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.