1. 스레드(Thread)
- 정의:
프로그램(특히 프로세스) 내에서 실행되는 흐름의 단위.
하나의 프로세스 내에서 여러 스레드가 동시에 실행되는 방식을 멀티스레드라 함.
특징
- 메모리 공유:
- 같은 프로세스 내에서 코드, 데이터, 힙 메모리를 공유.
- 각 스레드는 개별적인 스택 메모리를 가짐.
- 빠른 전환 속도:
- 프로세스 간 전환보다 스레드 간 전환이 훨씬 빠름.
- 병렬 처리:
- 멀티코어 CPU 환경에서 각 스레드가 다른 코어에서 실행되어 성능 향상 가능.
- 순서 비결정성:
장점
- 메모리 공유로 인해 자원 사용 효율적.
- 멀티코어 환경에서 병렬 처리 가능.
단점
- 메모리 공유로 인해 경쟁 조건(Race Condition) 발생 가능.
- 동기화 문제 해결을 위해 추가적인 프로그래밍 복잡도 필요.
2. 프로세스(Process)
- 정의:
운영체제에서 실행 중인 프로그램의 독립적인 실행 단위.
각 프로세스는 별도의 메모리 공간(코드, 데이터, 스택, 힙)을 가짐.
특징
- 독립성:
- 프로세스 간 메모리와 자원이 완전히 분리되어 있음.
- 각 프로세스는 독립적으로 실행.
- 안정성:
- 하나의 프로세스가 비정상 종료되더라도 다른 프로세스에 영향을 주지 않음.
- 프로세스 간 통신(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. 요약
- 스레드는 가벼운 실행 단위로, 자원을 공유하여 효율적이지만 동기화 문제가 발생할 수 있음.
- 프로세스는 독립적인 실행 단위로, 안정적이지만 자원 소모가 큼.
- 사용 사례에 따라 적합한 방식을 선택해야 함.