Quick Comparison
synchronous: 호출 흐름이 결과 완료를 직접 이어서 받음
asynchronous: 완료가 future, callback, event 등으로 나중에 전달됨
blocking: 호출 thread가 진행하지 못하고 기다림
non-blocking: 즉시 반환하며 현재 가능한 결과만 알림두 축은 완전히 같은 말이 아닙니다. 비동기 작업을 시작한 뒤 즉시 .Result로 기다리면 async API를 사용해도 호출 thread는 blocking될 수 있습니다.
조합 읽기
Blocking synchronous read는 데이터가 준비될 때까지 호출이 반환하지 않습니다. Non-blocking read는 현재 데이터가 없으면 즉시 would-block 상태를 반환할 수 있습니다. Asynchronous I/O는 요청을 등록하고 완료를 callback, event, completion queue 또는 task로 받습니다.
API 문서에서 반환 시점, 완료 통지 방식, buffer lifetime을 함께 확인해야 합니다. 비동기 요청 함수가 반환해도 운영체제가 buffer를 계속 사용한다면 완료 전까지 그 memory를 변경하거나 해제하면 안 됩니다.
선택 기준
UI thread나 request 처리 thread를 오래 막지 않아야 하는 I/O에는 async 흐름이 유리합니다. 짧고 즉시 끝나는 in-memory 연산을 억지로 async로 감싸면 scheduling과 allocation만 늘 수 있습니다.
CPU-bound 계산을 background에서 실행하려면 async I/O가 아니라 worker 또는 parallel execution 정책이 필요합니다.
자주 틀리는 점
- async 함수가 항상 별도 thread에서 실행된다고 말하지 않습니다.
- non-blocking 호출을 busy loop로 계속 반복하면 CPU를 낭비할 수 있습니다.
- callback이 어느 thread에서 호출되는지 추측하지 않고 API 계약을 확인합니다.
- cancellation 요청이 즉시 작업 중단을 보장한다고 가정하지 않습니다.
참고 링크
2 sources