사전 지식
- 제어권: 자신(함수)의 코드를 실행할 권리같은 것
- 제어권을 가진 함수는 자신의 코드를 끝까지 실행한 후, 자신을 호출한 함수에게 돌려줌.
- 결과값을 기다린다는 것
- A 함수에서 B 함수를 호출했을 때, A 함수가 B 함수의 결과값을 기다리느냐의 여부를 의미함.
블로킹과 논블로킹
Blocking & Non-Blocking
제어권을 어떻게 처리하느냐에 따라 달라짐.
블로킹
A 함수가 B 함수를 호출하면, 제어권을 A가 호출한 B 함수에 넘겨줌.
- A 함수가 B 함수를 호출하면 B에게 제어권을 넘김.
- 제어권을 넘겨받은 B는 함수를 실행하며, 그동안 A는 제어권이 없기 때문에 함수 실행을 멈춤.
- B 함수는 실행이 끝나면 자신을 실행한 A 함수에게 제어권을 돌려줌.
논블로킹
A 함수가 B 함수를 호출해도 제어권은 그대로 자신이 가지고 있음.
- A 함수가 B 함수를 호출해도 제어권은 A 함수가 가지고 있음.
- A 함수는 B 함수가 실행되는 동안 제어권을 가지고 있기 때문에 실행을 멈추지 않음.
동기와 비동기
Synchronous & Asynchronous
호출되는 함수의 작업 완료 여부를 신경쓰는지의 여부에 따라 달라짐.
동기
A 함수가 B 함수를 호출한 뒤, B 함수의 리턴값을 계속 확인하면서 신경쓰는 것
비동기
A 함수가 B 함수를 호출할 때 콜백 함수를 함께 전달해서 함수 B의 작업이 완료되면 함께 보낸 콜백 함수를 실행함.
A 함수는 B 함수를 호출한 뒤로 B 함수의 작업 완료 여부에는 신경쓰지 않음.
동기 논 블로킹과 비동기 블로킹
동기 블로킹과 비동기 논 블로킹은 잘 상상이 갈 것임.
- 동기 블로킹은 제어권을 호출된 함수에 넘겨주면서 나중에 리턴값과 제어권을 다시 받아야 하는 것.
- 비동기 논 블로킹은 호출된 함수에 콜백 함수 외에는 넘기지 않으며 호출된 함수가 종료된 후에 콜백 함수를 실행하는 것. 이때 호출한 함수는 호출된 함수의 작업 여부에는 신경 쓰지 않음.
하지만 동기 논 블로킹과 비동기 블로킹은 조금 다름.
- 동기 논 블로킹은 제어권을 넘기진 않지만 콜백 함수를 따로 넘기는 것도 아님.
- 때문에 함수가 실행되는 중간중간에 호출된 함수에게 완료되었는지 물어보게 될 것임.
- 이는 동기의 성격 중 리턴값을 계속 확인하는 부분임.
- 비동기 블로킹은 제어권과 콜백 함수를 넘김.
- 이때 호출한 함수는 제어권이 넘어갔으므로 작업을 중단한 상태에서 호출된 함수의 콜백 함수를 기다려야 함.
참고 자료
https://velog.io/@nittre/%EB%B8%94%EB%A1%9C%ED%82%B9-Vs.-%EB%85%BC%EB%B8%94%EB%A1%9C%ED%82%B9-%EB%8F%99%EA%B8%B0-Vs.-%EB%B9%84%EB%8F%99%EA%B8%B0