IOCP
I/O Completion Port
IOCP란?
- 소켓이나 파일의 입출력을 최소한의 스레드를 사용해서 처
리하는 기법
이를 위한 스레드 풀링이나 비동기 처리등을 운영체제에서 관리해주
기 때문에 사용자는 IOCP를 이용해서 쉽고 빠르게 고성능의 입출력
처리가 가능해진다.
ICOP의 장점
- 스레드 풀(Thread Pool)을 쉽게 사용할 수 있다.
(운영체제가 직접 스레드 풀링 관리)
- 스레드를 효율적으로 사용하므로 CPU 자원소모가
줄어든다.
- Context Switching 비용이 줄어든다.
- winsock2 API 중에서 확장성과 성능이 뛰어나다
IOCP의 작동 방식
- 완료 포트 생성
- 파일 핸들 또는 소켓 핸들 연결
- 비동기 I/O 요청 제출
- 작업 완료 통지
- 대기 중인 스레드가 큐에서 작업을 가져옴
- 작업 처리 및 콜백 실행
1. 완료 포트 생성
완료 포트 생성 (Create Completion Port)
- IOCP(Input/Output Completion Port)를 생성하는 단계입니다.
완료 포트는 비동기 I/O 작업의 완료를 통지 받기 위한 큐 역할을 합니다.
이 포트는 비동기 I/O 요청이 완료될 때마다 완료된 작업의 정보를 관리합니다.
- 스레드가 작업을 처리할 수 있도록 합니다. 비동기 I/O 작업은 작업을 요청한 후 그 작업이 완료될 때까지 기다리지 않고, 요청한 프로그램이 다른 작업을 계속할 수 있는 방식.
2. 파일 핸들 또는 소켓 핸들 연결
- 생성한 IOCP에 특정 파일 핸들이나 소켓 핸들을 연결하는
과정입니다.
- 이를 통해 해당 핸들에 대한 비동기 I/O 작업이 완료되면
IOCP가 이를 관리하게 됩니다.
- 핸들: 파일 핸들이나 소켓 핸들은 운영 체제에서 특정 자원을 식별하는 데 사용되는 참조값입니다.
3. 비동기 I/O 요청 제출
- 비동기 방식으로 데이터를 읽거나 쓰는 등의 I/O 작업을 요청하는 과정입니다. 비동기 I/O 요청을 제출하면 작업이 백그라운드에서 처리되며, 작업이 완료될 때까지 애플리케이션은 기다릴 필요 없이 다른 작업을 수행할 수 있습니다.
4. 작업 완료 통지
- 제출한 비동기 I/O 작업이 완료되면, 운영 체제는 해당 작업의 결과를 IOCP에 통지합니다. 이때 완료된 작업의 정보가 완료 포트 큐에 추가됩니다.
5. 대기중인 스레드가 큐에서 작업을 가져옴
- IOCP에 연결된 스레드 풀의 스레드가 GetQueuedCompletionStatus 함수 등을 통해 큐에서 완료된 I/O 작업을 가져오는 단계입니다. 이 함수는 완료된 작업이 큐에 추가될 때까지 블로킹 상태로 대기할 수 있습니다.
- 대기 상태: 스레드가 작업을 기다리고 있는 상태를 의미하며, I/O 작업이 완료 되면 그 작업을 처리하기 위해 즉시 깨어납니다.
6. 작업 처리 및 콜백 실행
완료된 I/O 작업을 처리하는 단계로, 애플리케이션은 작업의 결과를 기반으로 필요한 후속 작업을 수행합니다. 이를 위해 콜백 함수를 실행하거나 작업 완료에 대한 이벤트를 처리할 수 있습니다.