블로킹 vs 논블로킹 I/O
Jan 23, 2026 · Updated Jan 27, 2026
핵심 개념
섹션 제목: “핵심 개념”Blocking I/O는 I/O 완료까지 호출 스레드가 대기 상태로 전환되는 방식이다. Non-blocking I/O는 I/O 완료 여부와 관계없이 즉시 반환하여 스레드가 계속 실행되는 방식이다.
I/O 장치는 CPU보다 훨씬 느려서, 두 방식은 대기 시간을 어떻게 처리할지에 대한 서로 다른 접근법을 제공한다.
동작 원리
섹션 제목: “동작 원리”Blocking I/O
섹션 제목: “Blocking I/O”- 프로세스가 blocking 시스템 콜 호출 (예: read())
- 커널이 프로세스를 run queue에서 wait queue로 이동
- I/O 완료 후 프로세스를 다시 run queue로 이동
- 재개 시 시스템 콜 결과값 반환
Non-blocking I/O
섹션 제목: “Non-blocking I/O”- 프로세스가 non-blocking 시스템 콜 호출
- 즉시 반환 (현재 가능한 만큼의 데이터와 함께)
- 프로세스가 직접 다시 확인하거나 다른 작업 수행
비교표
섹션 제목: “비교표”| 구분 | Blocking | Non-blocking | Asynchronous |
|---|---|---|---|
| 반환 시점 | I/O 완료 후 | 즉시 | 즉시 |
| 반환값 | 전체 데이터 | 가능한 만큼 (0~전체) | 없음 (나중에 통보) |
| 완료 통보 | 필요 없음 | 직접 확인 필요 | 시그널/콜백으로 통보 |
| 사용 예 | 일반 파일 읽기 | select() | aio_read() |
// Blockingread(fd, buf, size); // 완료까지 대기process_data(buf); // 완료 후 실행
// Non-blockingwhile ((n = read(fd, buf, size)) == -EAGAIN) { do_other_work(); // 데이터 없으면 다른 작업}process_data(buf);비유:
- Blocking: 전화 통화. 상대방이 받을 때까지 전화기 앞에서 기다림
- Non-blocking: 문자 메시지. 보내고 바로 다른 일 할 수 있음. 답장 오면 나중에 확인
트레이드오프
섹션 제목: “트레이드오프”Blocking:
- 장점: 프로그래밍 단순, 순차적 로직
- 단점: 스레드가 대기 상태로 묶임, 동시성 제한
Non-blocking:
- 장점: 스레드가 다른 작업 가능, 반응성 좋음
- 단점: 폴링 필요, 코드 복잡도 증가
관련 개념
섹션 제목: “관련 개념”- Polling - CPU가 장치 상태를 반복 확인하는 I/O 방식으로, 논블로킹 I/O에서 데이터 준비 여부를 확인할 때 사용
- Interrupt-Driven I/O - 장치가 준비되면 인터럽트로 알리는 방식으로, 블로킹 I/O의 대기 후 깨우기에 활용
- DMA (Direct Memory Access) - CPU 개입 없이 대량 데이터를 전송하여 블로킹 대기 시간을 줄이는 기법
- UNIX 파일 디스크립터 - read()/write() 시스템 콜에서 블로킹/논블로킹 모드를 설정하는 핸들
- 버퍼링 (Buffering) - 속도 차이를 해소하는 임시 메모리 영역으로, 논블로킹 I/O와 함께 사용하여 효율을 높임