Block vs Non-Block & Sync vs Async
이미지 자료 출처 : https://www.youtube.com/watch?v=oEIoqGd-Sns
Blocking VS Non-Blocking
보통 직접 제어할 수 없는 I/O, 멀티스레드 동기화 등에 적용되는 개념입니다.
Block/Non-Block은 제어권의 이동이라는 개념으로 설명하기도 합니다.
Blocking
2개 이상의 작업이 있을 때 자신의 작업을 진행하다가
다른 주체의 작업이 시작되면 다른 작업이 끝날 때까지 기다렸다가 자신의 작업을 시작하는 것
설명을 위하여 왼쪽 작업을 A라 칭하고 오른쪽 작업을 B라고 칭하겠습니다.
Blocking은 A의 작업 도중 B를 호출하는 경우 B의 작업이 끝날 때까지 A는 작업을 할 수 없습니다.
제어권이 A에 있다가 B를 호출할 때 B로 제어권이 이동하게 됩니다.
A는 제어권이 없으므로 나머지 로직을 실행하기 위해서 B의 작업이 끝나고
제어권이 A로 돌아올 때까지 기다려야 합니다.
여기서 제어권이란?
작업을 실행할 수 있는지를 의미
Non_Blocking
다른 주체의 작업에 관련없이 자신의 작업을 하는 것
A의 작업 도중 B를 호출한 후 B의 작업과 상관없이 A의 나머지 작업을 수행하는 것입니다.
제어권은 B에게 넘어가도 B는 즉시 결과를 return하여 A에게 제어권을 돌려주게 됩니다.
즉, 블러킹과 넌블러킹은 다른 주체가 작업할 떄 자신의 제어권이 있는지 없는지로 구분할 수 있습니다.
Synchronous VS Asynchronous
작업을 수행하는 두 주체가 서로의 작업의 시작/완료 여부를 확인해야 하는가에 대한 개념입니다.
정확히는 작업을 요청한 측에서 요청한 작업의 완료여부를 확인하면 동기, 그렇지 않으면 비동기입니다.
제어권에 대한 설명은 아래 이어지는 4가지 경우의 차이점 내용을 확인하시면 됩니다.
synchronous
동기, 작업을 동시에 수행하거나, 동시에 끝나거나, 끝나는 동시에 시작함을 의미합니다.
설명을 위하여 왼쪽 작업을 A라 칭하고 오른쪽 작업을 B라고 칭하겠습니다.
A라는 작업 도중 B에게 도움을 요청하게 됩니다.
요청받은 B는 필요한 작업을 수행 후 A에게 결과를 리턴합니다.
이후 A는 받은 데이터를 가지고 남은 작업을 수행합니다.
B의 작업이 수행되는 동안 A는 기다리거나, 다른일을 수행합니다.
Asynchronous
비동기, 시작, 종료가 일치하지 않으며, 끝나는 동시에 시작을 하지 않음을 의미합니다.
이 경우에도 역시 A라는 작업이 B에게 도움을 요청합니다.
아까와는 다르게 결과에 큰 비중을 두지 않습니다.
자신의 작업을 계속 이어나갑니다.
그리고 B에게서 결과가 돌아오면 돌아온 결과에 대해서 처리를 안할수도 있고 할수도 있습니다.
즉, 동기와 비동기는 결과를 돌려주었을 때 순서와 결과에 관심이 있는지 아닌지로 판단할 수 있습니다.
4가지 경우의 차이점
1. Blocking/Sync
Blocking의 관점은 제어권에 있습니다. 그래서 다른 작업이 시작되는동안 A는 동작하지 않습니다.
Sync의 관점은 결과의 처리입니다. 따라서 B가 결과를 반환하면 해당업무를 바로 처리하게 됩니다.
Blocking / Sync 예시)
2. Non-Blocking / Sync
Non-Blocking은 다른 작업이 있어도 자신의 제어권을 가지고 일을하는 것입니다.
Sync는 결과에 관심이 있습니다.
그래서 중간중간 A가 B에게 작업 완료 여부를 물어봅니다.
작업이 완료되면 A가 해당 결과를 가지고와서 남은 작업을 수행합니다.
Blocking / Sync와 큰 차이가 없습니다.
언제 사용하는가?
ex) 게임에서 맵을 넘어갈때 해당 데이터를 가져올 때까지 유저에게 정보의 로드율이 얼마만큼 인지를 보여줄 때
3. Blocking / Async
Blocking 이기 때문에 자신에 대한 제어권이 없습니다.
Async이기 때문에 결과를 바로 처리하지 않아도 됩니다.
이 조합은 굳이 비동기인데 Blocking을 써야 할까? 생각할 수 있지만
보통 Non-Blocking / Async로 하려다가 실수 혹은 기타 이유로 이와같이 동작하는 경우가 있다고 합니다.
4. Non-Blocking / Async
Non-Blocking은 다른 작업이 시작되어도 자신이 하던 작업은 멈추지 않습니다.
따라서 양쪽에서 각자 작업을 처리하게 됩니다.
Async는 결과를 바로 처리하는게 아닙니다.
따라서 다른 작업에서 끝난 결과를 바로 처리하지 않고
자신의 일이 끝나게 되면 그때 처리를 하게 됩니다.
대표적인 예시) 자바스크립트에서 API 요청을하고 다른 작업을 하다가 콜백을 통해 추가적인 작업을함
정리
Blocking VS Non-Blocking 제어의관점
Sync VS Async 순서와 결과(처리)의 관점
참고자료
https://www.youtube.com/watch?v=oEIoqGd-Sns