Process, Thread와 Spring Boot

Sue·2022년 3월 18일
0

Spring Boot

목록 보기
3/5

들어가며

장고를 이용해서 프로젝트를 진행했을 때, 웹 서버로 nginx를 이용하여 배포한 경험이 있다. 찾아보니 기본적으로 nginx는 동시 요청을 처리하기 위해 멀티 프로세스, 싱글 스레드 방식을 이용한다고 한다. 이후, 프로세스와 스레드의 개념과 스프링 부트에 내장되어 있는 톰캣에서는 동시 요청을 어떻게 처리하는지 궁금했다.

프로세스 (Process)

  • 프로그램이 실행되어 돌아가고 있는 상태.
  • 컴퓨터로 한 번에 단 하나의 작업만 할 수 있으면 안 됨. ex) 메일을 전송하는 동안 검색을 할 수 없고 화면이 멈춰버린다면?
  • 그렇기 때문에 컴퓨터(CPU(프로세서))는 여러 프로세스를 함께 실행시킨다. 작업 관리자에 들어가보면 얼마나 많은 프로세스들이 동시에 진행되는지 볼 수 있음. 여러 프로세스를 함께 돌리는 방법은 동시성, 병렬성, 또는 두 성질을 함께 이용하는 방식으로 이루어짐.

동시성 (Concurrency)

  • 조금씩 여러 작업을 돌아가면서 진행하는 방법. 사람은 느낄 수 없는 속도로 Context Switching(진행중인 작업을 바꾸는 것)이 일어나 마치 동시에 일어나는 것처럼 느껴짐. Context Switching 하는 다양한 방법과 알고리즘이 있다.

병렬성 (Parallelism)

  • 프로세서 하나에 코어 여러 개가 달려서 각각 동시에 작업들을 수행하는 것. (ex 듀얼 코어 쿼드코어 옥타코어 등 멀티코어 프로세서가 달린 컴퓨터에서 가능)

프로세스의 메모리 구조

스레드 (Thread)

  • 그런데 이런 멀티 프로세스 방식도 충분하지 않다! 웹 브라우저도 하나의 프로그램이기 때문에, 브라우저를 이용하는 동안 다운로드, 영상 시청, 웹 서핑 등의 다양한 작업을 동시에 할 수 있어야 함. ⇒ 한 프로세스 안에서도 여러 작업들이 동시에 진행되어야 함. ⇒ 멀티 스레드
  • 프로세스들은 컴퓨터의 자원을 분할해서 쓰지만 스레드는 프로세스마다 주어진 전체 자원을 함께 사용. → 속도 굿. 효율 굿.
  • but, 공유 자원에 스레드 여러 개가 동시에 접근하면 에러! Thread-safe(여러 스레드로부터 동시 접근이 발생해도 프로그램 실행에 문제가 없는 것) 하도록 주의하자.

Spring Boot 내장 Tomcat 웹 서버는?

  • 멀티 스레드 방식.
  • 일반적으로는 client 요청을 받으면 스레드를 생성하여 요청을 처리하지만, client가 많아질 수록 스레드 생성, 제거하는 비용 문제와 오버헤드가 발생
  • 따라서 톰캣은 Thread Pool 방식 이용. 미리 특정 갯수의 스레드를 스레드 풀에 만들어 두고, 가져다 씀. 클라이언트 요청이 풀에 있는 스레드 개수보다 많아지면 그 때 새로 스레드 생성. 스레드 재사용 가능하다는 장점. 적절한 Pool 개수가 중요.

스프링은?

  • 기본적으로는 Thread-safe 하지 않다. 코드를 어떻게 짜느냐에 따라 다른 것이다!
  • 하지만 스프링 빈은 무상태로 설계하는 관행, 스프링 빈의 전역 변수에는 불변 객체를 사용하는 관행이 있다. 그렇기 때문에 Thread-safe해진 것.

참고 영상

0개의 댓글