Quick Flow
create completion port
-> associate socket or file handle with a completion key
-> issue overlapped I/O with buffer + OVERLAPPED state
-> kernel completes operation
-> completion packet enters port queue
-> worker dequeues bytes, key, OVERLAPPED pointer
-> process result and issue next operationIOCP는 socket마다 thread 하나를 만드는 API가 아니라 여러 overlapped I/O 완료를 queue로 모아 제한된 worker에 배분하는 Windows completion 모델입니다.
Operation 수명
WSARecv, WSASend, ReadFile, WriteFile 같은 overlapped 요청이 pending이면 함수가 반환한 뒤에도 buffer와 OVERLAPPED 구조체가 살아 있어야 합니다. Stack 지역 객체 주소를 넘기고 함수가 끝나면 use-after-lifetime 오류가 됩니다.
Completion에서 받은 byte 수는 실제 처리량입니다. TCP receive가 message 전체를 완성하지 않을 수 있으므로 connection별 parser buffer에 누적합니다. OVERLAPPED를 포함한 operation 객체로 read와 write 종류, buffer offset, owner connection을 함께 추적하는 방식이 일반적입니다.
Worker와 동시성
Completion port의 concurrency 값은 동시에 실행하도록 허용할 worker 수를 조절합니다. Worker 수를 connection 수와 같게 만들 필요는 없습니다. Handler에서 오래 blocking하면 다른 completion 처리가 늦어지므로 CPU 작업과 외부 I/O를 분리합니다.
자주 틀리는 점
- Overlapped 함수가 즉시 성공해도 completion 통지 계약을 API별로 확인합니다.
- Socket close와 operation cancel 뒤 completion이 늦게 도착할 수 있으므로 owner 수명을 참조 카운트나 명확한 종료 상태로 보호합니다.
- Completion key를 검증 없이 raw object pointer의 영구 ID로 사용하지 않습니다.
- IOCP가 message framing, protocol validation, session synchronization을 대신하지 않습니다.
참고 링크
2 sources