Java 是否有可能知道Linux上的Receive()调用中进程是否处于阻塞状态?

Java 是否有可能知道Linux上的Receive()调用中进程是否处于阻塞状态?,java,linux-kernel,jvm,blocking,Java,Linux Kernel,Jvm,Blocking,我的主要目的是以循环方式逐个执行进程,直到有一个进程调用receive()并被阻塞,这样执行就会切换到队列中的下一个进程。有一个用Java编写的控制器应用程序,它使用Runtime.getRuntime().exec()执行这些进程(也是Java应用程序),并保留作为进程对象的返回值 为了达到这个目的,我需要捕获receive()调用(或者它们的状态,被阻止),并将它们告诉控制器(master)应用程序 如果可能的话,我可以去你想要的低级别。。我的第一个想法是从驱动程序获取这些信息,然后告诉我的

我的主要目的是以循环方式逐个执行进程,直到有一个进程调用receive()并被阻塞,这样执行就会切换到队列中的下一个进程。有一个用Java编写的控制器应用程序,它使用Runtime.getRuntime().exec()执行这些进程(也是Java应用程序),并保留作为进程对象的返回值

为了达到这个目的,我需要捕获receive()调用(或者它们的状态,被阻止),并将它们告诉控制器(master)应用程序

如果可能的话,我可以去你想要的低级别。。我的第一个想法是从驱动程序获取这些信息,然后告诉我的控制器Java应用程序。我已经编写了一个linux内核网络模块,它捕获了发送和接收操作,但是AFAIK socket.receive()函数并没有告诉网络驱动程序任何信息

所以,我认为可以选择从JVM获取这些信息,或者从linux命令获取,或者可能通过linux内核模块


您的建议是什么?

您应该在工作进程中使用进程间通信原语来通知控制器应用程序它们已准备好接收数据


您不能假设子进程如何实现套接字读取。它们可以使用recv、select或poll等来等待网络数据。

您应该在工作进程中使用进程间通信原语来通知控制器应用程序它们已准备好接收数据

您不能假设子进程如何实现套接字读取。他们可以使用recv、select或poll等来等待网络数据。

您看过吗?在最近的Fedora系统上应随时可用

最好的 安德斯,你看过了吗?在最近的Fedora系统上应随时可用

最好的
Anders

如果您想知道您的线程是否被阻塞,或者它们被阻塞的确切位置,您可以进行线程转储,或者使用类似于附加到进程的工具进行查看(在jvisualvm中,您将附加到进程,进行线程转储,然后查看每个线程的活动).

如果你想知道你的线程是否被阻塞,或者它们被阻塞的确切位置,你可以进行线程转储,或者使用类似于附加到进程的工具进行查看(在jvisualvm中,你将附加到进程,进行线程转储,然后查看每个线程的活动)。

这里实际上有几点。Linux调度程序足够智能,可以预先阻止被阻止的任务。也就是说,如果您调用receive(),并且没有任何东西等待接收,那么您的任务可能会一直处于休眠状态,直到调用返回为止。你不需要处理日程安排;Linux内核将为您做这件事

也就是说,如果您需要知道您的任务是否被某个守护程序应用程序阻止,如果您愿意编写一个LKM,为什么不在您感兴趣的任务列表中获取该任务,并检查其状态


当然,仅仅检查任务的状态可能无法准确地告诉您想要什么。如果您的任务状态为“任务可中断”,它只会告诉您任务正在等待某个东西,但弄清楚该东西是什么可能不是一件小事。类似地,您的任务可能处于
task\u RUNNING
状态,并且在当前时刻实际上没有在CPU上运行(但是,至少在
task\u RUNNING
状态下,您知道您的任务没有被阻塞)。

这里实际上有几点。Linux调度程序足够智能,可以预先阻止被阻止的任务。也就是说,如果您调用receive(),并且没有任何东西等待接收,那么您的任务可能会一直处于休眠状态,直到调用返回为止。你不需要处理日程安排;Linux内核将为您做这件事

也就是说,如果您需要知道您的任务是否被某个守护程序应用程序阻止,如果您愿意编写一个LKM,为什么不在您感兴趣的任务列表中获取该任务,并检查其状态


当然,仅仅检查任务的状态可能无法准确地告诉您想要什么。如果您的任务状态为“任务可中断”,它只会告诉您任务正在等待某个东西,但弄清楚该东西是什么可能不是一件小事。类似地,您的任务可能处于
task\u RUNNING
状态,并且在当前时刻实际上没有在CPU上运行(但是,至少在
task\u RUNNING
状态下,您知道您的任务没有被阻止)。

我不知道这是否对您有帮助,但是,您可以使用localattach获得关于机器上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可以得到一个ThreadInfos数组,它描述JVM中的所有线程


7) 从ADINFO#getThreadState()中,您可以检查状态是否为ThreadState.BLOCKED

我不知道这是否对您有帮助,但您可以使用local attach获取有关计算机上Java线程状态的信息

1) 将tools.jar添加到类路径中,并使用VirtualMachine.list()获取机器上正在运行的JVM的列表

2) 附加到使用VirtualMachine.Attach(virtu)处理的JVM