본문 바로가기
📝 회고/✅ 22년 회고

[일일 회고] 22.03.29 - "프로세스와 LWP, Green - Native Thread, 싱글톤 레지스트리"

by kukim 2022. 3. 29.

📚 배운 것

"프로세스와 스레드"의 몇 가지 정리(호눅스 마스터 클래스 중)

자바의 스레드 생성

JVM 1.3 이전에는 JVM 내부적으로 스레드 모델을 가지고 있어 자체적으로 개발자가 멀티스레드 코드를 작성, 실행되면 user thread로 개발자 입장에선 thread이지만 실제 하드웨어, 운영체제와 상관없이 JVM이 관리하는 thread로 실행되었다. (green thread model이라고 함)

JVM 1.3 이후 개발자가 멀티스레드 코드를 작성, 실행되면 운영체제 커널이 관리하는 쓰레드인 kernel 스레드와 매핑되어 실행된다. (native thread model이라고 함)

(참고 : Green vs Native Threads and Deprecated Methods in Java)

 

리눅스의 스레드는 프로세스이다. (LWP(Light-weight process)와 Process)

user level 에서는 thread, process가 구별되지만 kernel 입장에서 모두 process로 관리하고 스케줄링된다.

다시 말해 user level에서 thread는 kerenl에서 LWP(light-weight process), 프로세스이다.

LWP는 Process와 다르게 프로세스 내 자원(메모리 공간, fd 테이블, 시그널 핸들러 테이블 등)을 공유하고 있다.

Linux POSIX : 스레드 생성 - pthread 라이브러리 스레드(LWP) 생성, 프로세스 생성 - fork()

(참고 : What are Linux Processes, Threads, Light Weight Processes, and Process State)

 

Linux 위에서 JAVA 스레드를 생성하면 프로세스(LWP)가 생성된다.

 

멀티 스레드로 I/O처리하면 빨라지는가?

I/O 처리는 커널 (시스템 콜)이 한다. 커널은 모든 프로세스가 공유하여 사용한다. 커널이 I/O관련 처리를 할 때 많은 요청이 와도 실제적으로 IO는 물리적으로 보통 하나밖에 없다. (e.g. 랜카드 1개) 멀티스레드로 I/O 요청을 많이 해도 하드웨어적으로 1개뿐이니 일반적으로 빨라지지 않는다.


Java WAS을 구현하며

단순 싱글톤 패턴과 싱글톤 레지스트리

Java WAS를 구현하고 있다. 구현하다보니 Servlet, Spring과 유사한 형태가 되었다. 프론트 컨트롤러 패턴을 도입하게 되었고 Controller인터페이스와 그 구현체 컨트롤러를 가지고 있다. 이때 클라이언트 요청마다 매번 컨트롤러를 생성할 수 없기에 싱글톤 구현을 하게 되었다. 하지만 단순 싱글톤 패턴의 단점(코드가 지저분해지고 매번 전역 상태)인 문제가 있다스프링은 싱글톤 형태의 오브젝트를 만들고 관리하는 '싱글톤 레지스트리'를 제공한다. 바로 ApplicationContext이다.(참고 : 토비의 스프링 p107~8)

컨트롤러가 점점 더 커지면 그때 가서 고려해보자.

 

 

댓글