I/O wait
기다릴지, 다시 시도할지, 완료 알림을 받을지 고른다
블로킹, 논블로킹, 비동기, 멀티플렉싱은 프로세스가 I/O 완료를 기다리는 방식을 다르게 설계합니다.
대기 위치
프로세스가 잠드는가, 계속 실행되는가.
완료 신호
에러 코드, 이벤트 준비, 콜백, 큐 알림으로 받는다.
적용 지점
단순 파일 읽기와 대규모 소켓 서버는 선택이 달라진다.
01
Blocking
요청한 I/O가 끝날 때까지 프로세스가 sleep 상태로 기다린다.
02
Non-blocking
준비되지 않으면 EAGAIN을 받고 나중에 다시 시도한다.
03
Async
요청을 제출한 뒤 다른 일을 하고 완료 알림을 받는다.
04
Multiplexing
여러 fd를 동시에 감시하고 준비된 작업만 처리한다.
방식
좋은 경우
확인할 비용
Blocking
흐름이 단순하고 동시 연결 수가 작다.
대기 중 CPU를 쓰지 않지만 스레드가 묶인다.
Non-blocking
응답성을 유지하며 직접 재시도 루프를 관리한다.
busy wait가 되지 않도록 이벤트 감시와 묶는다.
Async 또는 epoll
많은 연결과 높은 처리량을 한 루프로 다룬다.
완료 순서, 오류 처리, backpressure 설계가 필요하다.
단순성
작은 도구는 blocking이 이해하기 쉽다.
동시성
연결 수가 늘면 non-blocking과 multiplexing을 본다.
완료 모델
결과를 누가 언제 알려주는지 먼저 정한다.