동기와 비동기를 판단하는 기준은 작업 완료이다.
동기는 호출한 함수가 작업 완료를 스스로 신경 쓴다.
비동기는 호출된 함수(callback 함수)가 신경 쓰고, 호출한 함수는 신경 쓰지 않는다.
동기 (Synchronous)
요청과 결과가 동시에 일어난다.
어떤 작업에 대한 요청이 발생했을 때, 그 요청에 대한 응답을 받을 때까지 대기해야 한다.
작업에 대한 완료를 호출한 함수가 신경 쓴다.
Thread1, Thread2가 존재할 때, Thread1에서 처리하려고 했던 일을 Thread2에게 보낸 경우, Thread2가 해당 작업을 수행하는 동안 Thread1은 대기 상태가 된다.
비동기 (Asynchronous)
요청과 결과가 동시에 일어나지 않는다.
작업에 대한 완료를 호출 함수가 아닌 callback 함수가 신경 쓴다.
Thread1, Thread2가 존재할 때, Thread1에서 처리하려고 했던 일을 Thread2에게 보낸 경우, Thread2가 해당 작업을 수행하는 동안 Thread1은 대기 없이 다른 작업을 실행한다.
블로킹과 논블로킹을 판단하는 기준은 제어권이다.
블로킹은 호출된 함수가 제어권을 가지고 자신의 작업을 모두 마칠 때까지 호출한 함수에게 제어권을 넘겨주지 않고 대기한다.
논블로킹은 호출된 함수에게 제어권이 넘어가지 않고, 호출한 함수가 제어권을 가지고 계속해서 다른 일을 한다.
블로킹 (Blocking)
A함수가 실행되는 중에 제어권이 B함수로 넘어가게 되고, A함수는 제어권이 없는 상태로 B함수의 종료까지 대기해야 한다.
논블로킹 (Non-Blocking)
A함수가 실행되는 중에 B함수가 호출되더라도, A함수의 제어권이 B함수로 넘어가지 않고 작업을 계속 진행한다.