¿Es posible saber si un proceso está esperando en estado Bloqueado en una llamada Recibir () en Linux?

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

Pregunta

Mi propósito principal es ejecutar procesos uno por uno de forma circular hasta que se llame a reciben () y se bloquea, de modo que la ejecución cambie al siguiente proceso en la cola. Hay una aplicación de controlador que está codificada en Java y ejecuta estos procesos (que también son aplicaciones Java) usando Runtime.getRuntime (). Exec () y mantiene los valores de retorno que son objetos de Proceso.

Para lograr este propósito, necesito capturar las llamadas de recibir () (o sus estados, que está bloqueado) y decirles a la aplicación del controlador (maestro).

Puedo pasar el nivel más bajo que desee si esto es posible. Lo primero que pensé fue obtener esta información del controlador y luego comunicarla a la aplicación Java de mi controlador. He escrito un módulo de red de kernel de Linux que captura las operaciones de envío y recepción, pero AFAIK la función socket.receive () no le dice nada al controlador de red.

Entonces, creo que las opciones son obtener esta información de la JVM, de alguna manera obtenerla de un comando de Linux, ¿o posiblemente a través del módulo del kernel de Linux?

¿Cuáles son tus sugerencias?

¿Fue útil?

Solución

Si desea saber si sus hilos están bloqueados, o exactamente en qué están bloqueados, puede hacer un volcado de hilos o usar una herramienta como jvisualvm para adjuntar al proceso y echar un vistazo (en jvisualvm se adjuntaría al proceso, realizar un volcado de subproceso , y luego mira la actividad de cada hilo).

Otros consejos

¿Ha visto systemtap ? Debería estar disponible en sistemas Fedora recientes.

Mejor Anders

No sé si esto lo ayudará, pero podría obtener información sobre el estado de un subproceso Java en su máquina utilizando un archivo adjunto local.

1) Agregue tools.jar a su classpath y use VirtualMachine.list () para obtener una lista de la JVM en ejecución en su máquina.

2) Adjuntar a la JVM procesada usando VirtualMachine.attach (virtualMachineDescriptor)

3) Obtenga la dirección del conector local, vm.getAgentProperties (). get (" com.sun.management.jmxremote.localConnectorAddress ");

4) Use JMXConnectorFactory.newJMXConnector (...) para conectarse a la JVM

5) Desde la conexión JMX, busque ThreadMXBean

6) Desde ThreadMXBean obtienes una matriz de ThreadInfos que describe todos los hilos en la JVM.

7) Desde TheadInfo # getThreadState () puede verificar si el estado es ThreadState.BLOCKED

Debe usar primitivas de comunicación entre procesos en sus procesos de trabajo para notificar a la aplicación del controlador que están listos para recibir datos.

No puede hacer suposiciones sobre cómo los procesos secundarios implementan su lectura de socket. Podrían estar usando recv, o select, o poll, etc., para esperar los datos de la red.

En realidad hay algunos puntos aquí. El planificador de Linux es lo suficientemente inteligente como para evitar una tarea bloqueada. Es decir, si llama a recibir () y no hay nada esperando a recibir, su tarea probablemente se suspenderá hasta el momento en que la llamada regrese. No necesita manejar la programación; el kernel de Linux lo hará por usted.

Dicho esto, si necesita saber si su tarea está bloqueada por alguna aplicación daemon, si está dispuesto a escribir un LKM, ¿por qué no simplemente incluir la tarea en la lista de tareas que le interesa y verificar? su estado?

Por supuesto, simplemente verificar el estado de la tarea podría no decirle exactamente lo que desea. Si el estado de su tarea es TASK_INTERRUPTIBLE , solo le indica que su tarea está esperando algo , pero puede que no sea un asunto trivial descubrir qué es ese algo. Del mismo modo, su tarea puede estar en un estado TASK_RUNNING y no estar realmente ejecutándose en la CPU en el momento actual (pero, al menos, en el estado TASK_RUNNING conoce su tarea no está bloqueado).

Puede enviar una señal QUIT (Ctrl- \ en la consola) para obtener un volcado de subprocesos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top