Appearance
[Network] Blocking/Non-blocking & Synchronous/Asynchronous
Blocking/Non-blocking과 Synchronous/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