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."