🖥️ 프로세스(Process) 완전 정복
"프로그램은 죽어있는 설계도, 프로세스는 살아 숨 쉬는 실행"
🔵 프로세스란?
프로세스(Process) = 실행 중인 프로그램(Program in Execution)
하드디스크에 저장된 .exe 파일이나 .jar 파일은 그냥 정적인 파일일 뿐이다.
그 파일을 실행하는 순간 OS가 메모리를 할당하고 CPU 사용 권한을 부여하는데, 이 "생명력을 얻은 상태" 가 바로 프로세스다.
| 구분 | 상태 | 비유 |
|---|---|---|
| 프로그램 | 정적 (파일) | 주방에 놓인 요리 레시피 📄 |
| 프로세스 | 동적 (실행 중) | 요리사가 레시피 보며 실제로 요리 중인 과정 🍳 |
🧱 프로세스의 메모리 구조
OS는 프로세스 실행 시 독립적인 메모리 공간을 할당한다. 이 공간은 역할에 따라 4가지 영역으로 나뉜다.
| 영역 | 저장 내용 | 생존 기간 |
|---|---|---|
| Text | 기계어 코드 (명령어) | 프로그램 전체 생애 |
| Data | 전역 변수, static 변수 | 프로그램 전체 생애 |
| Heap | new로 생성한 객체 | 명시적 해제 or GC |
| Stack | 지역 변수, 매개변수, 리턴 주소 | 함수 호출~종료 |
Java 개발자 관점 🔍
public class MemoryExample {
static int staticVar = 10; // ← Data 영역
public static void main(String[] args) {
int localVar = 20; // ← Stack 영역
String obj = new String("Hello"); // ← Heap 영역 (참조는 Stack)
}
}
💡 Java의 GC(Garbage Collector) 가 Heap 영역의 더 이상 참조되지 않는 객체를 자동으로 해제한다. Stack은 메서드 종료 시 자동 소멸되므로 GC 대상이 아니다.
🪪 PCB (Process Control Block)
OS는 수많은 프로세스를 동시에 관리하기 위해 각 프로세스마다 '신분증' 같은 데이터 구조를 유지한다. 이것이 PCB(프로세스 제어 블록) 이다.
OS는 프로세스를 교체(Context Switch) 할 때 현재 PCB에 상태를 저장하고, 다음 프로세스의 PCB를 불러온다. 덕분에 CPU가 하나여도 여러 프로세스가 동시에 실행되는 것처럼 느껴진다.
🔄 프로세스 상태 흐름
⚔️ 프로세스 vs 스레드
| 구분 | 프로세스(Process) | 스레드(Thread) |
|---|---|---|
| 정의 | 실행 중인 프로그램 인스턴스 | 프로세스 내 실행 흐름 단위 |
| 메모리 | 독립된 메모리 (격리) | Heap, Data 영역 공유 |
| 생성 비용 | 높음 (무겁다) | 낮음 (가볍다) |
| 통신 방식 | IPC (복잡, 느림) | 공유 메모리 (간단, 빠름) |
| 장애 영향 | 프로세스 하나 죽어도 다른 프로세스 무사 | 스레드 하나 오류 시 프로세스 전체 위험 |
💡 Java의
Thread,Runnable,ExecutorService는 모두 스레드 기반이다. 같은 JVM 프로세스 내에서 Heap을 공유하기 때문에 멀티스레드 환경에서는 동기화(Synchronization) 에 주의해야 한다.
🛡️ 프로세스 격리(Isolation)가 중요한 이유
프로세스는 서로의 메모리를 절대 침범할 수 없도록 OS가 강제로 격리한다.
장점 — 한 프로세스가 비정상 종료되어도 다른 프로세스와 시스템 전체는 안전하다. 단점 — 프로세스 간 데이터 공유 시 IPC(Inter-Process Communication) 같은 복잡한 메커니즘이 필요하다.
[ 프로세스 A ] [ 프로세스 B ]
Stack Stack
Heap ✋❌🚫 Heap ← 직접 접근 불가
Data Data
Text Text
↕ IPC (파이프, 소켓, 공유 메모리 등)
바로 이 트레이드오프 때문에 스레드가 탄생했다. 같은 프로세스 내 스레드는 Heap을 공유하므로 빠른 통신이 가능하지만, 그만큼 동시성 문제(Race Condition, Deadlock) 에 노출된다.
📝 핵심 요약
| 항목 | 내용 |
|---|---|
| 프로세스 | 실행 중인 프로그램, OS가 독립 메모리 할당 |
| 메모리 구조 | Text / Data / Heap / Stack 4영역 |
| PCB | 프로세스 상태 저장 신분증, Context Switch에 사용 |
| 프로세스 격리 | 안정성 보장, 대신 IPC로 통신 |
| 스레드 | 프로세스 내 실행 흐름, Heap 공유로 빠르지만 동기화 필요 |