관련 포스팅
Context Switching, IPC 등 개념은 위 포스팅에서 중간에 다뤘으므로 생략하겠습니다.
이번 글에서는 멀티 프로세스와 멀티 스레드에 대해 얘기해보려 합니다.
글의 순서는 다음과 같이 작성합니다.
1. 멀티 프로세스와 멀티 스레드
2. 멀티 스레드를 사용하는 이유
3. Interview: 아파치와 톰캣은 멀티 프로세스인가 멀티 스레드인가?
1. 멀티 프로세스와 멀티 스레드
참고) 위의 프로세스와 스레드에서 설명한 내용과 일부 겹치는 내용이 있을 수 있습니다.
💡💡 멀티 프로세스
멀티 프로세스는 하나의 프로그램을 여러 프로세스로 구성하여 각 프로세스가 하나의 작업을 처리하는 환경입니다.
- 프로세스는 운영체제로부터 CPU 시간, 주소공간, 독립된 메모리 영역(code, data, stack, heap)을 할당받습니다.
- 각 프로세스는 독립된 주소 공간에서 실행되어 다른 프로세스의 주소 공간에 접근할 수 없습니다. (독립적)
- 프로세스 간 IPC(Inter-Process-Communication)를 사용해 데이터를 주고 받습니다.
- 하나의 프로세스가 잘못 되어도 프로그램은 동작합니다.
- 브라우저 중 크롬 브라우저가 멀티 프로세스로 동작합니다.
장점
- 독립된 구조이기 때문에 안정성이 높습니다.
- 한 프로세스가 죽어도 다른 프로세스가 영향을 받지 않죠. 대신 느려질 순 있습니다. 다른 프로세스의 일을 자기가 더 해야하기에..
단점
- 각각 독립된 메모리 영역을 갖고 있어, 많은 메모리 공간과 CPU 시간을 차지하고 작업량이 많을 수록 오버헤드가 발생합니다.
- Context Switching 비용이 커 성능 저하가 따라올 수 있습니다.
위의 단점과 같이 멀티 프로세스 환경에서는 중복된 자원이 비효율적으로 관리되는 등의 문제들이 발생합니다.
그럴 때 사용하는 것이 멀티 스레드입니다.
💡💡 멀티 스레드
같은 프로세스 내에 둘 이상의 스레드를 동시에 실행하는 환경을 멀티 스레드 환경이라 부릅니다. (기본적으로 하나의 프로세스가 생성되면 하나의 스레드가 생성되고 이를 메인 스레드라 부릅니다.)
- 스레드는 프로세스 내에서 stack만 따로 할당받기 때문에 code, data, heap 영역은 공유합니다.
- 예 : 인터넷 익스플로어 (한 탭에 문제가 생기면 연결된 자원으로 인해 전체 탭이 멈추는 현상을 꽤 볼 수 있습니다.)
장점
- 적은 메모리 공간을 차지하고 Context Switching이 빠릅니다.
- 프로그램의 응답 시간이 단축되고 시스템의 처리율이 향상됩니다.
- 시스템의 자원을 공유하므로 시스템의 자원 소모가 감소합니다. (자원의 효율성 증대)
- 프로세스간 통신(IPC)에 비해 통신 비용이 절감됩니다. (더 간단!)
단점
- 여러 개의 스레드가 자원을 공유하기 때문에 동기화 문제를 고려해야합니다. (병목 현상, 데드락 등..)
- 하나의 스레드에 문제가 발생하면 전체 스레드에 영향을 미칩니다.
- 멀티 스레드를 사용하는 프로그래밍에서는 코드 작성과 디버깅하기가 까다로운 경우가 많다고 합니다.
➕ 이런 경우에 동시성 프로그래밍..Closure, Lambda, Functional Programming, Actor 등이 도움이 된다고 하네요 =)
2. 멀티 스레드를 사용하는 이유
위의 내용을 읽었다면 어느정도 예측할 수 있을 것입니다.
멀티 스레드를 사용하는 이유!!
운영체제가 시스템 자원을 효율적으로 관리하기 위해서는 멀티 스레드가 좋겠지요.
멀티 프로세스로 실행되는 작업을 멀티 스레드로 실행하게 되면, 프로세스를 생성하고 자원을 할당하는 시스템 콜이 줄어들기 때문에 자원을 효율적으로 관리할 수 있습니다.
앞서 말했듯, 스레드간의 통신 비용이 더 적기 때문에 통신의 부담이 줄어듭니다.
반면, 앞서 언급했듯 멀티 스레드는 자원의 효율성은 증가하지만, 👩💻동기화 문제가 발생할 수 있기 때문에 주의해야 합니다.
👩💻 동기화 : synchronized
스레드를 사용하는 클래스는 Runnable 인터페이스를 구현합니다.
그리고 오버라이드하는 run 메서드에 스레드에서 진행할 작업을 정의합니다.
run 메서드 내에는 동기화가 필요한 작업이 있을텐데요, 그 부분에 synchronized 블록으로 감싸주면 됩니다.
한 스레드가 해당 블록을 실행중일 때 다른 스레드는 대기 상태에 있게 됩니다.
아래의 틀 외에도 동기화하는 방법은 더 존재합니다.
synchronized(this) {
// 로직 처리
}
3. Interview: 아파치와 톰캣은 멀티 프로세스인가 멀티 스레드인가?
아파치는 정적인 데이터를 처리하는 웹 서버로, 기본적으로 멀티 프로세스로 구현되어 있습니다.
하지만 설정에 따라 멀티 쓰레드를 같이 운용할 수 있습니다. (멀티 프로세스 내에는 기본적으로 메인 스레드가 존재하고, 멀티 스레드로 확장할 수 있습니다.)
톰캣은 웹 애플리케이션 서버로, 요청을 처리하기 위한 Thread Pool을 관리하며
요청이 오면 Thread Pool 내에 쓰레드를 제공하여 요청을 처리하도록 합니다.
즉, 멀티 스레드를 제공합니다.
공부하며 작성한 글이니 잘못된 부분이 있을 수 있습니다.
잘못된 부분 발견 시, 계속해서 수정 예정입니다.
피드백과 댓글 환영입니다!
'Computer Science' 카테고리의 다른 글
[Network] TCP/UDP (0) | 2022.04.25 |
---|---|
[네트워크] 프로토콜과 OSI 계층 (0) | 2022.04.25 |
프로세스(Process)와 스레드(Thread) (0) | 2022.03.14 |
링킹 (Dynamic Linking vs Static Linking) (2) | 2022.02.17 |