콘텐츠로 이동

블로킹 vs 논블로킹 I/O

Jan 23, 2026 · Updated Jan 27, 2026

Blocking I/O는 I/O 완료까지 호출 스레드가 대기 상태로 전환되는 방식이다. Non-blocking I/O는 I/O 완료 여부와 관계없이 즉시 반환하여 스레드가 계속 실행되는 방식이다.

I/O 장치는 CPU보다 훨씬 느려서, 두 방식은 대기 시간을 어떻게 처리할지에 대한 서로 다른 접근법을 제공한다.

  1. 프로세스가 blocking 시스템 콜 호출 (예: read())
  2. 커널이 프로세스를 run queue에서 wait queue로 이동
  3. I/O 완료 후 프로세스를 다시 run queue로 이동
  4. 재개 시 시스템 콜 결과값 반환
  1. 프로세스가 non-blocking 시스템 콜 호출
  2. 즉시 반환 (현재 가능한 만큼의 데이터와 함께)
  3. 프로세스가 직접 다시 확인하거나 다른 작업 수행
구분BlockingNon-blockingAsynchronous
반환 시점I/O 완료 후즉시즉시
반환값전체 데이터가능한 만큼 (0~전체)없음 (나중에 통보)
완료 통보필요 없음직접 확인 필요시그널/콜백으로 통보
사용 예일반 파일 읽기select()aio_read()
// Blocking
read(fd, buf, size); // 완료까지 대기
process_data(buf); // 완료 후 실행
// Non-blocking
while ((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와 함께 사용하여 효율을 높임