리눅스에서 수신자 () 호출에서 프로세스가 차단 된 상태에서 기다리고 있는지 알 수 있습니까?

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

문제

저의 주요 목적은 한 번의 호출을 수신하고 차단 될 때까지 라운드 로빈 방식으로 하나씩 프로세스를 실행하는 것입니다. 실행이 대기열의 다음 프로세스로 전환되도록하는 것입니다. Java로 코딩 된 컨트롤러 응용 프로그램이 있으며 runtime.getRuntime (). exec ()를 사용하여 이러한 프로세스 (Java 응용 프로그램이기도)를 실행하고 프로세스 개체 인 리턴 값을 유지합니다.

이 목적을 달성하려면 수신자 () 호출 (또는 해당 상태가 차단 된 상태)을 캡처하고 컨트롤러 (마스터) 응용 프로그램에 알려야합니다.

이것이 가능하다면 원하는만큼 낮은 수준으로 갈 수 있습니다. 첫 번째 생각은 드라이버 로부터이 정보를 얻은 다음 컨트롤러 Java 응용 프로그램에 알려주는 것이 었습니다. Send and Ever 작업을 캡처하는 Linux 커널 네트워크 모듈을 작성했지만 Socket.receive () 함수는 네트워크 드라이버에 아무것도 말하지 않습니다.

따라서 옵션은 JVM 에서이 정보를 얻거나 Linux 커널 모듈을 통해 Linux 명령에서 가져 오는 것입니다.

당신의 제안은 무엇입니까?

도움이 되었습니까?

해결책

스레드가 차단되었는지 또는 정확히 무엇을 차단했는지 알고 싶다면 스레드 덤프를 가져 가거나 다음과 같은 도구를 사용할 수 있습니다. jvisualvm 프로세스에 첨부하고 살펴 보려면 (jvisualVM에서 프로세스에 첨부하고 스레드 덤프를 가져간 다음 각 스레드의 활동을보십시오).

다른 팁

당신은 보셨습니까? SystemTap? 최근 Fedora 시스템에서 쉽게 구할 수 있어야합니다.

최고의 앤더스

이것이 도움이 될지 모르겠지만 로컬 첨부를 사용하여 컴퓨터의 Java 스레드 상태에 대한 정보를 얻을 수 있습니다.

1) ClassPath에 도구를 추가하고 virtualMachine.list ()를 사용하여 실행중인 JVM 시스템에서 도구를 사용하여 컴퓨터에서 실행됩니다.

2) virtualmachine.attach (virtualMachineScriptor)를 사용하여 처리 된 JVM에 연결

3) 로컬 커넥터 주소, vm.getAgentProperties ().

4) JMXConnectorFactory.newjmxConnector (...)를 사용하여 JVM에 연결하십시오.

5) jmx 연결에서 threadmxbean을 조회합니다.

6) ThreadMxBean에서 JVM의 모든 스레드를 설명하는 스레드 딘 포스 배열을 얻습니다.

7) theadinfo#getThreadState ()에서 주가 ThreadState.Blocked인지 확인할 수 있습니다.

작업자 프로세스에서 간호 간 통신 프리미티브를 사용하여 컨트롤러 애플리케이션에 데이터를 수신 할 준비가되었음을 알립니다.

어린이 프로세스가 소켓 읽기를 구현하는 방법에 대해 가정 할 수는 없습니다. 네트워크 데이터를 기다리기 위해 RECV, SELECT 또는 SELECT 또는 POLL 등을 사용할 수 있습니다.

실제로 여기에는 몇 가지 요점이 있습니다. Linux 스케줄러는 차단 된 작업을 선점 할 수있을만큼 똑똑합니다. 즉, 수신 ()에게 전화를 걸고 받기를 기다리는 것이 없다면, 전화가 돌아올 때까지 당신의 임무는 아마도 잠을 자게 될 것입니다. 일정을 처리 할 필요가 없습니다. Linux 커널이 당신을 위해 그것을 할 것입니다.

즉, 작업이 일부 데몬 응용 프로그램에서 차단되었는지 여부를 알아야한다면 LKM을 기꺼이 작성하려는 경우 관심있는 작업 목록에서 작업을 받고 상태를 확인하지 않겠습니까?

물론, 단순히 과제 상태를 확인하면 원하는 것을 정확히 알려주지 않을 수도 있습니다. 당신의 작업 상태 인 경우 TASK_INTERRUPTIBLE, 그것은 당신의 작업이 기다리고 있음을 알려줍니다. 무엇, 그러나 그것이 무엇인지 알아내는 것은 사소한 문제가 아닐 수도 있습니다. 마찬가지로, 당신의 작업은 a TASK_RUNNING 상태와 실제로 현재 순간에 CPU에서 실행되지 않습니다 (그러나 적어도 TASK_RUNNING 당신은 당신의 작업이 차단되지 않았다는 것을 알고 있습니다).

Quit 신호 (콘솔에서 ctrl- )를 보내 스레드 덤프를 얻을 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top