Web/JavaScript

[Node.js] Node.js는 논블로킹 비동기 방식으로 I/O를 처리한다

wjdwwidz 2024. 2. 22. 17:37

 

동기 vs 비동기 

프로세스의 수행 순서 보장에 대한 매커니즘
두 가지 이상의 작업의 리턴을 확인하고 다음 작업이 이루어지는지, 아닌지로 구분
 

동기 :

대상의 리턴시간과 결과를 반환하는 시간이 일치하는 경우. A의 종료시간과 B의 시작시간이 같다

동기(synchronous)는 사전적인 의미로 '동시 발생[존재]하는' 라는 의미

비동기 :

리턴 값을 신경쓰지 않고 각각 동작
 

동기 비동기

 
동기는 끝날 때까지 기다리고, 그 시간에 맞춰서 다른 작업을 수행하는 방식이고,
비동기는 작업을 해달라는 요청만 해놓고 더이상 신경쓰지 않고 있다가, 상대방이 끝나면 끝났다고 말해주는 방식이다.
 
 
 

블로킹 vs 논블로킹

두 가지 이상의 작업의 제어권을 넘기느냐 , 넘기지 않느냐로 구분
요청받은 함수가 제어권을 언제 돌려주는지 가 핵심

블로킹 (block + ing) '홈으로 쇄도하는 주자를 몸으로 막는 것' 또한 블로킹

 

블로킹:

I/O 작업 등을 요청했을 경우 I/O 작업이 처리되기 전까지 아무 일도 하지 못한다. 
 

논블로킹 :

호출된 함수에서 I/O 작업등을 요청했을 경우 I/O 작업의 처리여부와 관계없이 바로 다음 작업을 할 수 있다. == 먼저 호출된 함수의 제어권이 넘어가지 않는다. 제어권을 넘겨주기는 하지만 바로 돌려받는다. 제어권을 돌려받은 호출자는 다른 작업을 바로 수행 가능하다. 

위 그림을 보면 동기vs비동기와 무엇이 다르냐할 수 있는데 시점이냐, 주도권이냐 에 따라 구분한 차이이다.
논블로킹/ 비동기의 공통점은 동시에 다른 작업을 수행한다는 것이다. 혼용하여 사용하나 실제로는 다른 의미. 
 


 
그렇다면 Node.js는 논블로킹 비동기 방식으로 I/O를 처리한다 의 의미는 무엇일까?

 
- 논블로킹 : A함수가 실행되면서 (주도권을 가진 채로 == A함수를 계속 실행하고 있는 채로) B함수를 호출한다
B함수에서는 실행하고 콜백함수도 실행한다
- 비동기 : A함수는 B 의 리턴값을 신경쓰지 않고, A와 B 는 연관이 없다
 
 
비동기나 논블로킹 방식이 빨라서 좋을 것 같지만 순차적으로 실행이 안 되서 곤란한 경우도 있었던 것 같다. 


 
 
참고하면 좋은 영상
https://youtu.be/ohz7uHnza6A?si=nUsQnswPXxUaB49F

 
 
ref : 하기 외 다수..