본문 바로가기

Programming/CS

싱글 스레드와 멀티 스레드

싱글 스레드와 멀티 스레드를 각각 언제 써야 할까?

 

싱글 스레드? 하나의 스레드가 하나의 일을 끝내고, 그 다음 일을 시작한다. (하나의 스레드가 일을 할 동안, 다른 일은 아무것도 못한다. 기다려야 한다!)

하나의 레지스터와 스택으로 표현

멀티 스레드? 같은 일을 두 개의 스레드가 짧은 시간동안 번갈아가며 수행한다. (예를 들어, 한 스레드가 사용자의 입력을 받는 일을 하는동안 다른 스레드는 다른 일을 처리할 수 있다.)

각 스레드가 고유한 레지스터와 스택을 갖고 있다.


🤔 그럼 멀티 스레드로 작업하는게 더 효율적이지 않을까? 아니다!

멀티 스레드는 context switching 시간(스레드 전환 시간)이 추가된다.


Node.js의 싱글 스레드 (이벤트 루프) vs Spring의 멀티 스레드

Node.js의 이벤트 루프

  1. 웹 서버는 요청이 들어오면 이벤트 큐에 요청을 배치한다.
  2. 이벤트 루프 싱글 스레드가 요청을 하나씩 처리한다.
  3. 요청 중 Blocking I/O를 요구하는 작업이 있다면 스레드에 할당한다. (그동안 이벤트 루프는 다른 일을 한다)
  4. 스레드는 요청을 처리하고 응답을 준비한다.
  5. 스레드는 응답을 이벤트 루프에게 보낸다.
  6. 이벤트 루프는 응답을 클라이언트에게 보낸다.

👍 점점 더 많은 동시에 발생하는 클라이언트 요청을 처리하기 쉽다.

👍 멀티 스레드 방식보다 스레드를 덜 이용하기 때문에 메모리, 자원 소모가 적다.


Spring의 멀티 스레드

  1. 웹 서버는 요청이 들어오면 스레드 풀에서 스레드를 꺼내 요청을 할당한다.
  2. 스레드는 요청을 처리한다.
  3. 요청 중 Blocking I/O를 요구하는 작업이 있어도 해당 스레드가 처리한다. (처리 시간이 길어진다.)
  4. 스레드는 응답을 서버에게 보낸다.
  5. 서버는 응답을 클라이언트에게 보낸다.

👎 점점 더 많은 동시에 발생하는 클라이언트의 요청을 처리하기 어렵다.

👎 동시 요청이 증가할 때, 많은 스레드를 이용해야 하기 때문에 많은 메모리를 사용하게 된다.

👎 때때로, 모든 스레드가 일을 하고 있다면, 나머지 클라이언트 요청은 계속 대기열에서 기다리게 된다.

Nginx는 싱글스레드, Non-blocking방식, Apache Tomcat은 멀티스레드, Blocking 방식