
.exe, .out 등)
┌─────────────────┐
│ Stack │ ← 지역변수, 함수 호출
├─────────────────┤
│ Heap │ ← 동적 할당 (malloc)
├─────────────────┤
│ Data │ ← 전역변수, 정적변수
├─────────────────┤
│ Code (Text) │ ← 실행 코드
└─────────────────┘
# 프로그램 실행 → 프로세스 생성
./my_program &
# 프로세스 확인
ps aux | grep my_program
pi 1234 0.0 0.1 my_program
# PID: 1234
프로세스 메모리 공간:
┌─────────────────┐
│ Thread 1 Stack │ ← 독립
├─────────────────┤
│ Thread 2 Stack │ ← 독립
├─────────────────┤
│ Thread 3 Stack │ ← 독립
├─────────────────┤
│ Heap (공유) │ ← 공유
├─────────────────┤
│ Data (공유) │ ← 공유
├─────────────────┤
│ Code (공유) │ ← 공유
└─────────────────┘
#include
void* thread_func(void* arg) {
printf("Thread running!\n");
return NULL;
}
int main() {
pthread_t tid;
pthread_create(&tid, NULL, thread_func, NULL);
pthread_join(tid, NULL);
return 0;
}
| 구분 | 프로그램 (Program) | 프로세스 (Process) | 스레드 (Thread) |
|---|---|---|---|
| 상태 | 정적 (Passive) | 동적 (Active) | 동적 (Active) |
| 위치 | 디스크 (HDD/SSD) | 메모리 (RAM) | 메모리 (RAM) |
| 정의 | 코드 덩어리 (Binary) | 자원 할당의 단위 (컨테이너) | CPU 실행/스케줄링의 단위 |
| 자원 공유 | - | 공유 안 함 (독립적) | 메모리 공유 (Code, Data, Heap) |
| 통신 | - | IPC (복잡, 느림) | 공유 메모리 (간단, 빠름, 동기화 필요) |
Copy-on-Write).• PID: 리눅스 커널은 스레드도 내부적으로는 '가벼운 프로세스(LWP)'로 취급하여 고유의 ID를 가집니다 (TID). 하지만 사용자 입장에서는 PID 하나로 묶여 보입니다.
• 생성: 프로세스는 fork()로 복제하지만, 스레드는 pthread_create() (내부적으로 clone()) 시스템 콜을 사용합니다.
썸넬 Reference : https://velog.io/@gparkkii/ProgramProcessThread