현재 작업의 응답이 끝남과 동시에 다음 작업이 요청된다.
함수를 호출하는 곳에서 호출되는 함수가 결과를 반환할 때까지 대기한다.
작업 완료 여부를 계속해서 확인한다.
현재 작업의 응답이 끝나지 않은 상태에서 다음 작업이 요청된다.
함수를 호출하는 곳에서 결과를 기다리지 않고, 다른 함수(callback)에서 결과를 처리한다.
작업 완료 여부를 확인하지 않는다.
제어권이 호출된 함수에게 넘어가서 호출된 함수 내에서 작업이 모두 끝난 후, 호출한 함수에게 다시 제어권이 넘어간다.
작업이 완료된 후 새로운 작업을 수행할 수 있다.
둘 다 시스템의 반환을 기다린다는 측면에서 같은 개념이다.
하지만 시스템의 반환을 기다리는 동안
Waiting Queue에 머무는 것이 필수가 아니면 Synchronous
Waiting Queue에 머무는 것이 필수이면 Blocking
System call이 반환될 때
실행된 결과와 함께 반환되면 Asynchronous
실행된 결과와 함께 반환되지 않으면 Non-blocking
Synchronous + Blocking
: 가장 많이 쓰이는 조합 중 하나이다. 모든 실행과 흐름이 순차적으로 진행되기 때문에 개발자가 프로그램을 제어하기 쉽다. Blocking 방식이므로 호출되는 함수에게 제어권이 넘어가서 다른 일을 못하고 대기해야 한다.
Synchronous + Non-blocking
: Non-blocking 방식이므로 호출한 함수는 다시 제어권을 받지만 순차적으로 진행되어야 하기 때문에 계속적으로 작업이 완료되었는지 물어보는 일(Polling)을 추가로 수행한다.
Asynchronous + Blocking
: 특별한 장점이 없이 가장 비효율적인 조합이다. 순차적으로 진행되지 않아도 되지만 제어권이 넘어갔기 때문에 결국 다른 일을 못하고 대기해야 한다. Asynchronous Non-blocking 모델 중에서 프로그래머의 실수로 Asynchronous blocking으로 동작하는 경우가 있다. Node.js(Async) + MySQL(Blocking)의 조합이 대표적이다.
Asynchronous + Non-blocking
: 가장 많이 쓰이는 조합 중 하나이다. 순차적으로 진행되지 않아도 되며, Non-blocking 방식이므로 제어권을 바로 돌려받는다. 따라서 다른 작업의 완료 여부와 상관 없이 다른 작업을 할 수 있다. 성능과 자원의 효율면에서 가장 유리한 모델이다.