Skip to content

[Network] Blocking/Non-blocking & Synchronous/Asynchronous

Blocking/Non-blockingSynchronous/Asynchronous는 서로 다른 축이다.

  • Blocking/Non-blocking호출 시점에 제어권이 언제 돌아오는가
  • Synchronous/Asynchronous완료를 어떤 방식으로 확인하고 다음 단계를 이어가는가

이 둘을 같은 개념으로 보면 I/O 모델이나 이벤트 처리 방식을 설명할 때 자주 헷갈리게 된다.


Blocking / Non-blocking

함수 A가 함수 B를 호출한다고 하자.

  • Blocking: A가 B를 호출했을 때 제어권이 바로 돌아오지 않는다. 즉, 호출한 스레드는 그 자리에서 대기한다.
  • Non-blocking: B가 아직 즉시 처리할 수 없더라도 A에게 즉시 제어권을 돌려준다. A는 다른 일을 계속할 수 있다.

핵심은 호출 시점에 제어권이 즉시 돌아오느냐이다.


Synchronous / Asynchronous

이번에는 결과를 언제, 어떻게 소비하는가를 보자.

어원으로 보면 Synchronous는 그리스어 계열의 syn(함께) + chronos(시간)에서 온 말로, 시간을 함께 맞춘다는 느낌에 가깝다. 즉, 호출한 쪽의 흐름이 작업의 완료 시점에 맞춰 진행된다는 뜻으로 이해할 수 있다. 반대로 Asynchronous는 부정 접두사 a-가 붙어, 완료 시점에 호출자의 흐름을 꼭 맞추지 않고 나중에 결과를 전달받는 형태를 뜻한다.

  • Synchronous: A는 B의 완료/결과를 자신의 흐름 안에서 확인한 뒤 다음 단계로 진행한다. 기다릴 수도 있고, 주기적으로 다시 확인할 수도 있지만, 완료 확인의 책임은 A 쪽에 있다.
  • Asynchronous: A는 B에게 작업을 맡긴 뒤 자신의 일을 계속하고, B의 완료 시점은 callback, promise/future completion, event, message 등으로 나중에 통지받는다.

핵심은 완료를 누가 주도해서 맞추느냐이다.

즉,

  • 동기는 호출한 쪽의 흐름이 결과 시점에 맞춰 이어지고
  • 비동기는 완료 사실이 별도의 통지 메커니즘으로 전달된다.

쉽게 말해 동기는 요청한 작업의 완료 여부를 확인하며 순서대로 이어가는 방식이고, 비동기는 요청 후 다음 작업을 이어가다가 완료 사실을 나중에 전달받는 방식이다.

비동기 = 무조건 non-blocking, 동기 = 무조건 blocking은 아니다. 실제로는 4가지 조합이 모두 가능하다.

또한 동기/비동기스레드 개수와 직접 같은 말도 아니다. 같은 스레드에서도 비동기 처리를 할 수 있고, 여러 스레드를 써도 동기 방식으로 결과를 기다릴 수 있다.


네 가지 조합

상황: 치킨집에 직접 치킨을 사러 감

1) Blocking & Synchronous

나 : 치킨 한 마리 포장해주세요
사장님 : 금방 되니까 잠시만요
나 : 네
-- 치킨 조리 중 --
나 : (그 자리에서 기다리며 진행 상황도 신경씀)
  • 자리를 떠나지 못하므로 blocking
  • 결과를 내가 직접 기다리고 확인하므로 synchronous

2) Blocking & Asynchronous

나 : 치킨 한 마리 포장해주세요
사장님 : 금방 되니까 잠시만요
나 : 네
-- 치킨 조리 중 --
나 : (그 자리에서 기다리지만, 언제 끝나는지는 사장님이 알려주길 기다림)
  • 자리를 떠나지 못하므로 blocking
  • 완료 여부를 내가 직접 조회하지 않고 상대의 통지에 의존하므로 asynchronous
  • 기술적으로는 비동기 작업을 걸어두고, 완료 이벤트를 기다리느라 현재 흐름이 block된 경우로 볼 수 있다.

3) Non-blocking & Synchronous

나 : 치킨 한 마리 포장해주세요
사장님 : 시간 좀 걸리니 볼일 보시다 오세요
나 : 네
-- 치킨 조리 중 --
(5분 뒤) 나 : 제 거 나왔나요?
사장님 : 아직이요
(10분 뒤) 나 : 제 거 나왔나요?
사장님 : 아직이요
  • 바로 다른 일을 하러 갈 수 있으므로 non-blocking
  • 완료 여부를 내가 직접 반복 확인하므로 synchronous
  • 즉, 제어권은 바로 돌아오지만 결과 확인 책임은 여전히 호출자에게 있다.

4) Non-blocking & Asynchronous

나 : 치킨 한 마리 포장해주세요
사장님 : 시간 좀 걸리니 볼일 보시다 오세요
나 : 네
-- 치킨 조리 중 --
나 : (다른 일 하는 중)
...
사장님 : 치킨 나왔습니다
나 : 감사합니다
  • 기다리지 않고 다른 일을 할 수 있으므로 non-blocking
  • 완료 시점은 사장님이 알려주므로 asynchronous

참고 사항