Bitte erklären Sie, warum beschäftigt warten ist in der Regel verpönt, während Spinning wird oft als in Ordnung gesehen. Soweit ich das beurteilen kann, laufen beide unendlich weit, bis eine Bedingung erfüllt ist.Spinlock vs beschäftigt warten
Antwort
Ein spin-lock wird normalerweise verwendet, wenn die Ressource knapp ist und die CPU daher nur wenige Iterationen durchführt, bevor sie produktiv arbeiten kann. Bibliotheksimplementierungen der Sperrfunktionalität verwenden jedoch häufig eine Drehsperre gefolgt von einer regulären Sperre. Die reguläre Sperre wird verwendet, wenn die Ressource nicht in einem angemessenen Zeitrahmen erworben werden kann. Dies wird durchgeführt, um den Overhead mit Kontextwechsel in Einstellungen zu reduzieren, in denen Sperren normalerweise schnell erhalten werden.
Der Begriff busy-waiting neigt dazu, dass Sie bereit sind, zu drehen und warten auf eine Änderung in einem Hardware-Register oder einem Speicherort. Der Begriff bedeutet nicht unbedingt Sperren, aber es bedeutet Warten in einer engen Schleife, immer wieder für eine Änderung suchen.
Sie können busy-waiting verwenden, um eine Art von Änderung in der Umgebung zu erkennen, auf die Sie sofort reagieren möchten. Also wird eine Spin-Lock-Funktion implementiert, indem man busy-waiting verwendet. Busy-Waiting ist in jeder Situation nützlich, in der eine sehr niedrige Latenzzeit wichtiger ist als die CPU-Zyklen zu verschwenden (wie bei einigen Arten eingebetteter Programmierung).
Passend zu diesem sind die Begriffe «Lock-frei» und «warten frei»:
Sogenannte Lock-Free Algorithmen sind in der Regel dicht besetzt Warte mit einer CAS Anweisung zu verwenden, aber die Behauptung, ist in gewöhnlichen Situationen so niedrig, dass die CPU in der Regel nur wenige Male iterieren muss.
Sogenannte warten- Algorithmen tun keine busy-warten überhaupt.
(Bitte beachten Sie, dass «Lock-frei» und «warten frei» etwas anders in akademischen Kontexten verwendet werden, auf Non-blocking algorithms Wikipedia-Artikel sehen.)
+1 im Allgemeinen, aber ein bisschen Nitpicking: klassische CAS-Muster (lesen-CAS-var-berechnen-New-Wert-try-CAS-wenn-fehlgeschlagen-spülen-und-wiederholen) nicht wirklich als beschäftigt - wartend (wir warten nicht wirklich auf eine externe Variable _to_change_ - was lange dauern kann, aber wir warten darauf, dass die Variable vor externer Interferenz stabil ist - was in der Praxis niemals mehr als 2-3 Iterationen benötigt); immer noch - solche CAS-Muster gelten nicht als "wartefrei" :-(. –
Wenn Sie den genauen Grund für eine Regel zu verstehen und haben detaillierte Plattform- und Anwendungswissen, Sie wissen, wann es angemessen ist, diese Regel zu verletzen. Spinlocks werden von Experten implementiert, die ein vollständiges Verständnis der Plattform haben, auf der sie sich entwickeln, und der beabsichtigten Anwendungen für Spinlocks.
Die Probleme mit beschäftigt warten sind zahlreich, aber auf den meisten Plattformen gibt es Lösungen für sie. Issues:
Aber die Leute, die Spinlocks entwerfen, verstehen all diese Probleme und wissen genau, wie man sie auf der Plattform mildert.Sie schreiben nicht naiven Spinncode, sie schreiben intelligenten Spinncode.
Also ja, sie beide Schleife unendlich, bis eine Bedingung erfüllt ist, aber sie Schleife anders.
Ich denke in einem Spinlock machst du eigentlich andere Sachen neben dem Warten auf seine Veröffentlichung ... –
Spinlock nicht, es sei denn, Sie haben eine sehr gute Garantie, dass Sie das Schloss in einer Mikrosekunde oder weniger erwerben können. Wenn es länger dauert, wird es zu einem "busy-waiting" und einem Bug. –
eine Sperre, die besetzt verwendet, heißt Spinlock - * Modern Operating System * – walkerlala