-
[Java] 프로세스(Process)와 스레드(Thread)Java 2025. 11. 27. 19:03

1. 프로세스(Process)와 스레드(Thread)의 차이
이 둘을 구분하는 가장 확실한 기준은 '메모리의 공유 여부'입니다.
1) 프로세스 (Process)
- 정의: 운영체제로부터 자원을 할당받은 '실행 중인 프로그램'의 단위입니다.
- 핵심 특징:
- 운영체제로부터 독립된 메모리 공간(Code, Data, Heap, Stack)을 할당받습니다.
- 하나의 프로세스가 죽어도 다른 프로세스에 영향을 주지 않습니다 (독립성).
- 운영체제에서는 CPU, 메모리 등 자원을 할당받아 독립적으로 실행되는 작업의 단위입니다.
2) 스레드 (Thread)
- 정의: 하나의 프로세스 안에서 여러 개의 실행 흐름을 만들기 위한 단위입니다.
- 핵심 특징:
- 공유 영역: Code, Data, Heap 영역을 모든 쓰레드가 공유합니다.
- 독립 영역: 각 쓰레드는 자신만의 Stack과 PC(Program Counter), SP(Stack Pointer) 레지스터 값을 가집니다.
- 하나의 스레드에 문제가 생기면(예: 예외 발생) 같은 프로세스 내의 다른 스레드들도 함께 종료될 수 있습니다.
- CPU 입장에서 작업(스케줄링)의 단위입니다.
2. 스레드와 프로세스의 메모리 구조 비교
개발자로서 가장 중요한 차이점은 메모리 영역의 공유 범위입니다. 이를 이해해야 멀티스레딩 환경에서의 버그(동시성 문제)를 이해할 수 있습니다.
1) 프로세스 (Process): 완벽한 격리 프로세스는 운영체제로부터 가상 메모리(Virtual Memory) 전체를 독립적으로 할당받습니다.
- Code (Text): 실행할 프로그램의 코드가 저장되는 영역.
- Data: 전역 변수(Global), 정적 변수(Static)가 저장되는 영역.
- Heap: 런타임에 동적으로 할당되는 객체나 데이터가 저장되는 영역.
- Stack: 함수 호출 시 지역 변수, 매개 변수, 리턴 주소 등이 저장되는 영역.
- 특징: A 프로세스는 B 프로세스의 메모리 영역(Code~Stack)에 절대 접근할 수 없습니다. (운영체제의 메모리 보호 기능)
2) 스레드 (Thread): 효율적인 공유와 독립 스레드는 프로세스라는 울타리 안에서 생성되므로, 프로세스의 자원을 최대한 활용합니다.
- 공유 영역:
- Code: 모든 스레드는 동일한 프로그램 코드를 실행하므로 공유합니다.
- Data: 전역 변수나 Static 변수는 모든 스레드에서 공통으로 접근 가능합니다.
- Heap: new 키워드 등으로 생성된 객체(데이터)는 모든 스레드가 공유합니다. 이로 인해 스레드 간 데이터 통신이 매우 쉽지만, 동시성 문제의 원인이 되기도 합니다.
- 독립 영역:
- Stack: 스레드는 독립적인 함수 호출 흐름을 가져야 합니다. 따라서 함수 실행을 위한 스택 영역은 스레드마다 별도로 할당됩니다.
- PC (Program Counter) & Register: 각 스레드는 코드를 어디까지 실행했는지(문맥)를 따로 기억해야 하므로, 레지스터 값은 독립적으로 가집니다.
3. 전체 시스템에서의 관계
전체 컴퓨터 시스템을 놓고 보았을 때, 프로세스와 스레드는 포함 관계를 가집니다.

- OS ↔ Process: 운영체제(OS)는 자원 할당의 단위로 프로세스를 관리합니다. OS는 프로세스에게 "너가 쓸 메모리 방(Address Space)은 여기부터 여기까지야"라고 공간을 내어줍니다.

- Process ↔ Thread: 프로세스는 스레드의 컨테이너 역할을 합니다. 프로세스가 할당받은 메모리 공간 안에서 스레드들이 활동합니다. 최소 1개 이상의 스레드가 존재합니다.

- CPU ↔ Thread: CPU 스케줄러는 프로세스가 아닌 스레드를 실행 단위로 봅니다. CPU는 "어떤 프로세스 소속인지"는 따지지 않고, 당장 실행해야 할 스레드(Task)를 가져와서 연산합니다.
4. 메모리 구조로 인한 효과
이러한 메모리 구조(공유 vs 독립) 차이로 인해 개발 실무에서 다음과 같은 효과가 발생합니다.
1) 장점: 고효율과 빠른 통신
- 통신 비용 절감: 스레드끼리는 별도의 통신 규약(IPC 등) 없이, 힙 영역의 변수에 접근하는 것만으로 즉시 데이터를 주고받을 수 있습니다.
- 생성 및 전환 속도: 프로세스를 새로 만드는 것보다, 스택만 새로 할당하면 되는 스레드 생성이 훨씬 빠릅니다. 또한 공유하는 메모리(Code, Data, Heap) 덕분에 컨텍스트 스위칭 시 캐시 적중률(Cache Hit)이 높아 성능이 좋습니다.
2) 단점 및 주의점: 안전성 문제와 동기화
- 동시성 이슈 (Synchronization Issue): 여러 스레드가 힙 영역의 데이터(공유 자원)를 동시에 수정하려고 하면 데이터가 꼬이는 문제가 발생할 수 있습니다.
- 오류의 확산: 프로세스는 하나가 죽어도 나머지가 멀쩡하지만, 스레드는 공유 메모리를 쓰기 때문에 하나의 스레드가 잘못된 연산으로 예외를 발생시키면 프로세스 전체가 종료될 수 있습니다.
요약 표
구분 프로세스 (Process) 스레드 (Thread)
정의 실행 중인 프로그램 프로세스 내 실행 흐름 자원 공유 비공유 (완전 독립) 공유 (Stack/Register 제외) 통신 비용 높음 (IPC 필요) 낮음 (메모리 직접 접근) 오버헤드 큼 (생성/전환 비용 높음) 작음 (생성/전환 비용 낮음) 안전성 높음 (하나 죽어도 영향 없음) 낮음 (하나 죽으면 프로세스 종료) 'Java' 카테고리의 다른 글
[Java] Sync vs Async (0) 2025.12.01 [Java] Blocking/Non-blocking이란? (0) 2025.12.01 [Java] JVM의 Runtime Data Area (0) 2025.11.19 [Java] JVM이 무엇이고 Java 코드는 어떻게 동작할까? (0) 2025.11.18 SOLID 원칙 완벽 정리 (3) 2025.06.18