728x90
동기(Synchronous) vs 비동기(Asynchronous)
Synchronous
- 작업을 동시에 수행하거나, 동시에 끝나거나, 끝나는 동시에 시작함
- Thread1이 작업을 시작시키고, Task1이 끝날때까지 기다렸다 Task2를 시작
- 작업 요청을 했을 때 요청의 결과값(return)을 직접 받음
- 요청의 결과값이 return값과 동일
- 호출한 함수가 작업 완료를 신경 씀
Asynchronous
- 시작, 종료가 일치하지 않으며 끝나는 동시에 시작을 하지 않음
- 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 함수에게 제어권을 넘긴다(블로킹).
- 따라서, A 함수는 자신과 관련 없는 B 함수의 작업이 끝날 때까지 기다려야 한다.
- 비효율적 ex) Node.js + Mysql
728x90