Warum kannst du nicht schlafen während du Spinlock hältst?

7

Warum können Sie im Linux-Kernel nicht schlafen, während Sie einen Spinlock halten?

    
Bandicoot 20.01.2011, 20:10
quelle

8 Antworten

15

Beispiel: Ihr Treiber führt gerade eine Sperre aus, die den Zugriff auf sein Gerät steuert. Während die Sperre gehalten wird, gibt das Gerät einen Interrupt aus, der zur Ausführung des Interrupt-Handlers führt. Der Interrupt-Handler muss vor dem Zugriff auf das Gerät auch die Sperre erhalten. Es ist eine legitime Sache, einen Spinlock in einem Interrupt-Handler herauszunehmen; das ist einer der Gründe, warum Spinlock-Operationen nicht schlafen. Aber was passiert, wenn die Interruptroutine im selben Prozessor ausgeführt wird wie der Code, der ursprünglich die Sperre aufgehoben hat? Während sich der Interrupt-Handler dreht, kann der Interrupt-Code nicht ausgeführt werden, um die Sperre aufzuheben. Dieser Prozessor wird für immer drehen.

Quelle: Ссылка

    
Will Tate 20.01.2011, 20:13
quelle
7

Es ist nicht so, dass Sie nicht schlafen können, während Sie eine Drehsperre halten. Es ist eine sehr, sehr schlechte Idee, das zu tun. Zitat LDD:

  

Daher lautet die Kernregel für Spinlocks, dass jeder Code, während er einen Spinlock hält, atomar sein muss. Es kann nicht schlafen; in der Tat kann es den Prozessor nicht aus irgendeinem Grund verlassen, außer Interrupts zu bedienen (und manchmal nicht einmal dann).

Jeder oben erwähnte Deadlock kann zu einem nicht behebbaren Zustand führen. Eine andere Sache, die passieren könnte, ist, dass der Spinlock auf einer CPU gesperrt wird, und dann, wenn der Thread schläft, wacht er auf der anderen CPU auf, was zu einer Kernel-Panik führt.

Beim Beantworten des Bandicoot-Kommentars wird die Vorbelegung in einem Drehsperrkontext nur im Falle eines vorprozessorfähigen Kernels für einen Prozessor aufgehoben , da die Deaktivierung der Vorbelegung Rennen effektiv verhindert.

  

Wenn der Kernel ohne CONFIG_SMP kompiliert wird, aber CONFIG_PREEMPT gesetzt ist, deaktivieren Spinlocks einfach die Vorbelegung, was ausreicht, um Rennen zu verhindern. Für die meisten Zwecke können wir uns Vorkaufsrecht als gleichwertig zu SMP vorstellen und uns nicht getrennt darum kümmern.

Ссылка

    
Omair 24.05.2012 06:40
quelle
3

Ich stimme nicht mit Williams Antwort (sein Beispiel) überein. Er mischt zwei verschiedene Konzepte: Vorkaufsrecht und Synchronisation.

Ein Interrupt-Kontext könnte einen Prozesskontext prämentieren, und daher müssen wir

verwenden, wenn ein RESOURCE von beiden gemeinsam genutzt wird %Vor%

bis (1) deaktivieren Sie den IRQ (2) erwerben Sie die Sperre. In Schritt 1 könnten wir die Unterbrechungssperre deaktivieren.

Ich denke dieser Thread ist sehr überzeugend . Sleep () bedeutet, dass ein Thread / Prozess die Steuerung von CPU und CONTEXT SWITCH zu einem anderen führt, ohne den Spinlock freizugeben, deshalb ist es falsch.

    
Qylin 01.07.2013 09:57
quelle
3

Ich denke, diese Mail hat eine klare Antwort:

  

Ein Prozess kann nicht vorverlegt werden und nicht schlafen, während er ein Spinlock-Verhalten aufgrund von Spinlocks hält. Wenn ein Prozess einen Spinlock ergreift und schlafen geht, bevor er ihn loslässt. Ein zweiter Prozess (oder ein Interrupt-Handler), der den Spinlock ergreift, wird mit dem Warten beschäftigt. Auf einem Uniprozessor-Rechner wird der zweite Prozess die CPU sperren und nicht zulassen, dass der erste Prozess aufwacht und den Spinlock freigibt, so dass der zweite Prozess fortfahren kann, es ist im Grunde ein Deadlock.

    
Nan Xiao 26.11.2015 09:03
quelle
3

Der Schlüsselpunkt liegt im Linux-Kernel. Wenn Sie eine Drehsperre aktivieren, wird die Vorbelegung deaktiviert. Wenn man also schläft, während man eine Drehsperre hält, kann das zu einem Deadlock führen.

Zum Beispiel erwirbt Thread A eine Drehsperre. Auf Thread A wird nicht gewartet, bis die Sperre aufgehoben wird. Solange Thread A seine Aufgabe schnell erledigt und die Sperre aufhebt, gibt es kein Problem. Aber wenn Thread A schläft, während er die Sperre festhält, könnte Thread B so geplant werden, dass er ausgeführt wird, da die Schlaffunktion den Scheduler aufruft. Und Thread B könnte auch die gleiche Sperre erhalten. Thread B deaktiviert außerdem die Vorbelegung und versucht, die Sperre zu übernehmen. Und ein Deadlock tritt auf. Thread B wird nie die Sperre erhalten, da Thread A sie enthält, und Thread A wird niemals ausgeführt, da Thread B die Vorbelegung deaktiviert.

Und warum sollte die Vorkaufssperre überhaupt verhindert werden? Ich schätze, weil wir nicht wollen, dass Threads auf anderen Prozessoren zu lange warten.

    
Nan Wang 23.12.2014 11:26
quelle
2

Eine weitere mögliche Erklärung ist, dass in einem Spinlock-Kontext die Vorbelegung deaktiviert ist.

    
TheLoneJoker 20.01.2011 22:11
quelle
2

Abgesehen davon, was Willate erwähnt hat, gehe davon aus, dass ein Prozess schläft, während er einen Spilock hält. Wenn der neue Prozess, der geplant wird, versucht, den gleichen Spinlock zu erhalten, beginnt er sich zu drehen, damit die Sperre verfügbar ist. Da der neue Prozess sich weiter dreht, ist es nicht möglich, den ersten Prozess zu planen und somit wird die Sperre niemals aufgehoben, wodurch der zweite Prozess für immer rotiert und wir einen Deadlock haben.

    
San 19.02.2012 15:59
quelle
0

stimme völlig mit Nan Wang überein. Ich denke, wichtigste Konzept ist „Vorkaufsrecht“ & amp; "Scheduling" und wie passiert, wenn Spinlock akquiriert wird. Wenn Spinlock akquiriert wird, ist die Vorbelegung deaktiviert (wahr oder nicht, ich weiß nicht, aber nehme an, dass es korrekt ist), es bedeutet, Timer-Interrupt kann aktuellen Spinlock-Halter nicht vorenthalten, aber aktuelle Spinlock-Hold noch Call Sleepable Kernel-Funktionen & amp; scheduler & amp; aktiv aufrufen Führen Sie "eine andere Aufgabe" aus. Wenn "eine andere Aufgabe" zufällig den gleichen Spinlock wie der erste Spinlock-Halter erhalten möchte, kommt hier ein Problem: da die Vorbelegung bereits durch den ersten Spinlock-Halter deaktiviert ist, "eine andere Aufgabe", die durch aktiven Aufruf des Schedulers durch den ersten Spinlock-Halter aufgerufen wird , kann nicht ausgeschlossen werden, so dass seine Drehung immer die CPU nehmen, das ist, warum Deadlock passieren.

    
steve 18.11.2015 21:21
quelle

Tags und Links