멀티 스레딩 vs 비동기
멀티 스레딩과 비동기 방식의 비교
운영체제
상관없는 짤 집어넣기
- 멀티스레딩: '누가' 일하는가
- 비동기: '어떻게' 일하는가
| 구분 | 멀티스레딩 (Multi-threading) | 비동기 (Asynchronous) |
|---|---|---|
| 핵심 아이디어 | **여러 명의 작업자(스레드)**가 동시에 여러 일을 처리 | **한 명의 작업자(싱글 스레드)**가 작업을 멈추지 않고 효율적으로 처리 |
| 초점 | 작업자 (Worker/Thread): 일을 처리하는 주체의 수 | 작업 (Task/Job): 일의 처리 순서 및 흐름 |
| 실행 방식 | 병렬성 (Parallelism): 여러 CPU 코어에서 실제로 여러 스레드가 동시에 실행됨 | 동시성 (Concurrency): 하나의 스레드가 여러 작업을 번갈아 가며 실행하여 동시에 처리되는 것처럼 보임 |
| 자원 공유 | 스레드 간 메모리 공유가 가능하지만, 이로 인한 **동기화 문제(경쟁 상태, 교착 상태 등)**가 발생할 수 있음 | 기본적으로 단일 스레드 내에서 동작하므로 자원 공유 문제가 상대적으로 적음 (JavaScript 기준) |
| 제어 주체 | **운영체제(OS)**가 스케줄러를 통해 스레드를 제어 (선점형 멀티태스킹) | 이벤트 루프 또는 런타임이 코드의 흐름을 제어 (협력적 멀티태스킹) |
| 주요 장점 | CPU를 많이 사용하는 무거운 계산 작업(heavy computation)에 유리 | I/O 작업(파일 읽기, 네트워크 요청 등)이 잦은 환경에서 응답성 유지에 유리 |
| 주요 단점 | 문맥 교환(Context Switching) 비용 발생, 복잡한 동기화 문제 | CPU 집약적인 작업을 만나면 전체가 멈추는 '블로킹' 발생 가능 |
위와 같이 비교할 수 있으나 서로 배척하는 개념이 아니다. 오히려 함께 사용될 때 강력한 시너지를 낸다.
- 비동기 + 싱글스레드 (JS 모델): 대부분의 웹 환경에 적합, I/O 바운드 작업에 매우 효율적
- 비동기 + 멀티스레드 (많은 서버 모델): 여러 스레드가 각자의 작업을 비동기 적으로 처리한다. 대규모 동시 요청을 처리해야 하는 웹 서버 등에서 사용된다.
스레드 생성 방식의 제약 사항
- 마치 필요할 때마다 새로운 직원을 계속 고용하는 것과 같아 자원 소모가 심함
- 여러 스레드를 번갈아가며 실행해 동시에 처리되는 것 처럼 보이게 하는 과정인 컨텍스트 스위칭 비용이 발생 -> 성능 저하
- 레이스 컨디션 발생 가능성
비동기 방식의 제약 사항
- 블로킹 취약성
- 복잡한 에러 처리
- 실행 순서 예측의 어려움
어떤 걸 선택해야 하는가
-
비동기 프로그래밍
- 수많은 네트워크 요청이나 파일 I/O를 동시에 처리
- 훨씬 적은 자원으로 더 나은 응답성을 제공
- 수많은 네트워크 요청이나 파일 I/O를 동시에 처리
-
멀티스레딩
- 고화질 비디오를 인코딩하거나 복잡한 과학 기술 연산을 수행
- CPU의 물리적인 코어를 최대한 활용해 작업을 병렬로 처리
- 고화질 비디오를 인코딩하거나 복잡한 과학 기술 연산을 수행