Concurrency

Concurrency Model

(동시성 모델)

프로그램이 생애 주기가 겹치는 여러 실행 과정을 통해 실행된다 하더라도 프로그램의 결과에는 영향을 미치지 않는 성질

생애 주기가 겹치는 여러 실행 과정자원을 공유할 때 어떻게 충돌이 생기지 않도록 할 것인가?

Resources

  • CPU
  • 메모리
  • 네트워크
  • ...

thread

코드 실행의 가장 작은 단위

프로그램은 하나 이상의 스레드로 이루어짐

CPU 코어 하나는 한 번에 하나의 스레드를 실행

CPU cores & threads


          $ sysctl -n hw.ncpu # OSX
          $ nproc # linux
          $ mmc devmgmt.msc # Windows
          $ top -H # Shows the total number of threads
        

동시성을 위한 도구

운영체제 차원의 도구

  • Process
  • Thread
  • Mutex (Mutual Exclusion)

언어 차원의 도구

  • Python - asyncio
  • Go - goroutine
  • Erlang - actor
  • JavaScript - ...?

자바스크립트의 동시성

Single-Threaded Event Loop

  • 자바스크립트를 실행시키는 스레드가 하나 뿐임
  • 실행 과정(보통 콜백 연쇄)의 생애 주기가 겹칠 수는 있지만 어떤 경우에도 두 자바스크립트 실행과정이 동시에 실행되는 경우는 없음
  • 내부적으로 메시지 큐를 활용하고 있으나, 모든 처리가 자동으로 이루어짐

MDN link

장점

  • 프로그래머가 동시성에 대해 신경쓸 필요가 없어짐
  • 프로그램 작성이 쉬워짐

단점

  • CPU를 많이 쓰는 작업에 부적절
  • 오래 걸리는 자바스크립트 코드가 실행되면 전체 프로그램에 영향을 미침

전략

  • 오래 걸리는 일은 외부에 위임하고 넘어간 뒤, 나중에 결과를 받아 처리하기
    • Database
    • Node.js - External libraries
    • Web browser - WebAssembly
  • 긴 실행과정을 여러 개의 함수로 쪼개서 한 번의 함수 실행이 금방 끝나게 만들기