[Linux] 프로그램 vs 프로세스 vs 스레드 정리

mommers·2026년 2월 3일

Linux

목록 보기
35/59

썸넬


프로그램? 프로세스? 스레드?


📦 1. 프로그램 (Program)

정의

  • 저장 장치에 저장된 실행 가능한 파일
  • 실행되기 전의 정적인 상태
  • 코드와 데이터의 집합

특징

  • 디스크에 존재하는 파일 (.exe, .out 등)
  • 아직 메모리에 로드되지 않음
  • 실행되기를 기다리는 상태

🏃 2. 프로세스 (Process)

정의

  • 실행 중인 프로그램
  • 메모리에 로드되어 CPU를 할당받을 수 있는 상태
  • OS가 관리하는 실행의 기본 단위

특징

  • 독립적인 메모리 공간 보유
    • 코드(Code)
    • 데이터(Data)
    • 힙(Heap)
    • 스택(Stack)
  • 고유한 PID(Process ID) 부여
  • 다른 프로세스와 메모리 공유 불가 (격리됨)
  • 프로세스 간 통신은 IPC 필요 (Pipe, Socket 등)

메모리 구조

┌─────────────────┐
│   Stack         │ ← 지역변수, 함수 호출
├─────────────────┤
│   Heap          │ ← 동적 할당 (malloc)
├─────────────────┤
│   Data          │ ← 전역변수, 정적변수
├─────────────────┤
│   Code (Text)   │ ← 실행 코드
└─────────────────┘

예시

# 프로그램 실행 → 프로세스 생성
./my_program &

# 프로세스 확인
ps aux | grep my_program
pi  1234  0.0  0.1  my_program

# PID: 1234

🧵 3. 스레드 (Thread)

정의

  • 프로세스 내부의 실행 흐름
  • 프로세스의 자원을 공유하는 경량 실행 단위
  • "Light Weight Process"

특징

  • 같은 프로세스 내 스레드들은 메모리 공유
    • 코드, 데이터, 힙 공유 ✅
    • 스택만 독립적 ❌
  • 고유한 TID(Thread ID) 보유
  • 프로세스보다 생성/전환 비용 적음
  • 빠른 데이터 공유 가능 (단, 동기화 필요)

메모리 구조 (멀티스레드)

프로세스 메모리 공간:
┌─────────────────┐
│ 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;
}

1. 비교

구분프로그램 (Program)프로세스 (Process)스레드 (Thread)
상태정적 (Passive)동적 (Active)동적 (Active)
위치디스크 (HDD/SSD)메모리 (RAM)메모리 (RAM)
정의코드 덩어리 (Binary)자원 할당의 단위 (컨테이너)CPU 실행/스케줄링의 단위
자원 공유-공유 안 함 (독립적)메모리 공유 (Code, Data, Heap)
통신-IPC (복잡, 느림)공유 메모리 (간단, 빠름, 동기화 필요)

2. 메모리 구조 (중요)

1. 프로세스

  • 부모-자식 간이라도 메모리 공간이 완전히 분리됨 (Copy-on-Write).
  • 한 프로세스가 죽어도 다른 프로세스에 영향 없음.

2. 스레드

  • 공유 : Code, Data(전역변수), Heap(동적할당), File Descriptor.
  • 독립: Stack(지역변수, 함수호출), Register(PC, SP).
  • 주의: 하나의 스레드에서 메모리 침범(Segfault) 발생 시, 프로세스 전체가 죽음.

3. 리눅스 특이사항

• PID: 리눅스 커널은 스레드도 내부적으로는 '가벼운 프로세스(LWP)'로 취급하여 고유의 ID를 가집니다 (TID). 하지만 사용자 입장에서는 PID 하나로 묶여 보입니다.
• 생성: 프로세스는 fork()로 복제하지만, 스레드는 pthread_create() (내부적으로 clone()) 시스템 콜을 사용합니다.

썸넬 Reference : https://velog.io/@gparkkii/ProgramProcessThread

profile
임베디드 개발자가 되기 위해 공부중입니다!

0개의 댓글