스레드란?
애플리케이션 하나하나 순차적으로 실행하는것이다
ex) 자바 메인 메서드를 처음 실행하면 main이라는 이름의 스레드가 실행된다
- 동시 처리가 필요하면 스레드를 추가로 생성한다
- 스레드가 없다면 애플리케이션 실행이 안된다.
- 스레드는 한번에 하나의 코드만 수행할 수있다
멀티스레드란?
- 하나의 프로세스를 다수의 실행 단위로 구분하여 자원을 공유하고 자원의 생성과 관리의 중복성을 - 최소화하여 수행 능력을 향상 시킨다
- 하나의 프로그램에서 동시에 여러 개의 일을 수행할 수 있도록 해준다 (사실 분산처리를 통해 동시에 실행되는 것 처럼 보이는 것)
요청마다 스레드 생성
장점
- 동시요청을 처리할수 있으며 스레드가 하나가 지연되도 나머지 스레드는 정상작동한다
- CPU와 메모리가 허용할 때까지 가능하다
단점
- 스레드 생성 비용이 비싸다
- 응답속도가 느려지며 컨택스 스위칭 비용이 발생한다
- 생성에 제한이 없어 CPU와 메모리의 한계점이 넘으면 서버가 죽을 수 있다
스레드풀
:작업처리에 사용되는 스레드를 제한된 개수만큼 정해놓고 작업큐 (Queue)에 들어오는 작업들을 하나씩 스레드가 맡아 처리하는 방식이다
특징
- 필요한 스레드를 스레드 풀에 보관하고 관리한다.
- 요청마다 스레드 생성의 단점을 보완한다
- 생성가능한 스레드의 최대치를 관리한다 (톰캣은 200개가 최대, 변경 가능)
작동원리
- 스레드가 필요하면 스레드 풀에서 꺼내서 사용한다
- 사용을 종료하면 다시 스레드풀에 쓰레드를 반납한다
- 모든 스레드가 사용중이어서 스레풀에 스레드가 없으면 기다리는 요청을 거절하거나 특정숫자만큼 대기하도록 설정한다.
장점
- 스레드를 생성하고 종료하는 비용(CPU)이 절약되고 응답 시간이 빠르다
- 생성 가능한 스레드의 최대치가 있으므로 많은 요청이 들어와도 기존 요청은 안전하게 처리할 수 있다
스레드풀의 적정 숫자
→ 애플리케이션 로직의 복잡도, CPU, 메모리, IO 리소스 상황에 따라 달라진다
→ 가장 정확한 방법은 성능 테스트를 하는것이다
- 최대한 실제 서비스와 유사하게 성능 테스트 시도한다
- 툴: 아파치 ab, 제이미터, nGrinder
WAS의 멀티 스레드
- 멀티스레드에 대한 부분은 WAS가 처리한다
- 개발자는 멀티 스레드에 신경 쓰지 않고 싱글 스레드 프로그래밍하듯이 개발하면 된다
- 멀티 스레드 환경이므로 싱글톤 객체는 주의해서 사용해야 한다