역량 UP!/Architecture
Blocking&non-Blocking 그리고 Sync&Async 이해하기!
태하팍
2025. 11. 3. 13:24
반응형
개념을 쉽게 이해해보자!

Blocking과 Non-Blocking
CPU / 쓰레드 레벨의 개념
Sync와 Async
Application(메소드 호출 흐름) 개념
Blocking / Non-Blocking = 쓰레드와 CPU의 관계
- Blocking
- I/O 작업(Disk, Network)을 기다리는 동안 쓰레드가 멈춤
- CPU가 놀고 있음(idle 상태)
- CPU를 낭비! 일해야하는데 일하지 않고 놈!
- Non-Blocking
- I/O 요청 후 즉시 리턴, 나중에 완료되면 알려줌
- 나중에 누가??
- 하드웨어 I/O는 OS커널이 감지하고 알려줌
- 어플리케이션 레벨은 EventLoop or ThreadPool이 Callback을 실행하며 알려 줌
- 이것때문에 특징을 헷깔릴 수 있음주의!
- Non-Blocking + Async(Callbak) 조합!
- 이것때문에 특징을 헷깔릴 수 있음주의!
- 나중에 누가??
- CPU가 다른 작업 처리 가능
- Polling 방식(직접확인)
- I/O 요청 후 즉시 리턴, 나중에 완료되면 알려줌
Sync / Async = 메소드 실행 흐름(로직 레벨)
- Synchronous
- 앞의 작업이 끝나야 다음 작업 진행
- 순서가 있음
- Asynchronous
- 작업을 백그라운드에 던져 좋고 다른 일 진행
- 결과는 나중에 받음(=Callback / Future 기반)
개념은 분리되지만 보통 조합해서 사용하기 때문에 헷깔림!
Non-Blocking, Async등 개념 학습하다보면 보통 조합을 해서 사용하기 때문에 더 이해하기 어려울수 있음.
나눠서 생각하지 말고 묶어서 생각하자!
특히 첫번째와 마지막 패턴을 눈여겨보자!
4가지 패턴으로 구분
| 패턴 | 설명 | 효율 | 비고 |
| Blocking + Sync | 요청하고 결과 나올때까지 기다림 | 낮음 | Spring MVC+JDBC |
| Blocking + Async | 요청은 Blocking이지만 결과는 콜백으로 받음 (TreadPoll에서 작업) |
비효율 | Future.get(), @Async+Blocking DB |
| Non-Blocking + Sync | 요청하면 바로 리턴하지만 결과는 직접 계속 체크(Polling 방식) | CPU낭비 | |
| Non-Blocking + Async | 요청은 바로 리턴, 완료되면 콜백/이벤트로 알려줌 | 최고 효율! | Redis, Netty, WebFlux, Akka |
마지막으로 정리하면
Async나 Sync의 메소드 흐름속에 Blocking, Non-Blocking이 들어가는건가? 등 헷깔릴수 있음!
Blocking/Non-Blocking은 그냥 요청할 때의 동작 방식(I/O 요청 시 쓰레드가 기다리냐 안기다리냐)
Sync/Async는 응답을 받을 때의 방식(=응답을 기다렸다가 받냐, 콜백으로 받냐)
Redis, Akka, WebFlux, Netty 등이 가장 많이 사용되고 있는 4번째 패턴이니 염두해보고 학습을 하게 된다면 좀 더 이해가 됩니다.
참고:
2025.10.28 - [OpenSource/Redis] - Redis Single Thread, 싱글인데 왜 빠르지??
반응형