반응형
프로세스 vs 스레드
프로세스는 OS가 프로그램 실행 시 만드는 독립된 단위다. 각자 메모리 공간을 가지고 있어서 서로 침범하지 못한다. java -jar로 Spring 앱을 띄우면 프로세스 1개가 생긴다.
스레드는 프로세스 안에서 실제로 코드를 실행하는 단위다. 같은 프로세스 안의 스레드끼리는 메모리를 공유한다. Tomcat은 HTTP 요청이 들어오면 스레드 1개를 할당해서 처리한다.
컨텍스트 스위칭
CPU는 한 번에 스레드 하나만 실행한다. "동시에 처리"처럼 보이는 건 CPU가 스레드들을 극도로 빠르게 오가기 때문이다. 이 전환 과정 자체가 CPU 자원을 소모한다.
스레드가 많아질수록 전환 비용이 증가해서, 일정 수를 넘으면 오히려 전체 처리 속도가 떨어진다.
Thread Pool
스레드를 매번 만들고 없애는 건 비용이 크다. 그래서 Tomcat은 스레드를 미리 만들어두고 재사용한다.
server:
tomcat:
threads:
max: 200 # 최대 스레드 수
min-spare: 10 # 최소 대기 스레드
accept-count: 100 # 대기 큐 크기
요청이 들어오면 풀에서 스레드를 꺼내 쓰고, 처리가 끝나면 반납한다. 풀이 꽉 차면 큐에서 대기하고, 큐도 꽉 차면 에러를 반환한다.
실무 연결 포인트
"배포 후 전체 API가 갑자기 느려졌다" → 원인을 DB에서 찾아라
특정 API의 쿼리가 느려서 스레드를 오래 점유하면, 풀이 소진되면서 다른 멀쩡한 API까지 대기하게 된다.
원인은 DB, 증상은 전체 서비스 지연.
반응형
'CS > OS' 카테고리의 다른 글
| OS 4편 - 실무 병목 찾기 (0) | 2026.04.08 |
|---|---|
| OS 3편 - Race Condition, synchronized (feat. volatile) (0) | 2026.04.07 |
| OS 2편 - 동기 vs 비동기, 그리고 언제 써야 하는가 (0) | 2026.04.07 |