Можно ли узнать, ожидает ли процесс в состоянии блокировки вызова Receive() в Linux?

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

Вопрос

Моя основная цель — выполнять процессы один за другим в циклическом порядке до тех пор, пока один из них не вызовет метод получения() и не будет заблокирован, чтобы выполнение переключилось на следующий процесс в очереди.Существует приложение-контроллер, написанное на Java, которое выполняет эти процессы (которые также являются приложениями Java) с помощью Runtime.getRuntime().exec() и сохраняет возвращаемые значения, которые являются объектами процесса.

Для достижения этой цели мне нужно перехватить вызовы метода получения() (или их состояния, которые блокируются) и передать их приложению-контроллеру (главному).

Я могу перейти на настолько низкий уровень, насколько вы хотите, если это возможно..Моей первой мыслью было получить эту информацию от драйвера, а затем передать ее Java-приложению моего контроллера.Я написал сетевой модуль ядра Linux, который фиксирует операции отправки и получения, но AFAIK функция socket.receive() ничего не сообщает сетевому драйверу.

Итак, я думаю, что есть варианты получить эту информацию либо из JVM, либо каким-то образом получить ее из команды Linux или около того, либо, возможно, через модуль ядра Linux?

Каковы ваши предложения?

Это было полезно?

Решение

Если вы хотите узнать, заблокированы ли ваши потоки или что именно они заблокированы, вы можете либо создать дамп потока, либо использовать инструмент, например jvisualvm , чтобы присоединиться к процессу и посмотреть (в jvisualvm вы присоединитесь к процессу, сделайте дамп потока , а затем посмотрите на активность каждого потока).

Другие советы

Вы посмотрели системный кран?Должен быть доступен в последних системах Fedora.

Лучший Андерс

Не знаю, поможет ли это вам, но вы можете получить информацию о состоянии потока Java на вашем компьютере, используя локальное присоединение.

1) Добавьте tools.jar в ваш путь к классам и используйте VirtualMachine.list (), чтобы получить список запущенной JVM на вашем компьютере.

2) Присоединиться к JVM, обработанной с использованием VirtualMachine.attach (virtualMachineDescriptor)

3) Получить адрес локального соединителя, vm.getAgentProperties (). get (" com.sun.management.jmxremote.localConnectorAddress ");

4) Используйте JMXConnectorFactory.newJMXConnector (...) для подключения к JVM

5) Из поиска JMX-соединения найдите ThreadMXBean

6) Из ThreadMXBean вы получаете массив ThreadInfos, который описывает все потоки в JVM.

7) Из TheadInfo # getThreadState () вы можете проверить, является ли состояние ThreadState.BLOCKED

Вы должны использовать примитивы межпроцессного взаимодействия в своих рабочих процессах, чтобы уведомить приложение контроллера о том, что они готовы к приему данных.

Вы не можете делать предположения о том, как дочерние процессы реализуют чтение своих сокетов. Они могут использовать recv, или select, или poll, и т. Д. Для ожидания сетевых данных.

Здесь есть несколько моментов. Планировщик Linux достаточно умен, чтобы предотвратить заблокированную задачу. Это означает, что если вы вызываете receive () и ничего не ожидает получения, ваша задача, вероятно, будет переведена в спящий режим до того времени, когда вызов вернется. Вам не нужно обрабатывать планирование; ядро Linux сделает это за вас.

Тем не менее, если вам нужно знать, заблокирована ли ваша задача из какого-либо приложения-демона, если вы хотите написать LKM, почему бы просто не включить задачу в интересующий вас список задач и проверить его состояние?

Конечно, простая проверка состояния задачи может не сказать точно, чего вы хотите. Если ваше состояние задачи TASK_INTERRUPTIBLE , оно говорит только о том, что ваша задача ожидает что-то , но выяснить, что это такое, может быть не так уж просто. Точно так же ваша задача может находиться в состоянии TASK_RUNNING и на самом деле не работать на процессоре в текущий момент (но, по крайней мере, в состоянии TASK_RUNNING вы знаете свою задачу не заблокирован).

Вы можете просто отправить сигнал QUIT (Ctrl- \ на консоли), чтобы получить дамп потока.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top