Windows 운영 체제에서 소켓이나 파일의 입출력을 최소한의 스레드를 사용해서 처리하는 기법
대규모 네트워크 서버, 고성능 파일 처리 시스템 등에 사용한다.
복잡한 구현과 철저한 자원 관리가 요구된다.
IOCP의 내부 동작 원리와 최적화 기법을 깊이 있게 이해하고, 모범 사례를 준수하면 효율적이고 안정적인 시스템을 구축할 수 있다.
고성능
효율성
확장성
복잡성
호환성
디버깅의 어려움: 비동기적이고 병렬적인 특성 때문에 디버깅이 상대적으로 어렵다.
completion port
생성 및 I/O 객체 연결
IOCP를 사용하기 위해 먼저 완료 포트를 생성한다.
이를 각 I/O 객체(소켓, 파일 핸들 등)에 연결한다.
C++에서는 RAII 패턴을 사용해서 생명 주기를 관리할 수 있다.
비동기 I/O 요청
I/O 객체에 대해 비동기 작업을 요청한다.
WSARecv 함수를 사용하여 데이터를 비동기적으로 읽어올 수 있다.
C++에서는 스마트 포인터를 사용하여 메모리 관리를 자동화할 수 있다.
completion port
의 작업 완료 확인
IOCP는 작업이 완료되면 완료 큐에 작업 정보를 추가한다.
이를 확인하기 위해 GetQueuedCompletionStatus 함수를 호출한다.
C++에서는 이를 워커 스레드 내에서 처리할 수 있다.
블로킹
A 함수가 B 함수를 호출하면, 제어권을 A가 호출한 B 함수에 넘겨준다.
B 함수는 실행이 끝나면 자신을 호출한 A에게 제어권을 돌려준다.
논블로킹
A 함수가 B 함수를 호출해도 제어권은 그대로 자신이 갖는다.
A 함수가 제어권을 가지고 있기 때문에 B 함수 호출 이후에도 자신의 코드를 계속 실행한다.
커널
컴퓨터 운영 체제의 핵심이 되는 컴퓨터 프로그램의 하나로, 시스템의 모든 것을 완전히 통제한다.
운영 체제의 다른 부분 및 응용 프로그램 수행에 필요한 여러 가지 서비스를 제공한다.
커널 오브젝트
자원 관리
소켓, 파일 핸들 등의 자원을 적절히 관리하여 누수를 방지하고, 필요 시 적시에 해제해야 한다.
특히, I/O 작업이 완료되기 전에 소켓을 닫지 않도록 주의해야 한다.
스레드 풀 관리
시스템 하드웨어의 스펙과 애플리케이션의 특성에 맞게 워커 스레드 수를 조정해서 최적의 성능을 이끌어 내야한다.
과도한 스레드 수는 오히려 성능 저하를 초래할 수 있다.
비동기 작업 최적화
버퍼 관리 최적화
I/O 작업에 사용되는 버퍼를 효율적으로 관리하여 메모리 사용을 최적화한다.
버퍼 풀을 사용하거나, 사전에 버퍼를 할당하여 재사용함으로써 메모리 할당 및 해제에 따른 오버헤드를 줄일 수 있다.