1. 스레드(Thread)

  • 정의:
    프로그램(특히 프로세스) 내에서 실행되는 흐름의 단위.
    하나의 프로세스 내에서 여러 스레드가 동시에 실행되는 방식을 멀티스레드라 함.

특징

  1. 메모리 공유:
    • 같은 프로세스 내에서 코드, 데이터, 힙 메모리를 공유.
    • 각 스레드는 개별적인 스택 메모리를 가짐.
  2. 빠른 전환 속도:
    • 프로세스 간 전환보다 스레드 간 전환이 훨씬 빠름.
  3. 병렬 처리:
    • 멀티코어 CPU 환경에서 각 스레드가 다른 코어에서 실행되어 성능 향상 가능.
  4. 순서 비결정성:
    • 스레드 간 실행 순서를 예측할 수 없음.

장점

  • 메모리 공유로 인해 자원 사용 효율적.
  • 멀티코어 환경에서 병렬 처리 가능.

단점

  • 메모리 공유로 인해 경쟁 조건(Race Condition) 발생 가능.
  • 동기화 문제 해결을 위해 추가적인 프로그래밍 복잡도 필요.

2. 프로세스(Process)

  • 정의:
    운영체제에서 실행 중인 프로그램의 독립적인 실행 단위.
    각 프로세스는 별도의 메모리 공간(코드, 데이터, 스택, 힙)을 가짐.

특징

  1. 독립성:
    • 프로세스 간 메모리와 자원이 완전히 분리되어 있음.
    • 각 프로세스는 독립적으로 실행.
  2. 안정성:
    • 하나의 프로세스가 비정상 종료되더라도 다른 프로세스에 영향을 주지 않음.
  3. 프로세스 간 통신(IPC):
    • 독립적인 메모리 공간으로 인해 통신 시 별도의 메커니즘 필요.
    • 예: 파이프, 메시지 큐, 공유 메모리 등.

장점

  • 안정적이고 충돌 가능성 낮음.
  • 프로세스 간 충돌 시 영향을 최소화.

단점

  • 프로세스 간 전환 속도가 느림(컨텍스트 스위칭 비용 높음).
  • 자원 사용량이 높음.

3. 스레드와 프로세스 비교

특징스레드(Thread)프로세스(Process)

메모리 공유 같은 프로세스 내에서 메모리 공유 메모리 공간이 독립적
실행 속도 스레드 간 전환이 빠름 프로세스 간 전환 속도가 느림
안정성 하나의 스레드가 종료되면 프로세스 전체에 영향 독립적 실행, 다른 프로세스에 영향 없음
자원 사용량 상대적으로 적음 상대적으로 높음
통신 방식 메모리 공유를 통해 간단한 통신 가능 별도의 IPC 메커니즘 필요
멀티스레드 웹 서버, 비디오 플레이어 브라우저, 텍스트 편집기

4. 예시

a. 멀티스레드

import threading

def print_numbers():
    for i in range(5):
        print(f"Number: {i}")

# 두 개의 스레드 실행
thread1 = threading.Thread(target=print_numbers)
thread2 = threading.Thread(target=print_numbers)

thread1.start()
thread2.start()

thread1.join()
thread2.join()

b. 멀티프로세스

import multiprocessing

def print_numbers():
    for i in range(5):
        print(f"Number: {i}")

# 두 개의 프로세스 실행
process1 = multiprocessing.Process(target=print_numbers)
process2 = multiprocessing.Process(target=print_numbers)

process1.start()
process2.start()

process1.join()
process2.join()

5. 선택 기준

  • 스레드 사용:
    • 자원 공유와 빠른 통신이 필요한 경우.
    • 멀티코어 CPU를 활용하여 성능을 향상시키고자 할 때.
    • 예: 멀티스레드 웹 서버.
  • 프로세스 사용:
    • 독립적이고 안정적인 실행 환경이 필요한 경우.
    • 자원 충돌이나 데이터 동기화 문제를 피하고자 할 때.
    • 예: 브라우저의 각 탭을 개별 프로세스로 실행.

6. 요약

  • 스레드는 가벼운 실행 단위로, 자원을 공유하여 효율적이지만 동기화 문제가 발생할 수 있음.
  • 프로세스는 독립적인 실행 단위로, 안정적이지만 자원 소모가 큼.
  • 사용 사례에 따라 적합한 방식을 선택해야 함.

+ Recent posts