티스토리 뷰

web

[WIP 230113]멀티 스레드

kirinman 2023. 1. 13. 01:14

먼저 차근차근 정리해보자.

운영체제에서는 실행 중인 하나의 애플리케이션을 프로세스라고 부른다.
그리고 하나의 애플리케이션은 멀티 프로세스를 만들기도 한다. (메모장을 두 개 켜는 것을 생각해보기!)

 

운영체제에서는 두 가지 이상의 작업을 처리하는 멀티 태스킹을 할 수 있도록 cpu나 메모리 자원을 적당히 할당해준다.

그리고 한 프로세스 내에서 두 가지 이상의 작업을 처리하는 멀티 태스킹이 가능한 애플리케이션도 있다.
(카카오톡이 문자를 보내는 것과 파일전송 기능도 가지고 있는 것 떠올리기!)

이것이 가능한 이유가 바로 멀티 스레드에 있다.

 

스레드는 하나의 작업을 수행하기 위한 코드라고 생각하면 이해하기 쉽다.

프로세스안에 스레드가 2개라면 2개의 코드 실행 흐름이 생긴다는 뜻이다!

 

위의 내용을 정리하면 아래 그림처럼 된다.

일단 스레드를 하나만 사용하는 경우를 생각해 보자.

클라이언트에서 WAS로 요청이 들어오면 스레드를 할당하고 서블릿을 호출해, response에 담긴 내용으로 WAS가 http응답 정보를 생성해 보내줄 것이다.

 

이렇게 단일 요청이 들어왔을 때에는 문제가 없다.
만약 스레드를 하나만 사용하는데 다중 요청이 오게 되었을 때 나타날 수 있는 문제를 생각해 보자.

그림이 워낙 이상해서 알아먹기 힘든데, 대충 첫번째 클라이언트의 요청을 처리중에 뭔가 문제가 생겨 응답이 지연되어서 두번째 클라이언트도 대기중인 상황이다. 이렇게 되면 둘 다 죽어버리는 문제가 발생하게 된다. 

 

이런 문제를 극복하기 위한 방법으로 요청이 올 때마다 스레드를 생성하는 방법이 있다.
(스레드 생성은 WAS가 알아서 처리한다.)

굳이 그림을 그리자면 이렇게..?

당연하지만 이 방식에는 장점도 있지만 단점도 명확하다.

장점은 

- 동시 요청을 처리할 수 있다는 것

- 리소스 (CPU나 메모리)가 허용하는 한, 계속 처리가 가능하다는 것

- 하나의 스레드가 죽어도 다른 스레드는 정상으로 작동한다는 것

 

단점으로는

- 스레드 생성비용이 비싸다! (스레드를 생성할 때 CPU를 많이 잡아먹는다고 한다.)

- 요청이 올때마다 스레드를 생성하면 응답속도가 늦어진다.

- 스레드는 컨텍스트 스위칭 비용이 발생한다.

(스레드는 결국 CPU의 코어 수만큼 돌아가는데,
코어 수 이상의 요청이 왔을 때 하나의 요청을 처리하고 다음 요청으로 넘어갈때 발생하는 비용을 컨텍스트 스위칭 비용이라고 한다.)

- 스레드 생성에 제한이 없어, 요청이 너무 많으면 리소스 임계점을 넘어 서버가 죽을 수 있다.

이러한 문제들을 해결하기 위해 등장한 것이 바로 스레드 풀이다!

(요청이 들어올때 마다 스레드 풀에서 놀고있는 스레드를 하나씩 가져간다고 생각하자!)

안넣느니만도 못한 그림인데 

여튼 요지는 요청이 오면 스레드 풀에서 스레드를 하나씩 가져가서 처리하는 것이다.

 

이렇게 되면 스레드가 미리 생성되어 있기 때문에 스레드를 생성하고 종료하는 비용이 절약되고 응답시간이 빠르다는 장점이 있으며, 

스레드의 최대치를 정할 수 있기 때문에 요청이 너무 많이 와도 안전하게 처리할 수 있다.

(물론 접근하지 못한다는 페이지나 뭐가 나오겠지만!)

댓글