I/O Multiplexing

select, poll, epoll 이벤트 루프 상태 전이

I/O 멀티플렉싱은 많은 소켓을 한 스레드에서 기다리되, 준비된 이벤트만 처리하는 상태 머신으로 이해해야 합니다.

01

소켓 등록

관심 있는 fd와 읽기/쓰기 이벤트를 이벤트 감시 구조에 등록합니다.

interest set
02

대기

select, poll, epoll_wait가 준비된 이벤트가 생길 때까지 기다립니다.

wait
03

읽기 처리

읽을 수 있는 fd에서 non-blocking read를 반복하고 연결별 버퍼를 갱신합니다.

readable
04

쓰기 처리

보낼 데이터가 남은 fd만 쓰기 이벤트를 등록해 backpressure를 관리합니다.

writable
05

상태 정리

EOF, 오류, timeout이 발생하면 fd와 연결 상태를 제거합니다.

cleanup
select
오래된 범용 모델 fd set 크기 제한과 매번 전체 스캔 비용이 있습니다.
학습용 적합
poll
배열 기반 감시 fd 제한은 줄지만 이벤트 수가 많으면 전체 배열 스캔 비용이 남습니다.
중간 단계
epoll
리눅스 고성능 이벤트 관심 목록을 커널에 등록하고 준비 이벤트만 받아 대규모 연결에 유리합니다.
edge/level 한계

이벤트 루프 구현 기준

non-blocking 이벤트 루프 안에서 blocking 호출이 하나라도 있으면 전체 연결이 멈출 수 있습니다.
부분 처리 한 이벤트에서 모든 데이터를 처리하려 하지 말고 상태를 저장해 다음 이벤트로 넘깁니다.
쓰기 관심 등록 항상 쓰기 이벤트를 감시하면 busy loop가 생길 수 있어 큐가 있을 때만 등록합니다.