프로세스와 스레드

손주현·2025년 4월 11일
0
post-thumbnail

프로세스(Process)란?

프로세스는 실행 중인 프로그램의 인스턴스이다.

하나의 실행 파일(.exe, .py 등)을 더블 클릭하면, 운영체제는 그 파일을 메모리에 로딩하고 독립적인 실행 환경을 구성하며, 이때 만들어지는 것이 바로 프로세스이다.

  • 고유한 메모리 공간을 가짐 (코드, 데이터, 스택, 힙)

    • Code : 코드 자체를 구성하는 메모리 영역 (프로그램 명령)
    • Data : 전역 변수, 정적 변수, 배열 등
      초기화된 데이터는 Data 영역에 저장
      초기화되지 않은 데이터는 BSS 영역에 저장
    • Heap : 동적 할당 시 사용 (new(), malloc() 등)
    • Stack : 지역 변수, 매개 변수, 리턴 값 (임시 메모리 영역)
  • 운영체제에서 PID(Process ID)를 부여

  • 서로 독립적이기 때문에 다른 프로세스와 직접 메모리를 공유하지 않음


스레드(Thread)란?

스레드는 프로세스 내에서 실행되는 작업의 최소 단위이다.

모든 프로세스는 최소한 하나의 스레드를 가지고 시작하며, 필요에 따라 여러 개의 스레드를 가질 수 있다.
같은 프로세스 내 스레드들은 메모리 공간을 공유하기 때문에 협업이 빠르고 효율적이다.

  • 스레드는 Stack만 따로 할당받고 나머지 영역은 공유한다.

    • 코드, 데이터, 힙 영역은 공유
    • 스택은 스레드마다 별도로 존재
  • 스레드는 독립적인 동작을 수행하기 위해 존재 (독립적으로 함수를 호출할 수 있어야 함)

  • 함수의 매개 변수, 지역 변수 등을 저장하는 Stack 영역은 독립적으로 할당받아야 함

  • 경량화된 실행 단위로, 생성/소멸 비용이 적음


프로세스 vs 스레드 비교표

항목프로세스스레드
정의실행 중인 프로그램프로세스 내의 실행 단위
메모리독립된 공간 사용메모리 공유 (스택만 분리)
통신 방식IPC 필요 (느림)메모리 공유로 빠름
안정성충돌에 강함하나가 죽으면 전체 영향 가능
생성 비용상대적으로 큼가벼움, 빠름
예시크롬 창 2개탭 5개는 각각 스레드

메모리 구조 관점에서의 차이

1. 운영체제의 기본 메모리 영역 구조

  • 프로그램이 실행되면 메모리에 다음과 같은 영역들이 할당된다.
┌─────────────┐ ← 높은 주소
│ 스택 (Stack) │ ◀ 함수 호출, 지역 변수
├─────────────┤
│ 힙 (Heap)    │ ◀ 동적 메모리 (new, malloc 등)
├─────────────┤
│ 데이터 영역    │ ◀ 전역 변수, static 변수
├─────────────┤
│ 코드 영역     │ ◀ 실행 명령어 (기계어)
└─────────────┘ ← 낮은 주소

2. 프로세스의 메모리 구조

  • 각 프로세스는 위 구조 전체를 독립적으로 가지고 있음
  • 다른 프로세스와 코드/데이터/스택/힙 모두 분리됨
  • 하나의 프로세스가 죽거나 메모리를 잘못 써도 다른 프로세스에 영향 없음
[프로세스 A]
┌ 코드 영역     ┐
│ 데이터 영역    │
│ 힙 영역       │
│ 스택 영역     │

[프로세스 B]
┌ 코드 영역     ┐
│ 데이터 영역    │
│ 힙 영역       │
│ 스택 영역     │

장점: 안정성 높음
단점: 프로세스 간 통신이 느림 (공유 X → IPC 필요)

3. 스레드의 메모리 구조

  • 스레드는 같은 프로세스 내부에서 실행되는 작업 단위
  • 따라서, 코드 / 데이터 / 힙 영역은 공유하고, 스택만 개별로 가짐
[프로세스 A] (2개의 스레드)
┌ 코드 영역       ┐ ← 공유
│ 데이터 영역      │ ← 공유
│ 힙 영역         │ ← 공유
├───────────────┤
│ 스택 (스레드 1)  │ ← 개별
├───────────────┤
│ 스택 (스레드 2)  │ ← 개별
└───────────────┘

장점: 데이터 공유 빠름, 스레드 간 협업에 유리
단점: 한 스레드가 힙/데이터를 잘못 건드리면 전체가 충돌 가능 (동기화 이슈)

이러한 구조 덕분에 스레드는 협업이 빠르지만, 잘못된 접근 시 동기화 문제데이터 충돌이 발생할 수 있다.

왜 스택은 공유하지 않을까?

  • 스택은 함수 호출, 지역 변수 등을 저장하는 영역
  • 스레드마다 콜스택이 다르므로 반드시 분리되어야 함
  • 분리되지 않으면 A 스레드 함수가 B 스레드의 변수에 영향을 줄 수 있어 심각한 오류 발생 가능

실제 예시

  • 크롬 브라우저

    • 크롬은 탭마다 독립된 프로세스를 실행한다.
    • 탭 내에서는 렌더링, 자바스크립트, 네트워크 등 역할을 하는 스레드들이 함께 동작한다.
      → 탭이 다운되어도 다른 탭에 영향이 없는 이유이다.
  • 게임 클라이언트

    • 하나의 프로세스 안에 렌더링 스레드, 사운드 스레드, 네트워크 스레드 등 다수의 스레드가 병렬로 실행된다.
      → 빠른 반응성과 실시간 처리에 유리하다.
  • 웹 서버 (예: Node.js)

    • 단일 프로세스에서 이벤트 루프 기반 스레드 모델을 사용해 I/O 작업을 비동기 처리한다.
    • 고성능 처리를 위해 클러스터링으로 멀티프로세스를 병행하기도 한다.
profile
Clarinetist.dev

0개의 댓글