컴퓨터공학/운영체제

[컴퓨터공학/운영체제] 멀티프로세스 vs 멀티스레드, 기초부터 이해하기

코코무 2025. 3. 27. 11:26

🗂️ 개념 정리 및 실행 구조의 원리

프로그램(Program)

  • 개념:
    • 실행 가능한 정적인 코드의 집합으로 아직 실행되지 않은 상태
    • 운영체제에 의해 실행되기 전까지는 단순한 데이터일 뿐임
  • 예시: .exe 파일, .py 스크립트, .class 파일 등
  • 특징: 자체로는 실행되지 않고, 운영체제의 명령 해석기(쉘, 커널 등)에 의해 프로세스로 만들어져야 함

이 과정을 담당하는 주체가 바로 운영체제(Operating System)

 

 

운영체제(Operating System)

  • 역할:
    • 사용자가 프로그램을 실행하려고 하면, 운영체제가 그 요청을 받아들여 다음과 같은 일을 수행함
      1. 프로그램 파일을 디스크에서 읽어와 메모리에 로드
      2. 독립적인 메모리 공간을 할당
      3. 프로세스 제어 블록(*PCB)을 생성하고 PID를 부여
      4. 필요한 시스템 자원(파일, 입출력, 권한 등)을 할당
      5. 실행 대기 큐에 등록하여 CPU 스케줄링 준비
    • "정적인 프로그램"을 "실행 가능한 프로세스"로 변환해주는 중재자이자 관리자 역할 수행

*PCB(Process Control Block): 운영체제가 프로세스를 관리하기 위해 저장하는 구조체(프로세스 상태, PID, 레지스터 값, 프로그램 카운터 등 포함)

 

프로세스(Process)

  • 개념:
    • 프로그램이 실행되면서 만들어지는 독립된 실행 단위(프로그램의 실행 인스턴스)
    • 프로그램을 실행하면 운영체제가 해당 프로그램을 메모리에 로드하고, 필요한 자원을 할당하여 프로세스를 생성
  • 예시: 크롬 실행 → 크롬 프로세스 생성
  • 특징:
    • 고유의 프로세스 ID(PID)를 가짐 
    • 자기만의 독립된 메모리 영역(코드, 데이터, 힙, 스택)을 가지며, 그 안의 스레드들은 이를 공유함(다만, 스택은 각 스레드마다 별도 존재)
      • 코드: 실행할 프로그램의 명령어 저장
      • 데이터: 전역 변수(static 변수 포함)
      • 힙: 동적 메모리('new', 'malloc') 영역
      • 스택: 함수 호출 시 지역 변수, 매개변수, 반환 주소 등이 저장됨
    • 다른 프로세스와 메모리를 공유하지 않음(격리)
    • 생성 비용이 크고 간섭이 적은 구조

 

스레드(Thread)

  • 개념:
    • 프로세스 안에서 실행 흐름을 담당하는 최소 실행 단위
    • 하나의 프로세스는 여러 개의 스레드를 가질 수 있음(멀티스레딩)
  • 특징:
    • 같은 프로세스 안의 다른 스레드들과 메모리를 공유
      • 공유: 코드, 데이터, 힙
      • 개별: 스택
    • 빠른 통신 및 효율적인 자원 사용이 가능
    • 생성 / 전환이 빠르며 병렬 처리에 유리함
    • 단점:
      • 하나의 스레드가 오류나 crash 시, 프로세스 전체가 영향을 받을 수 있음
      • race condition, deadlock 등 동기화 문제 발생 가능성 존재

 

프로세스스레드

프로세스와 스레드는 서로 밀접한 관계를 가지며, 역할이 분명히 구분된다.

  • 프로세스는 자원의 단위로, 독립된 메모리 공간과 자원을 소유한다.
  • 스레드는 실행의 단위로, 프로세스 내에서 실제 작업을 수행하는 흐름이다.

즉, 하나의 프로세스는 최소 하나 이상의 스레드를 포함하며, 이 스레드들이 실제로 CPU에서 명령어를 실행한다.

 

관계 요약

  • 스레드는 프로세스에 종속된다.
    • 스레드는 반드시 어떤 프로세스 안에서만 존재할 수 있으며, 프로세스가 종료되면 스레드도 모두 종료된다.
  • 스레드는 프로세스의 메모리(코드, 데이터, 힙)을 공유하고, 자신의 고유한 스택을 가진다.
  • 멀티스레딩은 하나의 프로세스 내에서 여러 작업을 병렬로 수행하기 위한 구조이다.
구분 프로세스 스레드
단위 자원의 단위 실행의 단위
메모리      고유한 전체 메모리 공간 소유 프로세스의 일부 메모리 공간 공유
실행 흐름 최소 1개의 메인 스레드 포함 실제 작업을 수행하는 흐름
관계 하나의 껍데기, 스레드를 포함 내부 구성 요소, 프로세스 안에 존재

 

※ 예시

1. 크롬을 켜면 하나의 프로세스 생성

2. 각 탭마다 별도의 프로세스를 분리하여 안정성 확보(멀티프로세스 구조)

3. 탭 내부에서 HTML 파싱, JS 실행, 렌더링 등은 각각 스레드로 분산되어 병렬 처리


 

앞서 프로그램이 실행되며 프로세스가 생성되고, 그 내부에서 스레드가 동작하는 구조를 살펴보았다.

이제 이러한 구조가 실제 시스템에서 어떻게 병렬성과 안정성을 확보하는지 살펴보자.

 

🗂️ 멀티프로세스(Multi Process)

멀티프로세스의 내부구조

운영체제에서 하나의 프로그램이 여러 개의 프로세스를 동시에 실행하는 구조
  • 각 프로세스는 서로 독립된 메모리 공간을 가짐
  • 보통 각 프로세스(부모 프로세스)는 자식 프로세스로 분기되거나, 병렬 작업을 위해 따로 생성됨
    • 부모 프로세스와 자식 프로세스는 서로 PID를 통해 통신이 가능하며, 부모 프로세스는 자식 프로세스를 제어 가능함
  • 운영체제 수준에서 병렬 실행이 가능함
  • 높은 안정성 & 높은 자원 소모 / 복잡한 통신(IPC: 파이프, 큐, 공유 메모리, 소켓 등)

작업이 무겁고 독립적일 때(영상 처리, 파일 압축, 머신러닝 모델 학습 등), 서로가 충돌 없이 독립적으로 돌아가야 할 때(웹 브라우저에서 탭마다 다른 프로세스) 사용된다.

 

※ 예시

크롬 브라우저: 탭마다 별도의 프로세스를 사용해 안정성 확보

서버 애플리케이션: 각 요청을 별도 프로세스로 처리하여 충돌 방지

 

 

주요 특성

멀티프로세스 구조는 운영체제가 각 프로세스를 독립적으로 관리하고 스케줄링함으로써 병렬성, 안정성, 확장성을 실현할 수 있도록 설계되어 있다.

 

📌 병렬성(Parallelism)

  • 운영체제는 각 프로세스를 CPU의 서로 다른 코어에 분배하여 병렬 실행을 수행
  • 각 프로세스는 독립적인 메모리, 레지스터 상태를 가지며, 동시에 스케줄링되어 물리적인 병렬성이 실현됨
  • 작업 단위가 분리되어 있어, 멀티코어 환경에서는 병목 없이 효율적인 처리 가능

 

📌  안정성(Stability)

  • 프로세스마다 고유한 주소 공간을 가지고 있어, 메모리 접근이 완전하게 격리
  • 하나의 프로세스에서 오류가 발생하거나 예외가 발생해도 운영체제는 해당 프로세스만 종료시키고, 다른 프로세스에는 영향을 주지 않음

 

📌 확장성(Scalability)

  • 멀티프로세스 구조는 병렬 작업 단위를 개별 프로세스로 나누어 CPU 자원을 분산시키기 용이함
  • 서버 환경에서는 여러 요청을 동시에 처리하기 위해 프로세스를 복수 생성하여 부하를 분산시킴
  • 운영체제는 각각의 프로세스를 독립적으로 스케줄링하므로 시스템 자원에 따라 동시 실행 수를 조절할 수 있음
  • 다만, 각 프로세스 간 통신(*IPC)이나 자원 공유의 비용이 높아, 무제한 확장에는 성능 제약이 따를 수 있음
    •  
  • 또한 컨텍스트 스위칭 과정에서 성능 저하와 비용 오버헤드가 발생할 수 있음

*IPC(Inter-Process Communication): 운영체제 상에서 실행 중인 프로세스 간에 정보를 주고받는 매커니즘(방법: 파이프, 메시지 큐, 공유 메모리, 소켓, 파일) - 사무실 전화기라고 생각하면 됨

 

🗂️ 멀티스레드(Multi Thread)

하나의 프로세스 내에서 여러 스레드를 생성하여 동시에 여러 작업을 수행하는 구조
  • 스레드는 같은 프로세스의 자원을 공유하므로 가벼보 빠르게 생성 가능
  • 주로 동일한 작업 공간에서 빠른 처리가 필요한 경우 사용됨

게임 엔진에서 그래픽 처리, 물리 연산, 네트워크를 각각 스레드로 처리하기도 하며, 모바일 앱에서 UI 처리와 백그라운드 연산을 분리하여 스레드로 처리한다.

 

주요 특성

멀티스레드는 프로세스 내부에서 병렬 처리를 가능하게 하며, 자원 공유와 빠른 전환을 통해 성능을 향상시키는 구조이다.

 

📌 병렬성(Parallelism)

  • 스레드 간에 독립적인 실행 흐름을 구성하여 병렬 처리 가능
  • 멀티코어 CPU에서는 각 스레드가 서로 다른 코어에서 실행되어 실제 병렬성 실현 가능
  • 경량 스레드이기 때문에 *컨텍스트 스위칭이 빠르고 효율적임

*컨텍스트 스위칭: 운영체제가 현재 실행 중인 작업(프로세스 또는 스레드)의 상태를 저장하고, 다른 작업으로 전환하는 것. 멀티태스킹을 구성하는 핵심 기술.

 

📌 효율성(Efficiency)

  • 스레드는 프로세스의 자원을 공유하므로, 메모리 사용량이 적고 생성/소멸 비용도 낮음
  • 스레드 간 통신은 메모리 공유를 통해 빠르게 이루어지며, IPC 없이도 협업 가능

📌 한계 및 안정성 이슈

  • 스택은 스레드마다 개별이지만, 다른 메모리 영역은 공유되므로 동기화가 필요함
  • 동기화 부족 시 race condition, deadlock 등 발생 가능
  • 하나의 스레드가 예외를 일으킬 경우 전체 프로세스가 영향을 받을 수 있음
  • 컨텍스트 스위칭 오버헤드 문제: 비용 자체를 무시할 수 없으므로 '스레드를 많이 쓸수록 꼭 성능이 좋은가?'라는 의문

 

🗂️ 멀티프로세스와 멀티스레드

멀티프로세스는 안정성과 격리를 중요시 하는 상황에서 유리하고, 멀티스레드는 빠른 통신과 자원 공유가 필요한 상황에서 적합하다.

  • 멀티프로세스: 크롬 브라우저, VSCode 확장 기능, 서버 데몬
  • 멀티스레드: 웹 서버의 요청 처리, 게임 엔진(물리, 렌더링, 입력 처리), 모바일 앱

🗂️ 개념 총정리

개념 비유 설명
프로그램 레시피 아직 실행되지 않은 상태의 요리 정보, 조리법과 재료 정보가 포함됨
운영체제 매니저 레시피(프로그램)을 보고 요리사(스레드)와 주방(프로세스)를 관리하며, 주문을 할당하고 자원을 조율함
CPU 코어 조리대/화구 실제로 요리가 조리되는 장소, 매지너(운영체제)가 요리사(스레드)를 이 조리대에 배정해 일을 하게 함
프로세스 하나의 주방 레시피를 기반으로 준비된 독립적인 조리 공간, 각기 다른 요리를 병렬로 진행할 수 있음
스레드 요리사 주방 안에서 실제로 요리를 수행하는 사람, 여러 명의 요리사가 한 주방 안에서 협업함
(코드 → 레시피 / 데이터 → 재료 창고 / 힙 → 도구함 / 스택 → 개인 작업 메모)
멀티프로세스 여러 개의 주방 각각 독립된 조리 공가, 한 주방에 문제가 생겨도 다른 주방은 계속 운영됨
멀티스레드 한 주방에서 여러 요리사가 동시에 작업하는 구조 자원을 공유하며 빠르게 요를 수행할 수 있지만, 충돌 시 전체 주바이 영향을 받을 수 있음

 


🗂️ 파이썬에서의 '멀티프로세스와 멀티스레드' vs 다른 컴파일 언어

파이썬은 *GIL(Global Interpreter Lock)이라는 특징 때문에, 멀티스레드를 사용하더라도 한 순간에 하나의 스레드만 Python 바이트코드를 실행할 수 있다. 이로 인해 CPU 작업 중심의 병렬 처리에는 제약이 크고, 멀티프로세스 방식이 더 선호된다.

 

하지만 C, C++, Java 등 컴파일 언어는 GIL이 없기 때문에, 멀티스레드를 통해 진정한 병렬 실행이 가능하다.

* GIL(Global Interpreter Lock): 파이썬 인터프리터에서 한 번에 하나의 스레드만 실행되도록 강제로 막는 lock.

파이썬은 C로 구현되어 있고, 여러 스레드가 동시에 실행되면 같은 데이터를 건드려 의도하지 않은 충돌 위험이 생김

언어 병렬 처리 시 선호 방식 이유
Python 멀티프로세스 GIL로 인해 멀티스레드는 병렬 처리에 한계가 있음
C / C++ 멀티스레드 GIL 없음, 스레드 성능 우수
Java 멀티스레드 + 멀티프로세스 혼합 강력한 스레드 모델과 풍부한 동시성 라이브러리 제공

 

결론적으로, 파이썬은 멀티프로세스 기반 병렬 처리에 더 적합하고, 컴파일 언어는 멀티스레드를 통한 고성능 병렬 처리가 가능하다.

운영체제는 기본적으로 멀티프로세스와 멀티스레드 모두를 지원하지만, 일반적인 프로그램 실행이나 내부 동작에서는 멀티스레드를 더 널리 사용한다.