넓고 얕은 CS 지식

프로세스와 스레드에 대해 자세히 알아보기

팡펑퐁 2025. 5. 14. 18:06
728x90

🧬 프로세스 메모리 구조

📄 코드(Code) 영역

  • 프로그램의 실행 명령어(기계어)가 저장되는 영역입니다.
  • 개발자가 작성한 코드(함수 정의, if/for) 등의 로직이 컴파일되어 들어갑니다.
  • 일반적으로 읽기 전용이며, 스레드 간에 공유됩니다.

 

📦 데이터(Data) 영역

  • 초기화된 전역 변수, 정적(static) 변수 등이 저장됩니다.
  • 프로그램 시작 시 함께 로드되며, 실행이 끝날 때까지 유지됩니다.
  • 프로세스 단위로 존재하며, 스레드 간에 공유됩니다.

 

🎯 힙(Heap) 영역

  • 프로그램 실행 중 동적으로 할당되는 메모리입니다.
  • new, malloc 등으로 생성되는 객체나 배열이 저장됩니다.
  • 스레드 간에 공유가 가능하지만, 동기화 관리가 필요합니다. (ex: synchronized, mutex)

 

🌀 스택(Stack) 영역

  • 함수 호출 시 지역 변수, 매개변수, 리턴 주소 등이 저장되는 공간입니다.
  • 스레드마다 독립적으로 존재합니다.
    • 이 덕분에 여러 스레드가 동시에 함수 호출을 해도 충돌하지 않습니다.

 

✅ 1. 프로세스(Process)란?

  • 운영체제에서 실행 중인 하나의 프로그램 인스턴스입니다.
  • 각각의 프로세스는 독립적인 메모리 공간을 가집니다. (코드, 데이터, 힙, 스택 등)
  • 운영체제가 자원을 할당하며, 프로세스 간에는 직접 메모리를 공유하지 않습니다.
    • 한마디로 프로세스는 아파트의 각 집입니다. 같은 아파트에 살 뿐 서로 모르는 사이입니다.

 

✅ 2. 스레드(Thread)란?

  • 하나의 프로세스 내에서 실행되는 작업 단위(실행 흐름)입니다.
  • 같은 프로세스 내의 스레드들은 메모리를 공유합니다. (코드, 데이터, 힙)
  • 단, 스택(Stack)은 각각 따로 가집니다.
  • 스레드는 같은 집에 사는 사람들입니다. 집 안의 자원은 공유하지만 개인 공간(스택)이 따로 있습니다.

 

🧩 멀티프로세스(Multi-Process)

✅ 개념

  • 하나의 작업을 여러 개의 독립적인 프로세스로 나누어 처리하는 방식입니다.
  • 각 프로세스는 독립된 메모리 공간을 가집니다.
    • 코드, 힙, 스택 등도 각각 분리됩니다.
  • 운영체제가 프로세스 간 스케줄링, 메모리 보호 등을 담당합니다.

 

⚙️ 동작 방식

  • 각 프로세스는 자체 메모리 공간과 자원을 가지고 있어 서로 직접 접근이 불가능합니다.
  • 데이터를 공유하려면 IPC(Inter-Process Communication) 방식을 사용해야 합니다.
    • IPC란 서로 다른 프로세스 간에 데이터를 주고받는 방식을 말합니다.
    • 예를 들어 파이프(pipe), 소켓(socket), 공유 메모리(shared memory), 메시지 큐 등이 있습니다.

 

✅ 장점

  1. 안정성이 높습니다
    • 한 프로세스가 죽어도 다른 프로세스에는 영향이 없습니다.
      • 프로세스 간에 서로 격리되어 있기 때문입니다.
  2. 멀티코어 활용이 용이합니다.
    • OS가 각 프로세스를 병렬로 분산 실행 가능합니다.
  3. 메모리를 보호할 수 있습니다.
    • 독립된 메모리 공간을 가지므로 보안에 좋습니다.
    • 프로세스 간 메모리 간섭이 없습니다.
    • 동기화 문제에 비교적 자유롭습니다.
      • 프로세스 간 통신(IPC)을 사용하는 경우에는 동기화가 필요할 수 있습니다.

 

❌ 단점

  • 프로세스 생성/소멸 비용이 크며, 메모리 사용이 많습니다.
  • IPC 방식의 통신이 복잡하고 느릴 수 있습니다.
  • 컨텍스트 스위칭 비용이 큽니다.
    • 컨텍스트 스위칭은 CPU가 현재 실행 중인 프로세스의 레지스터 값과 메모리 정보를 저장하고, 다음 프로세스의 레지스터 값과 메모리 정보를 복원하는 과정입니다.
    • 이 과정에서 비용이 많이 발생합니다.
    • CPU가 다른 프로세스로 전환할 때는 레지스터 값과 메모리 정보의 저장 및 복원이 필요합니다.
    • 레지스터 CPU 내부에서 가장 빠르게 데이터를 처리하는 메모리 공간입니다.

 

🧵 멀티스레드(Multi-Thread)

✅ 개념

  • 하나의 프로세스 안에서 여러 개의 스레드가 동시에 작업하는 방식입니다.
  • 스레드는 코드, 힙, 데이터 영역을 공유하고, 스택만 개별적으로 가집니다.

 

⚙️ 동작 방식

  • 스레드들은 같은 메모리 공간을 공유하기 때문에 변수나 객체를 쉽게 공유 가능합니다.
  • 메모리를 공유하기 때문에 하나의 스레드에 문제가 발생하면 같은 프로세스 내 다른 스레드에도 영향을 줄 수 있습니다.

 

✅ 장점

  1. 가볍고 빠릅니다.
    • 생성/소멸 비용 작습니다.
    • 자원 공유로 메모리 사용이 효율적입니다.
  2. 데이터 공유가 쉽습니다.
    • 공통 메모리로 통신이 간단합니다.
      • 함수를 호출하듯 공유 객체에 접근이 가능합니다.
  3. 응답성이 향상됩니다.
    • UI 스레드, 네트워크 스레드 등 스레드를 분리하면 사용자 경험 개선이 가능합니다.
      • 예를 들어, UI 스레드에서 네트워크 요청을 직접 처리하게 되면 요청이 완료될 때까지 앱이 멈춘 것처럼 느껴질 수 있습니다.
      • 하지만 UI 스레드와 네트워크 스레드를 분리하면 백그라운드에서 요청을 처리하는 동안에도 UI는 부드럽게 반응합니다.

 

❌ 단점

  1. 안정성 낮습니다.
    • 하나의 스레드에서 발생한 문제가 전체 프로세스에 영향을 줄 수 있습니다.
  2. 동기화 문제가 발생합니다.
    • 자원을 공유하다 보니 Race Condition, Deadlock 등의 위험이 있습니다.
  3. 디버깅이 어렵고 설계가 복잡합니다.
    • 동시성 이슈가 많아 설계와 테스트가 어렵습니다.

 

🥊 상황 별 선택

상황 선택
안정성이 중요하고, 병렬 처리된 작업이 서로 독립적임 멀티프로세스
자원을 효율적으로 사용하고, 작업 간 공유가 많음 멀티스레드

 

 

 

참고

chat GPT

728x90