I/O multiplexing

select, poll, epoll은 감시 목록을 어디에 두는지가 다르다

세 API는 모두 “준비된 소켓만 처리”하려는 도구입니다. 차이는 감시 목록을 매번 넘기는지, 커널에 등록해 두는지, 준비된 이벤트만 돌려받는지에 있습니다.

select fd_set을 매번 넘기고 전체를 검사 고정 크기 비트셋과 FD_SETSIZE 제한이 있습니다.
poll pollfd 배열을 매번 넘기고 전체를 검사 개수 제한은 줄었지만 매 호출 순회 비용은 남습니다.
epoll 관심 fd를 커널에 등록하고 준비 목록을 받음 대규모 idle 연결에서 반복 복사와 전체 순회 비용을 줄입니다.
항목
select
poll
epoll
등록
호출마다 fd_set 복사
호출마다 배열 전달
epoll_ctl로 커널에 유지
대기 결과
전체 set에서 준비 fd 확인
전체 배열에서 revents 확인
준비된 이벤트 목록 반환
확장성
작은 연결 수에 적합
중간 규모까지 단순
많은 idle 연결에 유리

준비됨 준비 이벤트는 읽어도 안 막힌다는 신호다 실제 읽기/쓰기는 여전히 오류와 부분 처리에 대비해야 합니다.

non-blocking 멀티플렉싱은 논블로킹 I/O와 같이 쓴다 하나의 느린 연결이 루프 전체를 멈추지 않게 해야 합니다.

backpressure 준비된 소켓만 골라도 출력 버퍼는 막힐 수 있다 쓰기 큐와 timeout, 연결 제한을 함께 설계합니다.