[Java] Thread
자바의 Thread, Runnable
1.프로세스와 쓰레드
1) 프로세스
- 실행 중인 프로그램
- OS로부터 실행에 필요한 자원(메모리)를 할당받아 프로세스가 실행됨
- 프로그램을 수행하는 데 필요한 데이터 + 메모리 등의 자원 + 쓰레드
- Code + Data + Heap + Stack 영역으로 이루어짐
- Code : 실행 명령을 포함하는 코드들
- Data : static 변수 혹은 global 변수
- Heap : 동적 메모리 영역
- Stack : 지역변수, 매개변수, 반환값 등 일시적인 데이터
- Code + Data + Heap + Stack 영역으로 이루어짐
- 프로세스 생성과 함께 PCB(Process Control Block)가 생성됨
- Pointer : 대기상태의 큐를 구현하기 위해 필요한 포인터
- Process State : 현재 프로세스 상태
- Process Number : PID라 불리는 프로세스의 ID
- Program Counter : 중간에 중단되었을 경우 중단점을 가리키는 역할
2) 쓰레드
- 프로세스의 자원을 이용해서 실제로 작업을 수행하는 것
- 모든 프로세스는 최소 하나 이상의 쓰레드가 존재, 둘 이상의 쓰레드를 가진 프로세스를
멀티쓰레드 프로세스
라고 함 - 가벼운 프로세스,
경량 프로세스
라고 부르기도 함 - 프로세스의 공유자원을 사용할 수 있음
하나의 프로세스가 가질 수 있는 쓰레드의 개수 제한은 없음.
But, 쓰레드는 작업을 수행할 때 개별적인 메모리 공간(호출스택)을 필요로 하기 때문에 프로세스의 메모리 한계
에 따라 생성할 수 있는 쓰레드의 수가 결정됨
3) 멀티 프로세스 & 멀티 쓰레드
두 방식 모두 처리방식의 일종. 한 애플리케이션에 대한 서로 다른 처리방식으로 생각해야 두 개념을 동일 선상에 놓고 비교를 할 수 가 있다.
멀티 프로세스 | 멀티 쓰레드 |
---|---|
각 프로세스는 독립적 | 쓰레드끼리 긴밀하게 연결되어 있음 |
IPC를 이용한 통신 | 공유된 자원으로 통신 비용 절감 |
자원 소모적, 개별 메모리 차지 | 공유된 자원으로 메모리가 효율적 |
컨텍스트 스위치 비용이 큼 | 컨텍스트 스위치 비용이 적음 |
동기화 작업이 필요 ❌ | 공유 자원 관리 필요 ⭕️ |
프로세스 간 독립적이기 때문에 타 프로세스의 장애으로부터 독립적 | 한 쓰레드에서의 문제가 프로세스 전체에 영향을 줄 수 있음 |
- 멀티태스킹 : 다중작업. 대부분의 OS에서 멀티태스킹을 지원. 여러 개의 프로세스가 동시에 실행 가능.
CPU의 코어는 한 번에 단 하나의 작업만 수행 가능.
- 실제로 동시에 처리되는 작업의 개수는 코어의 개수와 일치
- 쓰레드의 수는 코어의 개수보다 훨씬 많기 때문에 각 코어가 아주 짧은 시간 동안 여러 작업을 번갈아 가며 수행함으로써 여러 작업들이 모두 동시에 수행되는 것처럼 보이게 함 (CPU 스케쥴링 알고리즘 중 Round-Robin Scheduling)
- ❗️
프로세스의 성능이 단순히 쓰레드의 개수에 비례하는 것은 아니며, 하나의 쓰레드를 가진 프로세스보다 두 개의 쓰레드를 가진 프로세스가 오히려 더 낮은 성능을 보일 수도 있음
4) 멀티쓰레딩 장단점
장점
- CPU 사용률 향상
- 자원의 효율적 사용
- 사용자에 대한 응답성 향상
- 작업이 분리되어 코드가 간결해짐
하나의 서버 프로세스가 여러 개의 쓰레드를 생성해서 쓰레드와 사용자의 요청이 일대일로 처리되도록 프로그래밍함.
❗️여러 쓰레드가 같은 프로세스 내에서 자원을 공유하면서 작업을 하기 때문에 발생할 수 있는 동기화
, 교착상태
(deadlock)과 같은 문제들을 고려해서 프로그래밍해야함
5) 멀티 코어
앞의 멀티 프로세스, 멀티 쓰레드는 OS에서 작업을 처리하기 위한 방식이다. 이와 달리 멀티 코어는 하드웨어 측면에 가깝다. 동시성
, 병렬처리
의 관점에서 멀티 코어를 파악할 수 있다.
동시성
하나의 코어에서 하나 이상의 프로세스(혹은 쓰레드)가 번갈아 가면서 진행되지만 동시에 진행되는 것처럼 보이는 것
병렬 처리 둘 이상의 코어에서 동시에 하나 이상의 프로세스(혹은 쓰레드)가 병렬적으로 진행되는 것
그냥 궁금해서
멀티쓰레드 서버
- 멀티스레드를 이용해 여러 사용자의 request와 response 처리
- 대부분의 웹 애플리케이션은 멀티스레드 기반
- 동기식 모델
- Spring
싱글쓰레드 서버
- 싱글 스레드 기반의 이벤트 루프 구조로 멀티 스레드 기반 모델보다 더 동시적으로 다수의 클라이언트 요청 처리 가능
- 멀티스레드 기반의 모델보다 상대적으로 적은 스레드가 필요(자원의 효율)
- 비동기식 모델
- Node.js
- Webflux : 적은 수의 쓰레드
References
- [네트워크] 싱글스레드 서버와 멀티스레드 서버 - 테리의 일상 (https://dheldh77.tistory.com/entry/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EC%8B%B1%EA%B8%80%EC%8A%A4%EB%A0%88%EB%93%9C-%EC%84%9C%EB%B2%84%EC%99%80-%EB%A9%80%ED%8B%B0%EC%8A%A4%EB%A0%88%EB%93%9C-%EC%84%9C%EB%B2%84)
- 남궁성님의 Java의 정석 3판
- https://www.youtube.com/watch?v=1grtWKqTn50