Site Search :
Standard Enterprise XML Methodology Pattern Setting Tunning Other
Article Contributors
GuestBook
Javapattern Maven
XSourceGen Dev
JetSpeed Test
JLook Image
jLook Family Site


Multiprocess JVM Implemetation
 
Java를 이용해 ServerApplication을 구현할 때 기본이 될 수 있는 Multiprocess JVM을 구현하기 위한 기본 지식을 습득해보고자 합니다. 이제 우리는 하나의 JVM에서 다수의 Process를 생성하고 관리할 수 있게 됩니다. ( 2003/02/28 ) 155
Written by runjava - 김재환
2 of 2
 

4) MainThread가 종료될 때는 그에 포함된 ChildThread들도 함께 종료시켜야 합니다.

자바는 언어차원에서 MultiThread를 지원하고 있습니다. 만약 생성한 어떤 프로세스 내부에서 ChildThread 들을 생성하여 실행시킨다음 MainThread를 종료시키면 어떤 일이 발생할까요? MainThread가 종료되더라도 나머지 ChildThread들은 여전히 자기 할 일을 하게 됩니다.

이것을 해결하려면 ThreadGroup를 이용할 수 있습니다. ThreadGroup은 Thread들을 하나의 Group으로 묶어 동시제어를 할 수 있도록 도와줍니다. 그리고, 종료시에 ThreadGroup에서 stop()을 호출하면 여기에 등록된 모든 Thread들을 동시에 종료시킬 수 있습니다. 위에서 보신 소스를 수정할 필요가 생깁니다.
수정된 내용은 ProcessManager#startAnotherClass()를 참조하세요.

 

5) System.exit()를 호출하면 해당 프로세스만을 종료하고 JVM이 종료되는 것을 방지해야 합니다.

그렇다면, 누군가 프로세스를 종료하기 위해 간단하게 System.exit()를 이용했다면 어떤 일이 벌어질까요? 아마도 JVM이 종료됨과 동시에 원하지 않던 일이 발생하겠죠? 모든 프로세스가 종료되어 버립니다. 이 문제도 해결을 해야 할 것 같군요. 혹시 있을지도 모르는 불상사에 대비해야겠죠?

java.lang.SecurityManager를 상속받는 사용자 정의의 SecurityManager를 이용해서 해결합니다. ProcessManger에 이 SecurityManager를 등록하면 누군가 System.exit()를 호출할 때 checkExit() 가 호출될 것입니다. checkExit()에서는 System.exit()를 호출한 프로세스를 종료시키고는 Exception을 발생시켜 다음의 종료작업을 중지시키는 방법으로 처리를 했습니다. 코드는 ExitCatchingSecruityManger.java를 참조하세요.

아직 중요한 한가지 문제가 남아있습니다.
Multiprocess JVM은 주로 서버 애플리케이션을 제작할 때 구현됩니다. 그렇다면 여러 프로세스들이 모두 똑같은 Library를 사용해서 작동하지는 않겠죠? 즉, 각각의 프로세스마다 classpath등의 환경정보를 다르게 적용할 수 있어야 한다는 얘기입니다.
이 문제는 또 어찌 해결할 것인가? 일단 URLClassLoader를 확장해서 해결할 수 있다는 힌트만 드리구요. 자세한 소스와 해설은 다음 Multiprocess JVM(2)에서 계속 이어집니다.

 

3. 예제 프로그램 실행방법
  1) 내려받은 파일을 디렉토리에 압축을 풉니다.
  2) bin/test.bat 파일을 실행시키시면 됩니다.
  3) 소스는 /src 에 있습니다.

SampleApp.java , SampleApp2.java, MultiprocessTest.java 는 실행모습을 보기위한 샘플프로그램입니다. MultiprocessTest의 main()에서 SampleApp와 SampleApp2를 실행시키도록 되어 있습니다.

4. 예제 프로그램 설명
  MultiprocessTest에서 3개의 Process 를 생성합니다.
  Process1 : 여러개의 ChildThread를 생성하고 MainThread가 종료될 때 ChildThread들이 동시에 종료되는 것을 보여줍니다.
  Process2 : Process 내부에서 System.exit()가 호출될 때 자기 자신만을 종료시키고 나머지 Process들에게 영향을 끼치지 않는다는 것을 보여줍니다.
  Process3 : 끝까지 실행을 마치고 종료합니다.

 

유익한 자료가 되시길 바랍니다.

 
1 2
References
 
1) O'REILY NETWORK : Multiprocess JVMs 2001/09/25
2) The Java Language Specification : Chapter 17 Threads and Locks 3) This article Source : jvm_process_src.zip
Copyright ⓒ 2003 www.javapattern.info & www.jlook.com, an jLOOK co.,LTD