CS에 대해서 공부하는 중에 Blocking/Non-blocking & Synchronous/Asynchronous에 대해서 정리해보려한다.
Blocking과 Non-blocking은 작업이 block되는냐에 따라 다른 작업을 수행할 수 있는지에 대한 관점(즉, 전체적인 작업의 흐름 자체를 막냐 안 막냐)으로 호출된 함수가 호출한 함수에게 제어권을 건네는 타이밍의 차이라고 한다.
함수 A, B가 있을 때 A는 호출한 함수(caller), B는 호출된 함수(callee)이다. 제어권은 B에게 있다.
Blocking은 함수 B는 내 할 일을 다 마칠 때까지 제어권을 가지고 있는다. A는 B가 다 마칠 때까지 기다려야 한다.
Non-blocking: 함수 B는 할 일을 마치지 않았어도 A에게 제어권을 바로 넘겨준다. A는 B를 기다리면서도 다른 일을 진행할 수 있다.
예를 들어, 파일을 읽는 작업이 있을 때, 블로킹 방식으로 읽으면 파일을 다 읽을 때까지 대기하고, 논블로킹 방식으로 읽으면 파일을 다 읽지 않아도 다른 작업을 할 수 있다.
Synchronous와 Asynchronous요청한 작업에 대해 완료 여부를 신경 써서 작업을 순차적으로 수행할지 아닌지에 대한 관점(전체적인 작업에 대한 순차적인 흐름 유무)이다.
Synchronous는 함수 A는 함수 B가 일을 하는 중에 기다리면서, 현재 상태가 어떤지 계속 체크한다.
Asynchronous는 함수 B의 수행 상태를 B 혼자 직접 신경쓰면서 처리한다. 완료되면 callback 처리를 진행한다.
Blocking/Non-blocking & Synchronous/Asynchronous 조합으로 4가지가 있다.

1. Sync Blocking (동기 + 블로킹)
2. Async Blocking (비동기 + 블로킹)
3. Sync Non-Blocking (동기 + 논블로킹)
4. Async Non-Blocking (비동기 + 논블로킹)
이러한 조합들은 프로그램이 작동하는 방식에 영향을 미치는 중요한 요소이다. 어떠한 요소를 조합하여 사용하느냐에 따라 프로그램의 성능과 효율성을 높일 수 있기 때문이다.
<용어 설명>
참고: https://gyoogle.dev/blog/computer-science/network/Blocking,Non-blocking%20&%20Synchronous,Asynchronous.html, https://inpa.tistory.com/entry