seungjun.dev

멀티 스레딩 vs 비동기

멀티 스레딩과 비동기 방식의 비교

상관없는 짤 집어넣기

  • 멀티스레딩: '누가' 일하는가
  • 비동기: '어떻게' 일하는가
구분멀티스레딩 (Multi-threading)비동기 (Asynchronous)
핵심 아이디어**여러 명의 작업자(스레드)**가 동시에 여러 일을 처리**한 명의 작업자(싱글 스레드)**가 작업을 멈추지 않고 효율적으로 처리
초점작업자 (Worker/Thread): 일을 처리하는 주체의 수작업 (Task/Job): 일의 처리 순서 및 흐름
실행 방식병렬성 (Parallelism): 여러 CPU 코어에서 실제로 여러 스레드가 동시에 실행됨동시성 (Concurrency): 하나의 스레드가 여러 작업을 번갈아 가며 실행하여 동시에 처리되는 것처럼 보임
자원 공유스레드 간 메모리 공유가 가능하지만, 이로 인한 **동기화 문제(경쟁 상태, 교착 상태 등)**가 발생할 수 있음기본적으로 단일 스레드 내에서 동작하므로 자원 공유 문제가 상대적으로 적음 (JavaScript 기준)
제어 주체**운영체제(OS)**가 스케줄러를 통해 스레드를 제어 (선점형 멀티태스킹)이벤트 루프 또는 런타임이 코드의 흐름을 제어 (협력적 멀티태스킹)
주요 장점CPU를 많이 사용하는 무거운 계산 작업(heavy computation)에 유리I/O 작업(파일 읽기, 네트워크 요청 등)이 잦은 환경에서 응답성 유지에 유리
주요 단점문맥 교환(Context Switching) 비용 발생, 복잡한 동기화 문제CPU 집약적인 작업을 만나면 전체가 멈추는 '블로킹' 발생 가능

위와 같이 비교할 수 있으나 서로 배척하는 개념이 아니다. 오히려 함께 사용될 때 강력한 시너지를 낸다.

  • 비동기 + 싱글스레드 (JS 모델): 대부분의 웹 환경에 적합, I/O 바운드 작업에 매우 효율적
  • 비동기 + 멀티스레드 (많은 서버 모델): 여러 스레드가 각자의 작업을 비동기 적으로 처리한다. 대규모 동시 요청을 처리해야 하는 웹 서버 등에서 사용된다.

스레드 생성 방식의 제약 사항

  1. 마치 필요할 때마다 새로운 직원을 계속 고용하는 것과 같아 자원 소모가 심함
  2. 여러 스레드를 번갈아가며 실행해 동시에 처리되는 것 처럼 보이게 하는 과정인 컨텍스트 스위칭 비용이 발생 -> 성능 저하
  3. 레이스 컨디션 발생 가능성

비동기 방식의 제약 사항

  1. 블로킹 취약성
  2. 복잡한 에러 처리
  3. 실행 순서 예측의 어려움

어떤 걸 선택해야 하는가

  • 비동기 프로그래밍

    • 수많은 네트워크 요청이나 파일 I/O를 동시에 처리
      • 훨씬 적은 자원으로 더 나은 응답성을 제공
  • 멀티스레딩

    • 고화질 비디오를 인코딩하거나 복잡한 과학 기술 연산을 수행
      • CPU의 물리적인 코어를 최대한 활용해 작업을 병렬로 처리