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
더보기
https://musma.github.io/2019/04/17/blocking-and-synchronous.html
동기와 비동기, 그리고 블럭과 넌블럭
무릇 모든 개발자들, 아니 비단 개발자가 아니라 할지라도 컴퓨터 관련 산업계 종사자들이라면 오다 가다 한 번씩은 꼭 들어보고, 또 익혔음직한 내용이겠습니다. 이름하야, 동기(Synchronous)와 비
musma.github.io
https://haneepark.github.io/2021/07/18/blocking-nonblocking-sync-async
이제 그만 헷갈렸으면 좋겠다. Blocking과 Non-Blocking, Sync와 Async
Blocking과 Non-Blocking, Sync와 Async 개념은 뭐랄까.. 이해한 것 같다가도 오랜만에 보면 헷갈리고, 알 것 같다가도 섞어서 보면 또 모르겠더군요🤔 한 번 확실히 짚고 넘어가면 좋겠더라고요. 마침 적
haneepark.github.io
728x90