1 분 소요

질문으로 자주 등장하는 동기화와 비동기화에 대해 정리하려고 한다.

먼저 이해하기 위해서 필요한 용어를 미리 알아둬야 한다.

  • 제어권
    • 제어권은 자신의 코드를 실행할 권리이다. 제어권을 가진 함수는 자신의 코드를 끝까지 실행한 후 자신을 호출한 함수에게 돌려준다.
  • 결괏값을 기다리는 것
    • A 함수에서 B 함수를 호출했을 때 A 함수가 B 함수의 결괏값을 기다리는지의 여부를 의미한다.



블로킹(Blocking)과 논블로킹(Non-blocking)

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


1) 블로킹

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

A 함수는 제어권을 B 함수에게 넘겨주었기 때문에 함수 실행을 잠시 멈춰서 대기하고 B 함수는 실행이 끝나면 자신을 호출한 A에게 제어권을 돌려준다.



2) 논블로킹

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

A 함수가 B 함수를 호출하면 B 함수는 실행되지만 제어권은 A 함수가 그대로 가지고 있는다.

따라서 A 함수는 계속 제어권을 가지고 있기 때문에 B 함수를 호출한 이후에도 자신의 코드를 계속 실행한다.



동기(Synchronous)와 비동기(ASynchronous)

동기와 비동기의 차이는 호출되는 함수의 작업 완료 여부를 신경 쓰는지의 여부이다.

1) 동기(Synchronous)

함수 A가 함수 B를 호출한 뒤 함수 B의 리턴 값을 계속 확인하면서 신경 쓰는 것이다.

2) 비동기(ASynchronous)

함수 A가 함수 B를 호출할 때 콜백 함수를 함께 전달해서 함수 B의 작업이 완료되면 함께 보낸 콜백 함수를 실행한다.

함수 A는 함수 B를 호출한 후로 함수 B의 작업 완료 여부에는 신경 쓰지 않는다.



블로킹과 논블로킹, 동기와 비동기 종류 비교

1) 동기/블로킹(Sync-Blocking)



함수 A는 함수 B의 리턴 값이 필요로 하기에 제어권을 함수 B에게 넘겨주면서 B 함수를 호출한다. 제어권을 넘겨주었기에 실행을 멈추고 대기한다.

함수 B는 제어권을 넘겨받아서 실행을 한 후에 완료가 되면 함수 A 에게 리턴 값과 제어권을 돌려준다.

함수 A는 함수 B의 리턴 값을 가지고 함수를 다시 실행한다



2) 동기/논블로킹(Sync-NonBlocking)



함수 A는 함수 B를 호출하고 이때 제어권을 함수 B에게 주지 않고 자신의 함수를 계속 실행한다.

그리고 함수 A는 함수 B에게 중간중간 함수 실행이 완료되었는지 물어본다.



3) 비동기/논블로킹 (Async-NonBlocking)



함수 A는 함수 B를 호출하고 제어권을 넘겨주지 않고 본인 함수를 계속 실행한다.

그리고 함수 B를 호출할 때 콜백함수를 함께 준다.

함수 B는 함수 실행이 완료되면 함수 A가 준 콜백 함수를 실행한다.



4) 비동기/블로킹 (Async-Blocking)



Async-Blocking의 경우는 사실 잘 마주하기 쉽지 않다.

함수 A는 함수 B의 리턴 값에 신경 쓰지 않고 호출할 때 제어권과 콜백함수를 보낸다. 제어권을 넘겨 줬기에 함수 A는 실행을 멈추고 대기한다.

함수 B는 콜백함수 와 제어권을 넘겨받고 함수를 실행하고 실행이 완료되면 함수 A가 준 콜백 함수를 호출하면서 제어권을 함수 A에게 돌려준다.



정리

각 종류를 비교할 때 가장 중요하기 생각해야하는 것은 콜백함수 전달제어권을 넘겨주는 여부이다.

업데이트: