Thread
O. Overview
Thread를 각각 구분지어 이해하고 확장해본다
- 하드웨어 쓰레드, OS 쓰레드, User 쓰레드를 각각 구분 할 수 있다.
- 쓰레드의 특징을 알아본다.
- 쓰레드 풀이 왜 필요한지 이해해본다.
1. 하드웨어 쓰레드(Hardware Thread), OS 쓰레드(Native Thread), 유저 쓰레드(User Thread)
하드웨어 쓰레드(Hardware, H/W Thread)
하드웨어 쓰레드는 CPU Core에서 사용되는 Thread (OS 관점에서는 가상의 코어)
CPU란?
-
중앙처리 장치
-
컴퓨터 내에서 연산(computing)을 하고 메모리에서 읽어온 데이터를 연산(computing)하는 일련의 과정 처리를 하는 장치
Core 란?
- Cpu가 처리하는 단위(Unit)
- 1 CPU(싱글 CPU) / 2 Core (듀얼 코어) : 1개의 CPU에서 2개의 Core가 병렬 처리함
다시 하드웨어 쓰레드란?
CPU의 Core에서 사용되는 Thread
OS 쓰레드 (OS Thread, Native Thread)
OS Thread는 CS에서 일반적으로 쓰레드라고 불리는 것을 의미하며 CPU에서 실제로 실행되는 단위
CPU 스케쥴링의 대상이 되는 쓰레드
OS Thread 관리 주체: 커널 (Kernel)
User Thread (User Level Thread)
사용자 프로그램에서 사용되는 쓰레드. 개발자가 작성(생성)한 쓰레드
NOTE : Java의 경우 쓰레드 생성시 User 쓰레드와 OS 쓰레드는 One To One 관계
1 User Thread 당 1개의 OS Thread 연결
2. 쓰레드의 특징
일반적인 쓰레드(OS thread)의 특징은
- 프로세스는 한개 이상의 쓰레드 가질 수 있다
- CPU에서 실행되는 단위(unit of execution)
- 같은 프로세스의 쓰레드들끼리 컨텍스트 스위칭은 가볍다
-
쓰레드들은 자신들이 속한 프로세스의 메모리 영역을 공유
->
속한 프로세스의 메모리 영역을 공유하기 때문에 컨텍스트 스위칭이 가볍고 메모리 영역을 공유해서 데이터 공유가 쉽다.
백엔드 서버에서 요청이 많이 들어오는 경우?
java로 작성한 백엔드 서버 기준에서 Request 1개당 1개의 Thread 생성된다.
1개의 User Thread는 one to one 관계이므로 1개의 OS thread 생성된다. 쓰레드 생성이 OS thread까지 연결되어 생성되기 때문에 생성 시간이 오래 걸린다. 이렇게 되면 요청에 대한 처리가 오래 걸린다.
쓰레드가 계속 생성 되면 컨텍스트 스위칭이 더 많이 발생한다.
더 요청이 많이 들어오면 메모리가 고갈된다.
이렇게 되면 전체 시스템에 영향을 끼치게 될 수 있다. 이걸 방지하기 위해서 쓰레드 풀로 관리한다.
3. 쓰레드 풀(Thread Pool)
프로세스 내에서 쓰레드의 생성과 수거가 빈번하게 일어나는 건 비용이 많이 든다. 아무리 쓰레드의 컨텍스트 스위칭이 가볍다고 해도 생성과 수거가 많이 일어나면 overhead가 크기 때문에 성능 저하가 일어난다.
쓰레드 풀에 일정 쓰래드의 미리 생성하여 사용하고 재사용하면 성능 저하를 방지하고 일정 개수만큼 운영하여 쓰레드가 무한으로 발생하는 것을 방지한다.
// threadPool 생성 시
Executors.newFixedThreadPool(10);

Thread Pool의 Queue size가 Integer.MAX_VALUE로 되어 있어 설정 필요하다.

Reference
쉬운코드 - 스레드 풀(thread pool)은 왜 쓰는 걸까요? 어떻게 쓰는게 잘 쓰는 걸까요? 지금 이 영상으로 스레드 풀! 깔끔하게 정리하시죠!