Ist es möglich, zu wissen, ob ein Prozess auf einem Receive () Anruf auf Linux in blockierter Zustand wartet?

StackOverflow https://stackoverflow.com/questions/1017427

Frage

Ihr Hauptzweck ist es, Verfahren einer nach der anderen in einer Round-Robin-Weise ausgeführt werden, bis ein Anruf empfängt () und blockiert wird, so dass die Ausführung zum nächsten Prozess schaltet in der Warteschlange. Es gibt eine Steuerungsanwendung, die in Java codiert wird, und es führt diese Prozesse (die auch Java-Anwendungen) unter Verwendung von Runtime.getRuntime (). Exec () und hält die Rückgabewerte der Prozessobjekte sind.

Um diesen Zweck zu erreichen, muss ich die receive () aufruft (oder deren Zustände, die blockiert ist) erfassen und sagen, sie an die Steuerung (Master) Anwendung.

Ich kann als Low-Level gehen, wie Sie wollen, wenn dies möglich ist .. Mein erster Gedanke war, diese Informationen von dem Fahrer zu bekommen und ihm dann zu meiner Controller Java-Anwendung berichten. Ich habe ein Linux-Kernel-Netzwerkmodul geschrieben, die die Sende- und Empfangsvorgänge erfaßt, aber AFAIK die socket.receive () Funktion sagt nichts zu dem Netzwerktreiber.

Also, ich denke, die Optionen aus, diese Informationen zu erhalten, sind entweder die JVM, es irgendwie von einem Linux-Befehl oder so, oder möglicherweise durch das Linux-Kernel-Modul?

Was sind Ihre Vorschläge?

War es hilfreich?

Lösung

Wenn Sie wissen wollen, ob Ihre Threads blockiert sind, oder genau das, was sie blockiert sind, können Sie entweder ein Thread-Dump oder ein Tool wie

Andere Tipps

Haben Sie sich systemtap ? Sollte auf den letzten Fedora-Systemen leicht verfügbar sein.

Best Anders

Ich weiß nicht, ob dies wird Ihnen helfen, aber Sie könnten Informationen über den Zustand eines Java-Thread auf Ihrem Rechner erhalten mit lokalen befestigen.

1) Fügen Sie die tools.jar zu Classpath und verwenden VirtualMachine.list () eine Liste der laufenden JVM auf Sie Maschine zu bekommen.

2) Befestigen der JVM verarbeitet VirtualMachine.attach (virtualMachineDescriptor) mit

3) Holen Sie sich den lokalen Anschluss Adresse, vm.getAgentProperties () erhalten ( "com.sun.management.jmxremote.localConnectorAddress");.

4) Verwenden JMXConnectorFactory.newJMXConnector (...) an die JVM verbinden

5) von der JMX-Verbindung Nachschlag der ThreadMXBean up

6) Vom ThreadMXBean erhalten Sie eine Reihe von ThreadInfos, der alle Fäden in der JVM beschreibt.

7) Von TheadInfo # getThreadState () Sie können prüfen, ob der Staat ThreadState.BLOCKED ist

Sie sollten die Interprozesskommunikation Primitiven in Ihren Arbeitsprozessen verwenden, um die Controller-Anwendung zu benachrichtigen, dass sie bereit sind, Daten zu empfangen.

Sie können keine Annahmen darüber, wie die Kindprozesse ihre Fassung lesen implementieren. Sie können mit recv werden, oder wählen Sie, oder abzufragen, etc., um für Netzwerkdaten zu warten.

Es gibt tatsächlich ein paar Punkte hier. Der Linux-Scheduler ist intelligent genug, um eine blockierte Aufgabe vorgreifen. wenn Sie anrufen Bedeutung, receive () und es gibt nichts, warten zu empfangen, wird Ihre Aufgabe wahrscheinlich bis zu einem Zeitpunkt eingeschläfert wird, dass der Anruf zurück. Sie brauchen nicht die Zeitplanung zu behandeln; der Linux-Kernel es für Sie tun.

Das heißt, wenn Sie müssen wissen, ob Ihre Aufgabe von einem Dämon Anwendung blockiert wird, wenn Sie bereit sind, ein LKM zu schreiben, warum man nicht nur die Aufgabe in der Aufgabenliste, die Sie interessiert sind, und Scheck sein Zustand?

Natürlich einfach den Zustand der Aufgabe Überprüfung könnte Ihnen nicht genau sagen, was Sie wollen. Wenn Ihre Aufgabe Zustand TASK_INTERRUPTIBLE ist, nur es sagt Ihnen, dass Sie Ihre Aufgabe auf etwas wartet , aber es könnte nicht eine triviale Angelegenheit sein, um herauszufinden, was das ist etwas. In ähnlicher Weise Ihre Aufgabe in einem TASK_RUNNING Zustand sein kann und nicht wirklich zum gegenwärtigen Zeitpunkt auf der CPU ausgeführt werden (aber zumindest in der TASK_RUNNING Zustand Sie Ihre Aufgabe wissen nicht blockiert ist).

Sie können nur ein QUIT-Signal (Strg- \ auf der Konsole) senden Thread-Dump zu erhalten.

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