동기(동기화), 비동기(비동기화), Blocking, Non-blocking은 헷갈리기 쉬운 개념이다.
특히, Blocking = Synchronous, Non-blocking = Asynchronous라고 착각하기 쉽지만, 완전히 다른 개념이다.
아래에서 개념과 차이점을 정리해보자.
Blocking
Non-blocking
Synchronous (동기)
Asynchronous (비동기)
구분 | Blocking | Non-blocking |
---|---|---|
Synchronous | 작업 완료까지 대기 + 상태 체크 | 작업을 넘기고 제어권은 돌려받지만, 상태를 계속 확인 |
Asynchronous | 작업 완료까지 대기 + 완료 후 알려줌 | 작업을 넘기고 완료 시 콜백으로 알려줌 (완전 자유롭게 다른 작업 가능) |
병원에 진료를 받으러 갔다고 가정해보자.
📝 설명:
👉 나는 아무것도 못 하고 계속 기다리고(Blocking),
👉 상태도 계속 신경 씀(Synchronous).
📝 설명:
👉 나는 아무것도 못 하고 계속 기다리고(Blocking),
👉 상태는 신경 안 씀(Asynchronous).
📝 설명:
👉 나는 다른 일을 하긴 하지만(Non-blocking),
👉 계속 상태를 확인해야 함(Synchronous).
📝 설명:
👉 나는 자유롭게 다른 일을 하고(Non-blocking),
👉 병원에서 알아서 알려줌(Asynchronous).
구분 | 설명 |
---|---|
Blocking | 나는 대기실에 묶여있음 (아무것도 못 함) |
Non-blocking | 나는 밖에 나가서 자유롭게 다른 일 가능 |
Synchronous | 계속 상태를 내가 확인함 (전화, 체크) |
Asynchronous | 병원이 다 되면 알아서 연락줌 (문자, 알림) |
용어 | 의미 |
---|---|
Blocking / Non-blocking | 제어권을 넘겨주는지 여부 (기다림 vs 넘김) |
Synchronous / Asynchronous | 작업 상태를 누가 신경 쓰는지 여부 (직접 체크 vs 알아서 알려줌) |
좋아! 그럼 방금 작성해준 블로그 내용에 이어서
Blocking I/O와 Non-blocking I/O 개념도 동일한 스타일로 마크다운으로 추가 작성해줄게.
I/O 작업은 사용자 프로그램이 직접 처리하지 못하고, 반드시 커널(Kernel)을 통해 수행된다.
따라서, 프로세스 또는 스레드는 커널에게 I/O를 요청하고, 그 결과를 받아야 한다.
여기서 I/O 처리 방식에 따라 Blocking I/O와 Non-blocking I/O로 구분된다.
📝 특징:
EWOULDBLOCK
반환). 📝 특징:
구분 | Blocking I/O | Non-blocking I/O |
---|---|---|
제어권 반환 | 작업 완료 후 반환 | 즉시 반환 |
프로세스 상태 | 대기 | 다른 작업 수행 가능 |
효율성 | CPU 자원 낭비 | CPU 자원 활용 가능 |
데이터 확인 | 작업 완료까지 대기 | 계속 체크 (폴링 등 필요) |
사용 예 | 간단한 프로그램, 적은 연결 | 많은 연결 처리, 고성능 서버 |
I/O 방식 | 예시 |
---|---|
Blocking I/O | 진료 끝날 때까지 대기실에 앉아서 계속 기다림 |
Non-blocking I/O | 카페에 가서 쉬면서 시간마다 병원에 전화해 순서를 확인 |
Blocking I/O는 작업 끝날 때까지 멈춰있고, Non-blocking I/O는 멈추지 않고 다른 일을 하며 결과를 계속 확인한다!