linux(debian)에서 java thread 생성관련 질문 입니다.
데비안 woody에 http://java.sun.com 에서 받은 J2SDK 1.4를 설치하고,
다음과 같은 소스를 작성한 후 컴파일 했습니다.
public class Hello { public static void main (String[] args) { try { Thread.sleep(10*1000); } catch (Exception x) {} } }
그리고 실행하였을때 프로세스상태 입니다.
xxxxx 220 210 12 00:01 pts/0 00:00:00 java Hello
xxxxx 221 220 0 00:01 pts/0 00:00:00 java Hello
xxxxx 222 221 0 00:01 pts/0 00:00:00 java Hello
xxxxx 223 221 0 00:01 pts/0 00:00:00 java Hello
xxxxx 224 221 0 00:01 pts/0 00:00:00 java Hello
xxxxx 226 221 0 00:01 pts/0 00:00:00 java Hello
xxxxx 227 221 0 00:01 pts/0 00:00:00 java Hello
xxxxx 228 221 0 00:01 pts/0 00:00:00 java Hello
xxxxx 229 221 1 00:01 pts/0 00:00:00 java Hello
단일 프로세스에서 작동이 되므로 프로세스가 하나만 생성되어야 할것
같은데 이상하게도 이렇게 각각의 프로세스로 9개가 생성되는 군요...
참고로 sun workstation의 솔라리스 9에서는 하나의 프로세스만이
생성되는 군요...
어떠한 이유로 이러한 차이를 보이는것이지 알고 싶습니다.
Linux의 ps는 LWP까지 모두 출력해주기 때문에 여러개의 프로세스로
Linux의 ps는 LWP까지 모두 출력해주기 때문에 여러개의 프로세스로 보이는 것입니다.
프로그램에서 하나의 쓰레드만을 생성했더라도, 가비지컬렉터같은 종류도 쓰레드로 동작하므로, 여러개의 쓰레드로 보이는 것이구요.
솔라리스의 ps에서도 -L을 붙여주면, LWP 리스트를 볼 수 있습니다.
일단 ps -ef 로 한 번 다시 보시면 뭔가 다른게 보이실 껍니다.
일단 ps -ef 로 한 번 다시 보시면 뭔가 다른게 보이실 껍니다.
계층 구조를 이루고 있는 것을 보실 수 있으신데요
리눅스에서는 쓰레드가 프로세스를 클론 하는 방식으로 구현 되어있습니다.
정확히 저 개수와 동일하게 매칭시켜서 설명드릴 수는 없지만
부트스트랩 부분과, 메인 쓰레드, GC 등으로 이루어지기 때문에
단일 프로세스가 돈다 생각할 수 있지만,
실제로는 다수의 쓰레드가 돌기 때문에 저런 같은 결과가 나옵니다.
다음은 리눅스의 쓰레드 구현에 대한 글을 검색해서 나온 글입니다.
http://kldp.org/script/bbs/read.php?table=qa2&no=5009
최근의 레드햇 릴리즈에서는(정확한 버전은 모르겠습니다만..8.x 이상인가요?) NPTL을 지원하는 것으로 아는데
여기서 테스트 해보면 어떻게 나올지 궁금합니다.^^;;
성능면에서도 어떨지 궁금하군요..^^
거기서 테스트 할려면 j2sdk1.4.1_02 이상을 써야된다고 하는 애기도 얼핏 들은 듯 합니다만,
혹시 테스트 해보신 분 계신가요?
ps. 답글 올릴려고 보니 다른 분이 먼저 올리셨더군요.
그래도 혹시 테스트 해본 분이 계실까봐 의견을 듣고자 그냥 올립니다.^^
LeanBlue in CyberWorld!!!
댓글 달기