CS

[OS] 프로세스와 스레드

ayeongjin 2025. 2. 27. 00:15

 

📖 프로세스와 스레드의 차이: CPU 성능과 병렬 처리 관점

 

1. 프로세스와 스레드란?

컴퓨터에서 여러 작업을 수행할 때, 운영체제(OS)는 프로그램을 실행하고, 이를 효율적으로 관리해야 한다.
이때 프로세스(Process)스레드(Thread) 개념이 등장한다.

 


2. 프로세스(Process)란?

운영체제로부터 CPU 자원을 할당받는 작업의 단위

  • 실행 중인 프로그램의 인스턴스 (실행 중인 프로그램 하나)
  • 독립적인 메모리 공간을 할당받아 실행됨
  • 하나의 프로세스는 다른 프로세스에 직접 접근할 수 없다
    (프로세스 간 데이터 공유는 IPC (Inter-Process Communication) 방식 필요
  • 하나의 프로세스는 여러 개의 스레드를 포함할 수 있음

 

✅ 예시

  • 브라우저에서 탭 하나당 하나의 프로세스
  • VSCode, Chrome, Slack이 각각 하나의 프로세스

 

✅ 프로세스의 메모리 구조

각 프로세스는 다음과 같은 메모리 구조를 가진다.

영역 설명
Code 실행할 코드 (기계어)
Data 전역 변수, 정적 변수 저장
Heap 동적 할당된 메모리 공간
Stack 함수 호출, 지역 변수 저장

 

 


3. 스레드(Thread)란?

프로세스 내에서 실행되는 작은 실행 흐름 단위

  • 같은 프로세스 내에서 실행되는 실행 단위
  • Stack만 독립적으로 할당되고, Code, Data, Heap 영역은 공유
  • 공유 자원 접근 시 충돌 가능 → 동기화 필요
  • 하나의 프로세스가 여러 개의 스레드를 가지면 멀티 스레드(Multi-threading)

 

✅ 예시

  • JS 메인 스레드 vs 웹 워커
  • 하나의 페이지에서 비동기 작업 병렬 실행

 

✅ 스레드의 메모리 구조

공유되는 영역  독립적인 영역
Code, Data, Heap Stack

 

 


 

4. 프로세스 vs 스레드 차이 비교

구분  프로세스(Process)  스레드(Thread)
정의 실행 중인 프로그램 인스턴스 프로세스 내 실행 흐름 단위
메모리 구조 독립적인 메모리(Code, Data, Heap, Stack) Code, Data, Heap 공유, Stack만 독립적
CPU 자원 할당 운영체제로부터 CPU 자원 직접 할당 프로세스 내에서 자원 공유
통신 방식 IPC(Inter-Process Communication) 필요 (비효율적) 공유 메모리를 통해 빠른 통신 가능
실행 속도 프로세스 간 전환 비용 높음 (Context Switching) 스레드 간 전환 비용 낮음
안정성 하나의 프로세스가 종료되어도 다른 프로세스 영향 없음 하나의 스레드에서 오류 발생 시 전체 프로세스에 영향

 

 


 

5. 멀티 프로세스 vs 멀티 스레드

 

멀티 프로세스 (Multi-processing)

  • 여러 개의 독립적인 프로세스를 실행하는 방식
  • 각 프로세스는 자신만의 메모리 공간을 가지며 독립적으로 동작
  • 프로세스 간 통신(IPC)이 필요해 비용이 높고 오버헤드 발생
  • ex. 웹 브라우저 (크롬, 파이어폭스)
    • 크롬 브라우저는 탭마다 독립적인 프로세스를 실행하여 하나의 탭이 충돌해도 다른 탭에 영향을 주지 않음
    • 안정성을 높일 수 있지만, 메모리 사용량이 많아짐

 

멀티 스레드 (Multi-threading)

  • 하나의 프로세스 내에서 여러 개의 스레드가 실행되는 방식
  • 스레드끼리는 Code, Data, Heap을 공유해 빠른 통신 가능
  • 하지만, 공유된 메모리로 인해 동기화 문제가 발생할 수 있음
  • ex. 웹 서버 (Node.js, Apache, Tomcat)
    • 하나의 서버 프로세스가 여러 요청을 동시에 처리하려면 멀티 스레드 사용
    • 여러 요청을 처리하는 속도가 향상되지만, 스레드 간 동기화 관리 필요
    • Node.js의 worker_threads
    • 백엔드 서버에서 CPU-bound 작업 분산 처리
    • 프론트에서 Web Worker 사용하여 무거운 연산 분리

 


 

6. 멀티 스레드의 장점과 주의점

 

장점

  • 시스템 콜(System Call) 감소 → 프로세스를 생성할 때 발생하는 오버헤드가 적음
  • 자원 효율성 증가 → 프로세스보다 메모리 사용량이 적음
  • 빠른 통신 가능 → 스레드는 같은 메모리를 공유하므로 프로세스 간 통신(IPC)보다 빠름

❗️주의할 점 (동기화 문제)

  • 여러 스레드가 같은 데이터에 접근할 경우 동기화 문제가 발생할 수 있음
  • Mutex(뮤텍스), Semaphore(세마포어), Lock을 활용하여 동기화 관리 필요
  • 공유 자원 충돌(경쟁 상태, Race Condition) 방지해야 함

 

7. 프로세스 vs 스레드, 언제 사용해야 할까?

 

멀티 프로세스가 적합한 경우

  • 독립적인 작업을 병렬로 수행해야 하는 경우
  • 프로세스 간 충돌을 방지하고 안정성이 중요한 경우 (한 프로세스가 종료되어도 다른 프로세스에 영향 없음)
  • 리소스를 많이 사용하는 애플리케이션 (브라우저, 데이터베이스 등)

 

✅ 멀티 스레드가 적합한 경우

  • 동일한 데이터를 처리하는 작업이 많을 때 (웹 서버, 게임 엔진)
  • 빠른 통신이 필요하고, 실행 속도를 향상시켜야 할 때
  • 리소스를 효율적으로 사용하면서 동시에 여러 작업을 수행해야 할 때

 


8. 프론트엔드 개발에서의 실질적 연관

 

✅ JavaScript는 싱글 스레드 기반

  • 기본적으로 하나의 스레드에서 코드 실행
  • UI 렌더링도 동일 스레드에서 실행되므로, 무거운 연산이 있으면 렌더링 지연 발생

 

 Web Worker = 멀티 스레딩의 실질적 구현

  • JS에서 멀티 스레드처럼 쓰기 위한 수단
  • 백그라운드에서 별도 스레드로 연산 수행
  • UI 스레드와는 postMessage로 통신 → 프로세스 간 메시지 통신과 유사
// worker.js
onmessage = function (e) {
  const result = heavyCalculation(e.data);
  postMessage(result);
};
 
 

 

 SSR에서의 스레드 활용

  • Node.js는 싱글 스레드지만, libuv와 worker_threads를 통해 병렬 작업 가능
  • SSR 시에는 렌더링과 데이터 fetch를 동시에 처리할 수 있어야 하므로, 스레드 구조를 이해하고 block vs non-block 개념을 아는 것이 중요

 

 성능 최적화에서의 개념 응용

  • React의 Concurrent Mode
  • 웹 워커를 통한 오프스크린 캔버스 처리
  • WebAssembly를 웹 워커에 올려 연산 병렬화

이 모든 것은 결국 스레드를 어떻게 잘 다룰 것인가의 문제다.

 


 

9. 정리

  • 프로세스는 운영체제로부터 독립적인 자원을 할당받아 실행되는 단위
  • 스레드는 프로세스 내에서 실행되는 여러 흐름의 단위로, 메모리를 공유
  • 멀티 스레드는 자원을 효율적으로 사용하고 빠른 통신이 가능하지만, 동기화 문제를 고려해야 함
  • 즉, 멀티 프로세스는 안정성을, 멀티 스레드는 성능을 중시할 때 사용한다.