멀티 프로세스 vs 멀티 쓰레드
1. 언제 멀티 프로세스를 사용하고, 언제 멀티 쓰레드를 써야하는 가능한 구체적으로 설명해주세요
답변)
멀티 쓰레드를 사용하면, 쓰레드간 자원 공유가 가능하기 때문에, 쓰레드간 별도의 통신 오버헤드가 적습니다.
다만, 공유된 자원간의 읽고 쓰기가 빈번할 경우, 추가적인 오버헤드가 드는 동기화 기법을 사용해야 합니다.
자바에서 제공되는 동기화 방법은 synchronized 이다.
- synchronized 에 선언된 함수 내부에서 사용하는 메소드
1. wait() : 어떤 객체에 대해 스레드를 대기하게 만든다.
2. notify() : 객체에 대해 대기중인 스레드가 있을 경우 우선순위가 높은 스레드 하나만을 깨운다.
3. notifyAll() : 메소드는 대기중인 스레드 전부를 깨운다.
따라서, 인스턴스 간, 공유된 자원간의 읽고 쓰기가 여러 실행단계에서 일어나서, 동기화 이슈가 발생할 가능성이 높다면, 멀티 프로세스
사용을 고려하고,
공유된 자원간의 쓰기가 없는 경우에는 동기화 기법을 적용할 필요가 없기 때문에, 멀티 쓰레드를 고려해보면 좋을 거 같습니다.
여기서 스레들간 공유되는 영역에 대해 잠시 집고 넘어가자 !!
1. 힙 영역 : 생성된 자바의 객체들이 저장되는 부분, 모든 스레드에 의해서 공유되는 영역
2. 메소드 영역 : 함수영역으로 각 클래스 또는 인터페이스에 런타임 컨텍스트 풀영역, 메소드 생성자를 저장하는 영역으로 모든 스레드에
의해서 공유 되는 영역
3. 런타임 컨텍스트 풀 영역 : 클래스 또는 인터페이스의 class 변수, static 변수, class 객체의 레퍼런스를 저장하는 영역으로 스레드에
의해서 공유 되는 영역
4. 데이터와 메소드 스택 영역 : 스레드에 의해서 공유 되는 영역
공유되는 데이터 영역의 포함 관계는 객체(힙 영역) > 메소드(메소드 영역) > 변수(런타임 컨텍스트 풀 영역)