본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.
강의 요약
오늘 강의에서는 동기와 비동기, 블로킹과 논블로킹에 대해 다루었다. 특히 I/O Multiplexing 기법을 통해 단일 스레드로 다수의 I/O 작업을 처리하는 방법을 살펴보았다. 보통 두 개념을 매우 혼동하거나 동일한 것으로 여기는 경우가 많은데, 나도 마찬가지라 추가적으로 정리해보자.
Blocking vs Non-Blocking
블로킹과 논블로킹은 제어권의 반환 시점에 관한 개념이다. 호출된 함수가 작업을 완료할 때까지 제어권을 보유하는지, 즉시 반환하는지에 따라 구분된다.
Blocking
- 블로킹 방식은 호출된 함수가 작업을 완료할 때까지 제어권을 반환하지 않는다.
- 호출자는 작업이 끝날 때까지 대기 상태에 머물며 다른 작업을 수행할 수 없다.

- 작업의 실행 흐름이 명확하고 코드 추적이 용이하다.
- 순차적 처리가 보장되므로 디버깅이 쉽고 에러 처리가 직관적이다.
- 다만 I/O 작업 중 스레드가 유휴 상태로 대기하므로 자원 활용률이 낮아질 수 있다.
Non-Blocking
- 논블로킹 방식은 호출된 함수가 작업 완료 여부와 무관하게 즉시 제어권을 반환한다.
- 작업이 완료되지 않았다는 응답 자체가 결과가 된다.

- 스레드가 블로킹되지 않아 동일한 스레드에서 여러 작업을 처리할 수 있다.
- 자원 활용률이 높아지며 대규모 동시 요청 처리에 유리하다.
Synchronous vs Asynchronous
동기와 비동기는 작업의 결과를 기다리는 방식과 완료 여부를 확인하는 주체에 관한 개념이다.
Synchronous
- 동기 방식은 결과를 기다리는 주체가 호출한 스레드 자신이다.
- 호출자가 직접 작업 완료를 확인하며, 작업의 시작과 완료가 순서대로 이어진다.
- 작업 간 실행 순서가 보장되며 코드의 흐름을 따라가기 쉽다.
- 하나의 작업이 완료되어야 다음 작업으로 진행되는 명확한 처리 흐름을 가진다.
Asynchronous
- 비동기 방식은 결과를 기다리는 주체가 호출자가 아닌 별도의 메커니즘이다.
- 호출자는 작업을 요청한 후 완료를 기다리지 않고, 콜백이나 시그널을 통해 나중에 결과를 통보받는다.
- 작업 완료를 기다리는 동안 다른 작업을 수행할 수 있어 처리량이 향상된다.
- 여러 작업을 동시에 진행할 수 있으나 완료 순서를 예측할 수 없다.
두 개념의 독립성
블로킹/논블로킹과 동기/비동기는 서로 다른 관점에서 시스템 동작을 설명하는 독립적인 개념이다. 블로킹/논블로킹은 제어권 반환 시점에 집중하며, 동기/비동기는 작업 완료 확인 주체와 순서 보장에 집중한다.
이 두 축이 독립적이므로 다음과 같이 네 가지 조합이 가능하다.
| 구분 | Blocking | Non-Blocking |
| Synchronous | 동기 블로킹 | 동기 논블로킹 |
| Asynchronous | 비동기 블로킹 | 비동기 논블로킹 |
Synchronous Blocking
- 가장 일반적이고 단순한 형태의 I/O 방식이다.
- 호출자가 작업 완료를 직접 확인하며, 완료될 때까지 제어권을 돌려받지 못한다.

적용 사례
- 일반적인 파일 읽기/쓰기 (read, write)
- 데이터베이스 쿼리 실행
- 순차적으로 처리해야 하는 배치 작업
Synchronous Non-Blocking
- 호출자가 작업 완료를 직접 확인하지만, 제어권은 즉시 반환받는다.
- 작업이 완료되지 않았다는 응답을 받고 반복적으로 상태를 확인한다.

적용 사례
- 논블로킹 모드의 select, epoll
- 주기적인 상태 확인이 필요한 작업
- 폴링 기반 이벤트 처리
Asynchronous Blocking
- 비동기 방식으로 여러 작업을 처리하지만 스레드는 블로킹 상태에 놓이는 조합이다.
- I/O Multiplexing이 대표적인 사례다.

적용 사례
- select, poll을 사용한 I/O Multiplexing
- 단일 스레드로 다수 소켓 관리
- 이벤트 루프 기반 서버
Asynchronous Non-Blocking
- 가장 효율적인 형태의 I/O 처리 방식이다.
- 호출자는 작업을 요청한 후 즉시 제어권을 돌려받으며, 완료는 콜백이나 시그널로 통보받는다.

적용 사례
- Node.js의 이벤트 루프
- nginx, Netty 같은 고성능 서버
- Spring WebFlux의 리액티브 프로그래밍
- 클라우드 환경의 비동기 API 호출
참고 출처
- https://developer.ibm.com/articles/l-async/
- https://medium.com/@minz.kweon/정리-sync-vs-async-blocking-vs-non-blocking-5eb45fac3b74
- https://choi-geonu.medium.com/백엔드-개발자들이-알아야할-동시성-2-블로킹과-논블로킹-동기와-비동기-e11b3d01fdf8



