포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.



강의 요약

오늘 강의에서는 동기와 비동기, 블로킹과 논블로킹에 대해 다루었다. 특히 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://fastcampus.info/4oKQD6b

+ Recent posts