
프로세스는 실행 중인 프로그램의 인스턴스이다.
하나의 실행 파일(.exe, .py 등)을 더블 클릭하면, 운영체제는 그 파일을 메모리에 로딩하고 독립적인 실행 환경을 구성하며, 이때 만들어지는 것이 바로 프로세스이다.
고유한 메모리 공간을 가짐 (코드, 데이터, 스택, 힙)
운영체제에서 PID(Process ID)를 부여
서로 독립적이기 때문에 다른 프로세스와 직접 메모리를 공유하지 않음
스레드는 프로세스 내에서 실행되는 작업의 최소 단위이다.
모든 프로세스는 최소한 하나의 스레드를 가지고 시작하며, 필요에 따라 여러 개의 스레드를 가질 수 있다.
같은 프로세스 내 스레드들은 메모리 공간을 공유하기 때문에 협업이 빠르고 효율적이다.
스레드는 Stack만 따로 할당받고 나머지 영역은 공유한다.
스레드는 독립적인 동작을 수행하기 위해 존재 (독립적으로 함수를 호출할 수 있어야 함)
함수의 매개 변수, 지역 변수 등을 저장하는 Stack 영역은 독립적으로 할당받아야 함
경량화된 실행 단위로, 생성/소멸 비용이 적음
| 항목 | 프로세스 | 스레드 |
|---|---|---|
| 정의 | 실행 중인 프로그램 | 프로세스 내의 실행 단위 |
| 메모리 | 독립된 공간 사용 | 메모리 공유 (스택만 분리) |
| 통신 방식 | IPC 필요 (느림) | 메모리 공유로 빠름 |
| 안정성 | 충돌에 강함 | 하나가 죽으면 전체 영향 가능 |
| 생성 비용 | 상대적으로 큼 | 가벼움, 빠름 |
| 예시 | 크롬 창 2개 | 탭 5개는 각각 스레드 |
┌─────────────┐ ← 높은 주소
│ 스택 (Stack) │ ◀ 함수 호출, 지역 변수
├─────────────┤
│ 힙 (Heap) │ ◀ 동적 메모리 (new, malloc 등)
├─────────────┤
│ 데이터 영역 │ ◀ 전역 변수, static 변수
├─────────────┤
│ 코드 영역 │ ◀ 실행 명령어 (기계어)
└─────────────┘ ← 낮은 주소
[프로세스 A]
┌ 코드 영역 ┐
│ 데이터 영역 │
│ 힙 영역 │
│ 스택 영역 │
[프로세스 B]
┌ 코드 영역 ┐
│ 데이터 영역 │
│ 힙 영역 │
│ 스택 영역 │
장점: 안정성 높음
단점: 프로세스 간 통신이 느림 (공유 X → IPC 필요)
[프로세스 A] (2개의 스레드)
┌ 코드 영역 ┐ ← 공유
│ 데이터 영역 │ ← 공유
│ 힙 영역 │ ← 공유
├───────────────┤
│ 스택 (스레드 1) │ ← 개별
├───────────────┤
│ 스택 (스레드 2) │ ← 개별
└───────────────┘
장점: 데이터 공유 빠름, 스레드 간 협업에 유리
단점: 한 스레드가 힙/데이터를 잘못 건드리면 전체가 충돌 가능 (동기화 이슈)
이러한 구조 덕분에 스레드는 협업이 빠르지만, 잘못된 접근 시 동기화 문제나 데이터 충돌이 발생할 수 있다.
크롬 브라우저
게임 클라이언트
웹 서버 (예: Node.js)