Thread1이 작업을 시작 시키고, 완료를 기다리지 않고, Thread1은 다른 일을 처리할 수 있음
작업 요청을 했을 때 요청의 결과값(return)을 간접적으로 받음
요청의 결과값이 return값과 다를 수 있음
해당 요청 작업은 별도의 스레드에서 실행하게 됨
콜백을 통한 처리가 비동기 처리라고 할 수 있음
호출된 함수(callback 함수)가 작업 완료를 신경 씀
blocking vs non-blocking
Blocking
호출된 함수가 자신이 할 일을 모두 마칠 때까지 제어권을 계속 가지고서호출한 함수에게 바로 돌려주지 않음
Application이 kernel로 작업 요청을 할 때, kernel에서는 요청에 대한 로직을 실행합니다. 이 때, Application은 요청에 대한 응답을 받을 때까지 대기를 합니다. Application은 kernel이 작업을 끝낼 때까지 백그라운드에서 작업이 끝났는지 지속적으로 확인합니다.
Non-blocking
호출된 함수가 자신이 할 일을 채 마치지 않았더라도 바로 제어권을 건네주어(return)호출한 함수가 다른 일을 진행할 수 있도록 해줌
Application이 요청을 하고 다른 로직을 실행할 수 있게끔 바로 제어권을 받습니다. 이 것이 바로 blocking이 되지 않았다고 해서 non-blocking I/O 입니다.
동기/비동기, blocking/non-blocking의 차이
Blocking / Non-Blocking : 제어권을안넘기는지 / 넘기는지
Sync / Async: 결과를 돌려줄 때 결과와 순서에관심이 있는지 / 없는지
1. Sync-Blocking
함수 A는 함수 B의 리턴값을 필요로 한다(동기)
그래서 제어권을 함수 B에게 넘겨주고, 함수 B가 실행을 완료하여 리턴값과 제어권을 돌려줄때까지 기다린다(블로킹)
2) Sync-Nonblocking
A 함수는 B 함수를 호출한다. 이 때 A 함수는 B 함수에게 제어권을 주지 않고, 자신의 코드를 계속 실행한다(논블로킹)
그런데 A 함수는 B 함수의 리턴값이 필요하기 때문에, 중간중간 B 함수에게 함수 실행을 완료했는지 물어본다(동기)
3. Async-Nonblocking
A 함수는 B 함수를 호출한다.
이 때 제어권을 B 함수에 주지 않고, 자신이 계속 가지고 있는다(논블로킹). 따라서 B 함수를 호출한 이후에도 멈추지 않고 자신의 코드를 계속 실행한다
그리고 B 함수를 호출할 때 콜백함수를 함께 준다. B 함수는 자신의 작업이 끝나면 A 함수가 준 콜백 함수를 실행한다(비동기)
4. Async-blocking
A 함수는 B 함수의 리턴값에 신경쓰지 않고, 콜백함수를 보낸다(비동기).
그런데, B 함수의 작업에 관심없음에도 불구하고, A 함수는 B 함수에게 제어권을 넘긴다(블로킹).