Blocking과 Non-Blocking
1. Blocking
동기적
자신의 수행결과가 끝날 때까지 제어권을 가지고 있다.
단점
- 앞의 명령이 처리되지 않으면 계속 뒤의 명령의 처리가 지연되어 병목현상 발생
- multi-thread : 명령 하나에 thread 하나를 배정하여 동시에 여러 개의 명령을 처리하는 방식로 해결 할 수 있는 것처럼 보이지만 명령 하나당 thread 하나가 배정되므로,
명령의 수가 엄청 많아진다면 서버가 가진 자원은 한정되어 있으므로 서버를 업그레이드하거나 여러 개의 서버로 분산처리 해야 한다.
2. Non-Blocking
비동기적
- 자신이 호출되었을 때 제어권을 바로 자신을 호출한 쪽으로 넘기며,
자신을 호출한 쪽에서 다른 일을 할 수 있도록 한다.
장점
- 앞의 명령이 처리될 때까지 기다리지 않기 때문에 명령이 밀리는 병목 현상이 없다.
- single-thread : 한개의 thread 사용
3. 코드비교
동기
const fs = require('fs')
const data = fs.readFileSync('/file.md')
비동기
const fs = require('fs')
fs.readFile('/file.md', (err, data) => {
if (err) throw err
})
- 첫 예제가 두 번째보다 간단해 보이지만 두 번째 줄에서 전체 파일을 읽을 때까지 다른 JavaScript 실행이 블로킹되는 단점이 있다.
- 동기 예제에서 오류가 발생하면 반드시 처리해주어야 하고 그렇지 않으면 프로세스가 죽는다.
- 비동기 예제에서는 예제에 나왔듯이 에러를 던질지 아닐지는 작성자에게 달려있다.
블로킹과 논블로킹 살펴보기
What is Node.js ?
4. 동시성(Concurrency)과 병렬성(Parallelism)
비동기 작업을 할 때 Concurrency
와 Parallelism
에 대한 이야기가 자주 오고 간다.
동시성(Concurrency)
- 한 번에 여러 스레드를 다루는 것
- 하나의 코어에서 여러 스레드가 번갈아 가며 실행되는 성질
- 동시에 실행되는 것처럼 보이지만 실제로는 시분할하여 번갈아 실행
- 논리적 관점
병렬성(parallelism)
- 한 번에 여러 스레드를 실행하는 것
- 다중 코어에서 실제로 각 코어들이 동시에 실행되는 성질
- 물리적 관점
동시성(Concurrency)과 병렬성(Parallelism)-1
동시성(Concurrency)과 병렬성(Parallelism)-2