Concurrency Model
(동시성 모델)
프로그램이 생애 주기가 겹치는 여러 실행 과정을 통해 실행된다 하더라도 프로그램의 결과에는 영향을 미치지 않는 성질
생애 주기가 겹치는 여러 실행 과정이 자원을 공유할 때 어떻게 충돌이 생기지 않도록 할 것인가?
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
- 긴 실행과정을 여러 개의 함수로 쪼개서 한 번의 함수 실행이 금방 끝나게 만들기