Node.js

동기 vs 비동기 || 블로킹 vs 논블로킹

Box 2022. 1. 4. 12:55
728x90

블로킹(blocking) vs 논블로킹(non-blocking)

블로킹과 논블로킹은 A 함수가 B 함수를 호출했을 때, 제어권을 어떻게 처리하느냐에 따라 달라진다.

 

1) 블로킹

블로킹은 A 함수가 B 함수를 호출하면, 제어권을 A가 호출한 B 함수에 넘겨준다.

  1. A함수가 B함수를 호출하면 B에게 제어권을 넘긴다.
  2. 제어권을 넘겨받은 B는 열심히 함수를 실행한다. A는 B에게 제어권을 넘겨주었기 때문에 함수 실행을 잠시 멈춘다.
  3. B함수는 실행이 끝나면 자신을 호출한 A에게 제어권을 돌려준다.

 

2) 논블로킹

논블로킹은 A함수가 B함수를 호출해도 제어권은 그대로 자신이 가지고 있는다.

  1. A함수가 B함수를 호출하면, B 함수는 실행되지만, 제어권은 A 함수가 그대로 가지고 있는다.
  2. A함수는 계속 제어권을 가지고 있기 때문에 B함수를 호출한 이후에도 자신의 코드를 계속 실행한다.

 

동기(Synchronous) vs 비동기(Asynchronous)

블로킹/논블로킹을 구분짓는 기준은 '요청받은 함수가 제어권을 언제 돌려주는지' 였다.

이번에 이야기할 동기/비동기는 작업을 실행하는 여러개의 함수들이 '시간을 맞춰서 실행되느냐'에 따라 구분된다고 할 수 있다.

 

동기(Sync)

일단 '시간을 맞춘다'는 말은 무슨 뜻일까? 쉽게 말해 함수가 두 개 이상 존재할 때, 이 함수들이 작업을 동시에 시작하거나, 끝나는 타이밍을 맞추거나, 하나가 끝나고 다른 하나를 차례로 실행하는 것을 시간을 맞춘다고 한다.

 

즉, 요청자가 요청한 일들이 완료되었는지를 계속 확인하고 요청자는 완료가 되었다는 응답을 받으면, 그때 다른 함수의 실행을 시작하거나 하는 것이다.

 

비동기(Async)

요청자는 작업을 요청해놓고 계속 완료되었는지 확인하는게 아니라, 알아서 알려주겠거니 하고 있는다.

요청을 받은 함수가 완료되었는지 여부를 알아서 알려주는 방식이다
이렇게 작업을 시작하고 끝내는 시간을 아는 것은 호출된 함수 본인뿐이기 때문이다



블로킹/논블로킹, 동기/비동기 요약

블로킹/논블로킹 = 요청받는 함수가 제어권(함수실행권)을 언제 넘겨주느냐의 차이

 

블로킹 : 요청받는 함수가 작업을 모두 마치고 나서야 요청자에게 제어권을 넘겨줌 (그동안 요청자는 아무것도 하지않고 기다림)

논블로킹 : 요청받은 함수가 요청자에게 제어권을 바로 넘겨줌 (그동안 요청자는 다른 일을 할 수 있음)

 

동기/비동기 = 요청받은 함수가 작업을 완료했는지를 누가 체크하느냐의 차이

 

동기 : 요청자가 요청받은 함수의 작업이 완료되었는지 계속 확인 (여러 함수들이 시간을 맞춰 실행됨)

비동기 : 요청자는 요청후 신경X, 요청받은 함수가 작업을 마치면 알려줌 (함수들의 작업 시작/종료 시간이 맞지 않을수도)