STUDY NOTE · 개념 정리
프로세스 vs 스레드 정리: 메모리 구조, 컨텍스트 스위칭, 동기화
etc
프로세스는 실행 중인 프로그램으로 운영체제로부터 독립된 메모리를 할당받는 단위이고, 스레드는 프로세스 안에서 실행 흐름을 나누는 단위로 같은 프로세스의 메모리를 공유한다.
1. 프로그램, 프로세스, 스레드
| 용어 | 설명 |
| 프로그램 | 디스크에 저장된 실행 파일 (정적) |
| 프로세스 | 메모리에 올라가 실행 중인 프로그램 (동적). OS가 자원을 할당하는 단위 |
| 스레드 | 프로세스 안의 실행 흐름. CPU가 실제로 스케줄링하는 단위 |
2. 메모리 구조
| 영역 | 저장하는 것 | 스레드 간 공유 |
| Code | 실행할 기계어 코드 | 공유 |
| Data | 전역 변수, static 변수 | 공유 |
| Heap | 동적 할당 객체 (new) | 공유 |
| Stack | 지역 변수, 매개변수, 함수 호출 정보 | 스레드마다 따로 |
스레드는 Stack과 레지스터(PC 포함)만 따로 갖고, Code·Data·Heap은 같은 프로세스의 다른 스레드와 공유한다.
3. 한눈에 비교
| 구분 | 프로세스 | 스레드 |
| 메모리 | 독립된 주소 공간 | 같은 프로세스의 메모리 공유 |
| 생성·종료 비용 | 큼 | 작음 |
| 컨텍스트 스위칭 | 무거움 (메모리 매핑까지 교체) | 가벼움 |
| 통신 | IPC 필요 (파이프, 소켓, 공유 메모리 등) | 공유 메모리로 바로 가능 |
| 안정성 | 하나가 죽어도 다른 프로세스에 영향 적음 | 하나가 죽으면 프로세스 전체가 죽을 수 있음 |
| 동기화 | 대부분 불필요 | 공유 자원 접근 시 필수 |
4. 컨텍스트 스위칭 (Context Switching)
CPU가 실행 중인 작업을 바꿀 때, 현재 상태(레지스터, PC 등)를 PCB/TCB에 저장하고 다음 작업의 상태를 불러오는 과정이다.
- 프로세스 전환: 주소 공간이 바뀌므로 TLB·캐시가 무효화되어 비용이 크다.
- 스레드 전환: 같은 주소 공간이라 저장·복원할 것이 적어 가볍다.
- 스위칭 동안 CPU는 실제 일을 하지 못하므로, 스레드를 무작정 늘리면 오히려 느려진다.
5. 멀티프로세스 vs 멀티스레드
| 구분 | 멀티프로세스 | 멀티스레드 |
| 예 | 크롬의 탭별 프로세스, Nginx 워커 | 톰캣 요청 처리 스레드 풀 |
| 장점 | 격리성·안정성 | 적은 자원, 빠른 통신 |
| 단점 | 메모리 사용량, IPC 비용 | 동기화 문제, 하나의 오류가 전체에 영향 |
6. 동기화 문제와 해결
여러 스레드가 같은 데이터를 동시에 수정하면 결과가 실행 순서에 따라 달라지는 경쟁 상태(Race Condition)가 생긴다. count++도 읽기 → 더하기 → 쓰기 세 단계라 중간에 끼어들 수 있다.
| 개념 | 설명 |
| 임계 영역 (Critical Section) | 공유 자원에 접근하는 코드 구간 |
| 뮤텍스 (Mutex) | 한 번에 하나의 스레드만 들어가도록 잠금 (소유권 있음) |
| 세마포어 (Semaphore) | 정해진 개수(N)만큼 동시 접근 허용 |
| 모니터 | 언어 차원의 동기화 (Java의 synchronized) |
| 데드락 (Deadlock) | 서로 상대가 가진 자원을 기다리며 영원히 멈춤 |
데드락의 4가지 조건은 상호 배제, 점유 대기, 비선점, 순환 대기이며 하나라도 깨면 막을 수 있다(예: 락을 항상 같은 순서로 획득).
7. 실제로 어떻게 적용되나
- 스프링 서버: 톰캣은 요청마다 스레드 풀의 스레드 하나를 배정한다. 싱글톤 빈은 모든 요청 스레드가 공유하므로 빈에 요청별 값을 필드로 두면 다른 사용자와 섞인다. "스레드는 Heap을 공유한다"는 개념이 그대로 적용된 사례다.
- 크롬: 탭마다 별도 프로세스로 띄워서 한 탭이 죽어도 다른 탭은 살아 있다. 대신 탭을 많이 열면 메모리를 많이 쓴다.
- 자바스크립트: 메인 스레드 하나에서 실행되므로 무거운 계산은 Web Worker(별도 스레드)로 옮긴다. Worker는 메모리를 공유하지 않고 메시지로 통신한다.
- 재고 차감: 동시에 주문이 들어오면 두 요청이 같은 재고를 읽고 각각 차감하는 경쟁 상태가 생긴다. 애플리케이션 락만으로는 서버가 여러 대일 때 막을 수 없어서 DB 락이나 조건부 UPDATE로 처리한다.
8. 면접 질문으로 정리
- Q. 프로세스와 스레드의 차이는? 프로세스는 독립된 메모리 공간을 가진 실행 단위이고, 스레드는 프로세스 내에서 Stack만 따로 갖고 Code·Data·Heap을 공유하는 실행 흐름이다.
- Q. 멀티스레드의 장단점은? 자원 공유로 메모리를 적게 쓰고 통신과 컨텍스트 스위칭이 빠르지만, 공유 자원에 대한 동기화가 필요하고 한 스레드의 오류가 전체에 영향을 줄 수 있다.
- Q. 컨텍스트 스위칭이란? CPU가 실행 대상을 바꿀 때 현재 상태를 저장하고 다음 대상의 상태를 복원하는 과정으로, 그동안 실제 작업을 못 하므로 오버헤드가 된다.
- Q. 뮤텍스와 세마포어의 차이는? 뮤텍스는 하나의 스레드만 임계 영역에 들어가게 하는 잠금이고, 세마포어는 지정한 개수만큼의 동시 접근을 허용한다.