Frage

ich mich immer gefragt, was sie sind: jedes Mal wenn ich über sie hören, Bilder von futuristischen Schwungrad ähnlichen Geräte tanzen gehen (rolling?) Durch den Kopf ...

Was sind sie?

War es hilfreich?

Lösung

Wenn Sie regelmäßig Schlösser verwenden (mutexes, kritische Abschnitte usw.), Betriebssystem setzt der Thread in den Wartezustand und preempts es durch die Planung andere Threads auf dem gleichen Kern. Dies hat eine Leistungseinbuße, wenn die Wartezeit sehr kurz ist, weil der Thread jetzt ein Vorkaufsrecht warten muss wieder CPU-Zeit zu erhalten.

Außerdem Kernel-Objekte sind in jedem Zustand des Kernels nicht zur Verfügung, wie in einem Interrupt-Handler oder wenn ein Funkruf ist nicht verfügbar, usw.

Spinlocks nicht Ursache Vorkaufsrecht aber Wartezeit in einer Schleife ( „Spin“) bis zu der anderen Kern der Sperre frei. Dies verhindert, dass der Faden von seinem verlieren Quanten und weiter, sobald die Sperre wird freigegeben. Der einfache Mechanismus von spinlocks erlaubt ein Kernel es zu nutzen, in fast jeden Staat.

Das ist, warum auf einer Single-Core-Maschine ein spinlock ist einfach ein "disable Interrupts" oder "Raise IRQL" die verhindert, dass Thread-Scheduling vollständig.

Spinlocks schließlich erlauben Kernel „Big Kernel Lock“ s (eine Sperre erworben, wenn der Kern Kern eintritt und am Ausgang freigegeben) zu vermeiden und haben granulare Verriegelungs über kernel Primitiven, wodurch bessere Multi-Processing auf Multi-Core-Maschinen damit eine bessere Performance .

EDIT: Eine Frage kam: „Heißt das, ich meine, sollte spinlocks verwenden, wo immer möglich?“ und ich werde versuchen, sie zu beantworten:

Wie bereits erwähnt, sind Spinlocks nur nützlich an Orten zu erwarten, wo die Wartezeit kürzer als ein Quanten (sprich: Millisekunden) und Vorkaufsrecht macht nicht viel Sinn (z Kernel-Objekte sind nicht verfügbar).

Wenn die Wartezeit unbekannt ist, oder wenn Sie in Benutzer sind Modus Spinlocks sind nicht effizient. Sie verbrauchen 100% CPU-Zeit auf der Warte Kern während der Überprüfung, ob ein spinlock zur Verfügung steht. Sie verhindern, dass andere Threads laufen auf diesem Kern, bis Ihr Quanten abläuft. Dieses Szenario ist nur möglich für kurze Bursts auf Kernel-Ebene und es ist unwahrscheinlich eine Option für eine Benutzer-Modus-Anwendung.

Hier ist eine Frage an SO Adressierung, dass: Spinlocks, wie nützlich sie sind

Andere Tipps

Say eine Ressource durch eine Sperre geschützt, ein roter Faden, der Zugriff auf den Ressourcenbedarf will zuerst die Sperre erwerben. Wenn die Sperre nicht verfügbar ist, prüfen Sie das Gewinde könnte wiederholt, wenn die Sperre freigegeben wurde. Während dieser Zeit die Überprüfung der Faden busy waits, für das Schloss, mit CPU, aber keine nützliche Arbeit zu tun. Eine solche Sperre wird als Spin-Lock bezeichnet.

Es ist so ziemlich eine Schleife, die gehen immer wieder, bis eine bestimmte Bedingung erfüllt ist:

while(cantGoOn) {};
 while(something != TRUE ){};
 // it happend
 move_on();

Es ist eine Art der Sperre, die busy waiting tut

Es ist als ein Anti-Muster, mit Ausnahme von sehr niedrigem Niveau Treiberprogrammierung (wo es eine „richtige“, dass Aufruf wartete Funktion Overhead mehr passieren kann, als einfach nur damit beschäftigt Verriegelung für ein paar Zyklen).

Siehe zum Beispiel Spinlocks in Linux-Kernel .

Spinlocks sind diejenigen, in denen Thread wartet, bis die Sperre verfügbar ist. Dies wird normalerweise verwendet werden, Overhead zu vermeiden von den Kernel-Objekte zu erhalten, wenn es ein Umfang von dem Kernel-Objekt innerhalb einer kleinen Zeitspanne zu erwerben.

Beispiel:

While(SpinCount-- && Kernel Object is not free)
{}

try acquiring Kernel object

Sie wollen eine spinlock verwenden, wenn Sie denken, dass es billiger ist, ein Besetzt Warteschleife zu betreten und bündeln eine Ressource statt blockiert, wenn die Ressource gesperrt ist.

  

Spinning kann von Vorteil sein, wenn Schlösser fein sind genarbt und groß an der Zahl (beispielsweise eine Sperre pro Knoten in einer verknüpften Liste) sowie beim Schlosshaltezeiten sind immer extrem kurz. Im Allgemeinen, während ein Spin-Lock hält, sollte man vermeiden, blockiert, etwas fordern, dass selbst blockieren kann, mehr als ein Spin-Lock auf einmal zu halten, dynamisch das ausgelöst wird Telefonieren (Schnittstelle und virtuals), was statisch Anrufe in jedem Code ein doesn versandt‘ t eigene oder Zuweisung Speicher.

     

Es ist auch wichtig zu beachten, dass SpinLock ein Werttyp ist aus Leistungsgründen. Als solche muss man nicht sehr vorsichtig sein, versehentlich eine SpinLock Instanz kopieren, wie die beiden Instanzen (das Original und die Kopie) dann völlig unabhängig von einem wären ein anderes, die fehlerhafte Verhalten der Anwendung wahrscheinlich führen würde. Wenn ein SpinLock Beispiel wird herumgereicht muss, soll es als Referenz übergeben werden, anstatt nach Wert.

In aller Kürze, spinlock beschäftigt Atom Vergleichs- und Auslagerungs (CAS) oder Test-and-Set wie Anweisungen Sperre frei zu implementieren, wartet freien Thread-sicher Idiom. Solche Strukturen skalieren auch in Multi-Core-Maschinen.

Es ist eine Schleife, die bis eine Bedingung dreht sich um erfüllt ist.

Nun, ja - der Punkt der Spin-Locks (vs einem traditionellen kritischen Abschnitte, usw.) ist, dass sie ein bessere Leistung unter bestimmten Umständen (Multi-Core-Systemen ..) bieten, weil sie den Rest des Quantenfadens nicht sofort nachgeben .

Spinlock, ist eine Art der Sperre, die nicht-Block der Lage und Nicht-Schlaf-fähig. Jeder Thread, der eine spinlock für jede gemeinsam genutzte oder kritische Ressource wird kontinuierlich Spin, verschwenden die CPU-Zyklus erwerben wollen, bis es die Sperre für die angegebene Ressource zu erwerben. Sobald spinlock erworben wird, versuchen sie die Arbeit in seinen Quanten zu vervollständigen und dann jeweils die Ressource freigeben. Spinlock ist die höchste Priorität Art der Sperre kann nur sagen, es ist nicht-preemptive Art der Sperre.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top