1. 정의 #
프로세스 (Process) #
- 실행 중인 프로그램의 인스턴스
- 운영체제로부터 독립된 메모리 공간, 자원을 할당받음
- 자체 주소 공간, 코드 영역, 데이터, 힙, 스택을 가짐
- 각 프로세스는 **PCB(Process Control Block)**로 커널이 관리
스레드 (Thread) #
- 프로세스 내부에서 실행되는 작업의 흐름 단위
- 코드, 데이터, 힙, 파일 디스크립터 등을 프로세스 내 다른 스레드와 공유
- 스택과 레지스터는 독립적으로 가짐
- **TCB(Thread Control Block)**로 커널/라이브러리가 관리
2. 구조 및 차이점 #
항목 | 프로세스 | 스레드 |
---|---|---|
정의 | 실행 중인 프로그램의 인스턴스 | 프로세스 내 작업 흐름 단위 |
메모리 구조 | 코드, 데이터, 힙, 스택 모두 독립 | 스택만 독립, 나머지 공유 |
자원 공유 | 없음 (IPC 필요) | 있음 (공유 메모리 기반) |
생성 비용 | 큼 (fork) | 작음 (pthread_create) |
컨텍스트 스위칭 | 주소 공간 전환 포함 → 비용 큼 | 주소 공간 공유 → 비용 적음 |
안정성 | 다른 프로세스에 영향 없음 | 하나의 오류가 전체에 영향 가능 |
3. Context Switching #
- CPU가 실행 중인 작업을 중단하고 다른 실행 단위로 전환하는 과정
- 필요한 정보: PC, 레지스터, 스택 포인터 등
- 스레드 간 전환은 주소 공간이 같아 빠르지만, 동기화 문제 발생 가능
- 프로세스 간 전환은 보호는 뛰어나지만, 오버헤드 큼
4. 실무 활용 예시 #
분야 | 설명 |
---|---|
웹 서버 | Nginx, Tomcat 등은 클라이언트 요청을 스레드 단위로 분리 처리 (스레드 풀 기반) |
브라우저 | Chrome: 탭은 프로세스, 탭 내 동작은 스레드로 분리 (안정성과 병렬성 모두 확보) |
멀티코어 CPU 활용 | Python은 GIL로 멀티 스레딩 성능 한계 → 멀티프로세싱 사용 (예: multiprocessing 모듈) |
게임 엔진 | 렌더링/네트워크/물리 계산을 개별 스레드로 병렬 처리 |
5. 관련 명령어 및 실습 #
명령어 | 설명 |
---|---|
ps -ef, top | 현재 실행 중인 프로세스 확인 |
htop | F2 → Threads 표시 옵션으로 스레드 확인 |
strace -p | 해당 프로세스의 시스템 콜 흐름 추적 |
pthread_create() | POSIX 스레드 생성 (C/C++) |
java.lang.Thread, Runnable | Java에서의 스레드 작성 방식 |
6. 자주 묻는 면접 질문 #
Q1. 프로세스와 스레드의 차이를 설명해주세요.
A. 프로세스는 실행 중인 프로그램의 독립적인 단위로, 운영체제로부터 별도의 메모리 공간을 할당받는다. 반면, 스레드는 프로세스 내부에서 실행되는 흐름 단위로, 같은 프로세스의 다른 스레드들과 메모리 공간을 공유한다.
항목 | 프로세스 | 스레드 |
---|---|---|
메모리 공간 | 독립 (코드, 데이터, 힙, 스택) | 스택만 독립, 나머지 공유 |
생성 비용 | 상대적으로 높음 | 가벼움 (빠른 생성, 스위칭) |
통신 방식 | IPC 필요 | 공유 메모리로 빠름 |
-> 스레드는 비용이 적고 통신이 빠르지만, 하나가 문제를 일으키면 전체 프로세스에 영향을 줄 수 있어 동기화와 예외 처리가 중요합니다.
Q2. 하나의 스레드가 죽으면 전체 프로세스에 어떤 영향을 주나요?
A. 스레드는 동일한 프로세스 공간 내에서 자원을 공유하기 때문에, 하나의 스레드에서 예외가 발생하거나 메모리를 오염시키면, 전체 프로세스가 비정상적으로 종료될 수 있다. 예를 들어, Java에서 한 스레드가 NullPointerException으로 죽을 경우, 예외 처리를 하지 않으면 전체 애플리케이션이 종료된다. 이를 방지하기 위해 try-catch, uncaughtExceptionHandler, 또는 서킷 브레이커 같은 전략을 사용한다.
Q3. 멀티 프로세싱과 멀티 스레딩 중 언제 어떤 것을 선택할 건가요?
A.
- 멀티 스레딩: I/O 중심 작업, 웹 서버 등 빠른 응답이 중요하고, 자원 공유가 필요한 경우
- 멀티 프로세싱: 계산 집약적(CPU-bound) 작업, 병렬 처리에 적합. 예: 이미지 처리, 머신러닝 학습
특히 Python은 GIL(Global Interpreter Lock) 때문에 CPU-bound 작업은 멀티 프로세싱이 더 적합히다. 반대로 Java나 Go 같은 언어는 멀티 스레딩이 강력하게 지원된다.