Spinlock

In der Softwaretechnik ist ein spinlock ein Schloss, wo der Faden einfach in einer Schleife ("Drehungen") wartet, die wiederholt überprüfen, bis das Schloss verfügbar wird. Da der Faden aktiv bleibt, aber keine nützliche Aufgabe durchführt, ist der Gebrauch solch eines Schlosses eine Art beschäftigt wartend. Einmal erworben wird spinlocks gewöhnlich gehalten, bis sie ausführlich veröffentlicht werden, obwohl in einigen Durchführungen sie automatisch veröffentlicht werden können, wenn der Faden, der (das wird bedient, was das Schloss hält) Blöcke, oder "schlafen" geht".

Spinlocks sind effizient, wenn Fäden nur wahrscheinlich seit einer kurzen Periode blockiert werden, weil sie oben von der Betriebssystemprozess-Umterminierung oder Zusammenhang-Schaltung vermeiden. Deshalb werden spinlocks häufig innerhalb von Betriebssystemkernen verwendet. Jedoch werden spinlocks verschwenderisch, wenn gehalten, für längere Dauern, andere Fäden davon abhaltend, Umterminierung zu führen und zu verlangen. Je länger ein Schloss durch einen Faden gehalten wird, desto größer die Gefahr, dass es durch den OS Planer unterbrochen wird, während man das Schloss halten wird. Wenn das geschieht, werden andere Fäden verlassen "spinnend" (wiederholt versuchend, das Schloss zu erwerben), während der Faden, der das Schloss hält, Fortschritte zur Ausgabe davon nicht macht. Das Ergebnis ist eine unbestimmte Vertagung bis zum Faden, der meint, dass das Schloss beenden und es veröffentlichen kann. Das ist auf einem System des einzelnen Verarbeiters besonders wahr, wo jeder wartende Faden von demselben Vorrang wahrscheinlich sein Quant vergeuden wird (zugeteilte Zeit, wohin ein Faden laufen kann), bis zum Faden spinnend, der meint, dass das Schloss schließlich beendet wird.

Das Einführen von Drehungsschlössern ist richtig schwierig, weil man die Möglichkeit des Parallelzugriffs zum Schloss in Betracht ziehen muss, um Rasse-Bedingungen zu verhindern. Allgemein ist das nur mit speziellen Zusammenbau-Sprachinstruktionen wie Atomoperationen des Tests-Und-Satzes möglich, und kann auf Programmiersprachen auf höchster Ebene oder jenen Sprachen nicht leicht durchgeführt werden, die aufrichtig atomare Operationen nicht unterstützen. Auf Architekturen ohne solche Operationen, oder wenn Durchführung der höheren Programmiersprache erforderlich ist, kann ein sich schließen lassender Nichtatomalgorithmus, z.B der Algorithmus von Peterson verwendet werden. Aber bemerken Sie, dass solch eine Durchführung mehr Gedächtnis verlangen kann als ein spinlock, langsamer ist, um Fortschritt nach dem Aufschließen zu erlauben, und implementable auf einer höheren Programmiersprache nicht sein kann, wenn in Unordnung Ausführung erlaubt wird.

Beispiel-Durchführung

Das folgende Beispiel verwendet x86 Zusammenbau-Sprache, um einen spinlock durchzuführen. Es wird an jedem Intel 80386 vereinbarer Verarbeiter arbeiten.

Syntax von Intel

Schloss:; Die Schloss-Variable. 1 = geschlossen, 0 = aufgeschlossen.

dd 0

spin_lock:

mov eax, 1; Setzen Sie das EAX-Register auf 1.

xchg eax, [Schloss]; Tauschen Sie atomar das EAX-Register mit

; die Schloss-Variable.

; Das wird immer 1 zum Schloss versorgen, abreisend

; vorheriger Wert im EAX-Register.

prüfen Sie eax, eax; Prüfen Sie EAX mit sich. Unter anderem, dieser wird

; setzen Sie die Nullfahne des Verarbeiters, wenn EAX 0 ist.

; Wenn EAX 0 ist, dann wurde das Schloss aufgeschlossen und

; wir haben es gerade geschlossen.

; Sonst ist EAX 1, und wir haben das Schloss nicht erworben.

jnz spin_lock; Sprung zurück zur MOV Instruktion, wenn die Nullfahne ist

; nicht Satz; das Schloss wurde vorher, und so geschlossen

; wir müssen spinnen, bis es unverschlossen wird.

rösten Sie; das Schloss ist erworben worden, kehren Sie zum Benennen zurück

; Funktion.

spin_unlock:

mov eax, 0; Setzen Sie das EAX-Register auf 0.

xchg eax, [Schloss]; Tauschen Sie atomar das EAX-Register mit ; die Schloss-Variable.

rösten Sie; das Schloss ist veröffentlicht worden.

</syntaxhighlight>

Bedeutende Optimierungen

Mit der x86 Zusammenbau-Sprache vertraute Programmierer können die einfache Durchführung oben sogleich verstehen, die an allen Zentraleinheiten mit der x86 Architektur arbeitet. Jedoch sind mehrere Leistungsoptimierungen möglich:

Auf späteren Durchführungen der x86 Architektur kann spin_unlock einen unverschlossenen MOV statt des langsamer geschlossenen XCHG sicher verwenden. Das ist wegen feiner Speichereinrichtungsregeln, die das unterstützen, wenn auch MOV nicht eine volle Speicherbarriere ist. Jedoch werden einige Verarbeiter (einige Verarbeiter von Cyrix, einige Revisionen von Intel Pentium Pro (wegen Programmfehler), und früherer Pentium und i486 SMP Systeme) machen die falsche Sache und durch das Schloss geschützten Daten konnten verdorben werden. Auf den meisten non-x86 Architekturen müssen ausführliche Speicherbarriere-Instruktionen oder Atominstruktionen (als im Beispiel) verwendet werden, oder dort kann speziell sein "schließen" Instruktionen "auf" (als auf IA-64), die die erforderliche Speichereinrichtung zur Verfügung stellen.

Um Zwischenzentraleinheitsbusverkehr zu reduzieren, wenn das Schloss nicht erworben wird, sollte der Code das Lesen schlingen ohne zu versuchen, irgendetwas zu schreiben, bis es einen geänderten Wert liest. Wegen MESI protokolliert das Verstecken, das veranlasst die Linie des geheimen Lagers für das Schloss, "Geteilt" zu werden; dann gibt es bemerkenswert keinen Busverkehr, während eine Zentraleinheit auf das Schloss wartet. Diese Optimierung ist auf allen Zentraleinheitsarchitekturen wirksam, die ein geheimes Lager pro Zentraleinheit haben, weil MESI so weit verbreitet ist.

Alternativen

Der primäre Nachteil eines spinlock ist, dass er Zeit verschwendet, während er wartet, um das Schloss zu erwerben, das anderswohin produktiv ausgegeben werden könnte. Es gibt zwei Alternativen, die das vermeiden:

  1. Erwerben Sie das Schloss nicht. In vielen Situationen ist es möglich, Datenstrukturen zu entwerfen, die Blockierung z.B durch das Verwenden pro Faden-Daten nicht verlangen, oder indem sie Daten pro ZE verwendet wird und Unterbrechungen unbrauchbar gemacht wird.
  2. Schalten Sie auf einen verschiedenen Faden um, während Sie warten (manchmal hat sleeplocks genannt). Das schließt normalerweise Befestigung des aktuellen Fadens zu einer Warteschlange von Fäden ein, die auf das Schloss warten, das durch die Schaltung auf einen anderen Faden gefolgt ist, der bereit ist, etwas nützliche Arbeit zu tun. Dieses Schema hat auch den Vorteil, dass es versichert, dass Quellenverhungern nicht vorkommt, so lange alle Fäden schließlich Schlösser aufgeben, erwerben sie, und Terminplanungsentscheidungen können getroffen werden, über den Faden zuerst fortschreiten sollte.

Am meisten Betriebssysteme (einschließlich Solaris, Mac OS X und FreeBSD) verwenden eine hybride Annäherung genannt "anpassungsfähiger mutex". Die Idee ist, einen spinlock zu verwenden, wenn sie versucht, auf eine durch einen zurzeit laufenden Faden geschlossene Quelle zuzugreifen, aber zu schlafen, wenn der Faden nicht zurzeit läuft. (Der Letztere ist immer der Fall auf Systemen des einzelnen Verarbeiters.)

Andere Bedeutungen

In einem militärischen Zusammenhang kann der Begriff "Drehungs-Schloss" gebraucht werden, um sich auf einen Mechanismus innerhalb eines Zünders einer Munition zu beziehen, der es nach der Zündung bewaffnet. Durchgeführt auf der Pistole-gestarteten Munition veranlasst die auf der Kugel gegebene Folge das Schloss, von einer "sicheren" Bedingung bis eine "bewaffnete" loszukommen.

Siehe auch

  • Synchronisation
  • Beschäftigte Drehung
  • toter Punkt
  • seqlock
  • Karte-Schloss

Links


Zweiphasige Blockierung / Jean-Baptiste Berthelin
Impressum & Datenschutz