it-swarm.com.de

Wie unterscheidet sich Spinlock von Polling?

Ist Spinlock und Polling dasselbe?

Wikipedia:

ein Spinlock ist eine Sperre, die bewirkt, dass ein Thread, der versucht, sie zu erfassen, einfach in einer Schleife wartet ("Spin"), während er wiederholt prüft, ob die Sperre verfügbar ist

Das klingt furchtbar nach:

while(!ready);

Mir wurde beigebracht, Abstimmungen möglichst zu vermeiden, da sie durch und durch nicht optimal waren. Also, ist Spinlock ein ausgefallener Name für schlechte alte Umfragen? Wie unterscheidet sich ein Spinlock von Polling?

41
Lord Loh.

Abfragen bezieht sich auf die wiederholte Überprüfung, ob eine Ressource (beliebige Art von Ressource) bereit ist.

Ein Spinlock ist, wenn die Ressource, die Sie abfragen, eine Sperre ist.

Beachten Sie, dass die Abfrage nicht schlecht ist. Das Abrufen ist insbesondere dann effizient, wenn beim Abrufen normalerweise Daten bereitstehen. Polling ist nur dann ineffizient, wenn Sie dies tun, ohne dafür Daten zu erhalten.

Auf der anderen Seite sind Interrupts ineffizient, wenn so viele Daten vorhanden sind, dass Sie ständig unterbrochen werden. Sie sind effizient, wenn Daten selten genug eintreffen, damit Sie tatsächlich nützliche Arbeit leisten können, bevor Sie unterbrochen werden.

Ich kann Ihnen ein Beispiel aus meiner eigenen Erfahrung geben: Vor 15 Jahren hatte ich mein E-Mail-Programm so eingerichtet, dass es mich jedes Mal unterbricht, wenn eine neue E-Mail eingeht. Dies geschah ein- oder zweimal pro Woche. Das ständige Überprüfen meines Posteingangs wäre eine gewaltige Zeitverschwendung gewesen.

Heutzutage habe ich alle Benachrichtigungen deaktiviert. Ich weiß dass, wenn ich in meinen Posteingang schaue, dort neue E-Mails erscheinen. Polling ist jetzt viel effizienter.

Spinlocks sind effizient, wenn a) die Wahrscheinlichkeit, dass die Sperre aufgehoben wird, gering ist und b) wenn die Sperre aufgehoben wird, wird sie nur für kurze Zeit gehalten. Mit anderen Worten: Es ist effizient für meist unkontrollierte feinkörnige Schlösser, aber ineffizient für stark umkämpfte grobkörnige Schlösser.

(Und natürlich funktionieren Spinlocks nur, wenn es echte Parallelität gibt, sonst hat der andere Thread keine Chance, die Sperre aufzuheben. Ich denke, das ist offensichtlich, aber ich wollte es trotzdem angeben.)

85
Jörg W Mittag

Ein Spinlock ist eine Art von Sperre, insbesondere eine, die erreicht wird via Polling.

Polling ist eine Methode zum Überprüfen des Status von etwas (indem Sie nach dem Status fragen, anstatt darauf zu warten, dass Ihnen der Status mitgeteilt wird).

Nicht alle Abfragen sind Spinlins, die beispielsweise den Status von Tastaturtasten abfragen.


Außerdem ist das Abrufen nicht von Natur aus schlecht. Sehr kurze Abfrageperioden können teure Kontextverschiebungen vermeiden, die die Verwendung von Interrupts erfordern würde, ganz zu schweigen davon, dass die Abfrage manchmal einfacher zu implementieren und damit einfacher zu warten ist, insbesondere auf niedrigeren Ebenen. Wie üblich sind Absolute eine schreckliche Sache, und Sie sollten die Methode verwenden, die den für Ihre Bedürfnisse angemessenen Kompromiss zwischen Leistung und Komplexität bietet wie Sie sie gemessen haben, anstatt Optionen blind zu verwenden oder zu verwerfen.

10
8bittree

Spinlock unterscheidet sich vom Polling dadurch, dass es nur für einen sehr kurzen Zeitraum in der Größenordnung von wenigen Millisekunden oder weniger auftritt. Die Abfrage kann auf unbestimmte Zeit fortgesetzt werden.

Bei der parallelen Programmierung ist eine kurze Episode des Spinnens häufig dem Blockieren vorzuziehen, da dadurch die Kosten für Kontextwechsel und Kernelübergänge vermieden werden.

Weiterführende Literatur
SpinLock und SpinWait in C #
Spinlocks und Lese-/Schreibsperren in C

5
Robert Harvey

Der Unterschied besteht darin, dass ein Spinlock (hoffentlich) nur in Situationen verwendet wird, in denen er angemessen ist, und in diesen Situationen ist er sehr effizient.

Sie verwenden einen Spinlock, wenn Sie erwarten, dass eine Ressource nur für eine sehr kurze Zeit gesperrt wird - beispielsweise wenn eine Sperre nur zum Aktualisieren einer Variablen verwendet wird. Der Spinlock fragt die Sperre mit maximaler Geschwindigkeit ab, aber hoffentlich für weniger als Mikrosekunden. Ein normaler Mutex würde beim Aufruf des Betriebssystems erforderlich sein. WENN Die Sperre wird nur für eine winzige Zeitspanne gehalten, dann verbraucht die Spinlock nur eine winzige Menge an CPU-Zeit, während der Aufruf des Betriebssystems länger dauert. Wenn diese Erwartung jedoch falsch ist, ist der Spinlock sehr ineffizient - er verbraucht 100% CPU-Zeit auf einer CPU, während der normale Mutex nur die Zeit für die Eingabe des Betriebssystems und die Rückkehr benötigt.

Manchmal werden beide kombiniert; Sie führen die Drehsperre für kurze Zeit aus und wechseln zu einer anderen Strategie, wenn die Drehsperre nicht funktioniert.

4
gnasher729

Übermäßiges Abrufen ist etwas, das Sie nicht tun sollten, da es Systemressourcen verschwendet. Daraus folgt Abfrage ist in Ordnung, wenn keine Systemressourcen verschwendet werden.

Zum Beispiel führt eine übermäßige Abfrage zu einer CPU-Auslastung von 100% in Fällen, in denen die eigentliche Arbeit nur zu einer Auslastung von 2% führen würde.

Polling kann für andere Zwecke als while(!ready) verwendet werden. Zum Beispiel bedeutet dies, regelmäßig zu überprüfen, ob der Benutzer eine Taste gedrückt hat. Eine vernünftige Implementierung überprüft höchstens alle 15 Millisekunden, also alle ~ 20 Millionen Taktzyklen. Diese Art der Abfrage ist großartig, da keine Systemressourcen verschwendet werden.

Ein SpinLock ist nicht ein Sonderfall. Wenn wir ein SpinLock haben und ein Thread in die Sperre eintritt und ein anderer warten muss, ist das SpinLock genau dann die falsche Wahl, wenn der wartende Thread Systemressourcen verschwendet. Der wartende Thread verschwendet nur dann Systemressourcen, wenn er eine beträchtliche Zeit warten muss, bevor er die Sperre erlangen kann.

Daher ist die Verwendung eines SpinLock zum Schutz eines Objekts, das einige tausend Taktzyklen oder mehr benötigt, bevor es wieder entsperrt wird (z. B. das sofortige Kompilieren und Ausführen eines Javascript-Teils), genau aus dem von Ihnen angegebenen Grund schlecht. Die Verwendung eines SpinLock zum Schutz von Dingen, die schnell abgeschlossen werden, wie der Zugriff auf eine ordnungsgemäß implementierte Hash-Map, ist jedoch in Ordnung, da der wartende Thread nur zwei- oder dreimal gedreht wird und daher keine Systemressourcen verschwendet.

2
Peter