0

私の主な目的は、プロセスが receive() を呼び出してブロックされるまでラウンドロビン方式で 1 ​​つずつ実行し、実行がキュー内の次のプロセスに切り替わるようにすることです。Java でコーディングされたコントローラー アプリケーションがあり、Runtime.getRuntime().exec() を使用してこれらのプロセス (Java アプリケーションでもある) を実行し、Process オブジェクトである戻り値を保持します。

この目的を達成するには、 receive() 呼び出し (またはブロックされているその状態) をキャプチャし、それらをコントローラー (マスター) アプリケーションに伝える必要があります。

これが可能であれば、私はあなたが望むだけ低レベルに行くことができます..私が最初に考えたのは、ドライバーからこの情報を取得し、それをコントローラー Java アプリケーションに伝えることでした。送信および受信操作をキャプチャするLinuxカーネルネットワークモジュールを作成しましたが、知る限り、socket.receive()関数はネットワークドライバーに何も伝えません。

したがって、オプションは、JVMからこの情報を取得するか、Linuxコマンドなどから取得するか、またはLinuxカーネルモジュールを介して取得することだと思いますか?

あなたの提案は何ですか?

4

6 に答える 6

1

これが役に立つかどうかはわかりませんが、ローカル接続を使用してマシン上の Java スレッドの状態に関する情報を取得できます。

1) tools.jar をクラスパスに追加し、VirtualMachine.list() を使用してマシンで実行中の JVM のリストを取得します。

2) VirtualMachine.attach(virtualMachineDescriptor) を使用して処理された JVM にアタッチします。

3) ローカル コネクタ アドレスを取得します。vm.getAgentProperties().get("com.sun.management.jmxremote.localConnectorAddress");

4) JMXConnectorFactory.newJMXConnector(...) を使用して JVM に接続します。

5) JMX 接続ルックアップから ThreadMXBean を検索します。

6) ThreadMXBean から、JVM 内のすべてのスレッドを記述する ThreadInfo の配列を取得します。

7) TheadInfo#getThreadState() から、状態が ThreadState.BLOCKED であるかどうかを確認できます。

于 2009-06-20T11:31:47.767 に答える
1

スレッドがブロックされているかどうか、またはスレッドがブロックされているものを正確に知りたい場合は、スレッド ダンプを取得するか、jvisualvmなどのツールを使用してプロセスにアタッチして確認できます (jvisualvm では、プロセスにアタッチします)。 、スレッド ダンプを取得し、各スレッドのアクティビティを調べます)。

于 2009-06-19T13:24:06.683 に答える
1

systemtapを見たことがありますか?最近の Fedora システムではすぐに利用できるはずです。

ベストアンダース

于 2009-06-19T11:44:34.233 に答える
0

QUITシグナル(コンソールではCtrl- \)を送信するだけで、スレッドダンプを取得できます。

于 2009-07-09T18:26:43.983 に答える
0

ワーカープロセスでプロセス間通信プリミティブを使用して、データを受信する準備ができていることをコントローラーアプリケーションに通知する必要があります。

子プロセスがソケット読み取りを実装する方法について推測することはできません。ネットワークデータを待機するために、recv、select、pollなどを使用している可能性があります。

于 2009-06-19T11:41:09.920 に答える
0

ここには実はいくつかのポイントがあります。Linux スケジューラは、ブロックされたタスクを先取りできるほどスマートです。つまり、 receive() を呼び出し、受信を待っているものがない場合、呼び出しが戻るまで、タスクはおそらくスリープ状態になります。スケジューリングを処理する必要はありません。Linux カーネルがそれを行います。

とはいえ、自分のタスクが何らかのデーモン アプリケーションからブロックされているかどうかを知る必要がある場合、LKM を作成する意思がある場合は、関心のあるタスク リストでタスクを取得し、その状態を確認してみませんか?

もちろん、単にタスクの状態をチェックするだけでは、何が必要か正確にはわかりません。タスクの状態が の場合、タスクが何かTASK_INTERRUPTIBLEを待機していることを示すだけですが、それが何であるかを理解するのは簡単なことではないかもしれません。同様に、タスクが特定の状態にあり、現時点で実際には CPU 上で実行されていない可能性があります (ただし、少なくとも、タスクがブロックされていないことがわかっている状態では)。TASK_RUNNINGTASK_RUNNING

于 2009-06-19T13:33:59.223 に答える