GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie erkennt und findet man heraus, dass sich ein Programm im Deadlock befindet?

Wenn Sie einen Deadlock vermuten, führen Sie einen ps aux | grep <exe name> durch , falls in der Ausgabe, die PROCESS STATE CODE ist D (Unterbrechungsfreier Ruhezustand) bedeutet, dass es sich um einen Deadlock handelt. Denn wie @daijo erklärt hat, sagen wir, Sie haben zwei Threads T1 &T2 und zwei kritische Abschnitte, die jeweils durch semaphores S1 & S2 geschützt sind dann wenn T1 erwirbt S1 und T2 erwirbt S2 und danach versuchen sie, die andere Sperre zu erwerben, bevor sie die bereits von ihnen gehaltene aufgeben, dies führt zu einem Deadlock und zu einem ps aux | grep <exe name> , die process state code wird D sein (dh unterbrechungsfreier Schlaf).

Werkzeuge:

Valgrind, Lockdep (Linux-Kernel-Dienstprogramm)

Überprüfen Sie diesen Link auf Arten von Deadlocks und wie man sie vermeidet:http://cmdlinelinux.blogspot.com/2014/01/linux-kernel-deadlocks-and-how-to-avoid.html

Bearbeiten:ps aux Ausgabe D "könnte" bedeuten, dass sich der Prozess in einem Deadlock befindet, aus diesem Redhat-Dokument:

Unterbrechungsfreier Ruhezustand
Ein unterbrechungsfreier Schlafzustand ist ein Zustand, der ein Signal nicht sofort verarbeitet. Er wird nur aktiviert, wenn eine Ressource, auf die gewartet wurde, verfügbar wird oder nachdem während dieser Wartezeit eine Zeitüberschreitung auftritt (wenn die Zeitüberschreitung angegeben wird, wenn der Prozess in den Ruhezustand versetzt wird).


Ich würde vorschlagen, dass Sie sich Helgrind ansehen:ein Thread-Fehlerdetektor.

Das einfachste Beispiel für ein solches Problem ist wie folgt.

Stellen Sie sich eine gemeinsam genutzte Ressource R vor, die aus irgendeinem Grund durch zwei Sperren, L1 und L2, geschützt wird, die beide gehalten werden müssen, wenn auf R zugegriffen wird.

Angenommen, ein Thread erwirbt L1, dann L2 und fährt mit dem Zugriff auf R fort. Daraus folgt, dass alle Threads im Programm die beiden Sperren in der Reihenfolge zuerst L1 und dann L2 erwerben müssen. Andernfalls riskieren Sie einen Deadlock.

Der Deadlock könnte auftreten, wenn zwei Threads – nennen Sie sie T1 und T2 – beide auf R zugreifen wollen. Nehmen wir an, T1 erwirbt zuerst L1 und T2 erwirbt zuerst L2. Dann versucht T1, L2 zu erwerben, und T2 versucht, L1 zu erwerben, aber diese Sperren werden beide bereits gehalten. Also werden T1 und T2 blockiert."


Linux
  1. So finden Sie die wichtigsten Verzeichnisse und Dateien (Festplattenspeicherplatz) in Linux heraus

  2. Maestral Dropbox Client, finden Sie heraus, wie Sie ihn installieren und verwenden

  3. So finden und töten Sie den Zombie-Prozess in Linux

  4. Wie drucke ich die Zeilen Nummer 15 und 25 von jeweils 50 Zeilen?

  5. Wie finde ich den Namensraum eines bestimmten Prozesses heraus?

So finden Sie die Prozess-ID eines Programms und beenden es [Kurztipp]

So finden Sie das Installationsdatum und die Uhrzeit des Linux-Betriebssystems

So finden Sie heraus, welches Programm das Internet nutzt und wie viel?

So finden und ersetzen Sie Text in Vim

So erkennen und verwalten Sie Geräte unter Linux

Wie man ein C-Programm unter Linux schreibt und ausführt