IOCP (Input Output Completion Port)
입력과 출력의 완료를 담당 할 포트를 지정해서 처리하겠다는 의미로 Widows에서 고성능 네트워크 파일 입출력을 위해 설계된 비동기(Overlapped) I/O 처리 메커니즘이다.
비동기방식의 장점은 논블로킹(I/O작업이 완료될 때 까지 기다리지 않고 다른 작업 수행), 자원의 효율적 사용, 성능 향상이 있다.
IOCP는 고성능 네트워크 서버를 구축할 때 소켓이나 파일의 입출력을 최소한의 스레드(Thread)를 사용해 입출력을 처리하여 CPU 자원을 최대한 효율적으로 사용하는 방법(동시에 많은 연결을 효율적으로 처리) 중 하나이다.
특히 IOCP는 스레드와 작업을 효율적으로 매핑하고, 수많은 연결을 한 번에 처리 할 수 있어 자주 사용한다.
프로세스
소켓 생성
CP(Completion Port) 생성
소켓을 CP에 할당
완료 통지를 받을 스레드 생성
이 스레드에서 GetQueuedCompletionStatus() 함수 호출하여 완료 통지가 올 때까지 대기
비동기 입출력 함수 호출
비동기 입출력 작업이 완료되면 대기하던 스레드가 완료통지를 받음
스레드에서 입출력된 내용을 작업
주요함수
CreateIoCompletionPort() : IOCP를 만듦
인자값 | 설명 |
HANDLE FileHandle | 입출력과 연결 할 핸들 (파일 or 소켓) |
HANDLE ExisitingCompletionPort | 기존 CP를 사용할지 새로운 CP를 사용할지 (NULL이면 새로 사용) |
ULONG_PTR CompletionKey | CP의 키 값 (32Bit) |
DWORD NumberofConcurrentthread | 동시 실행 작업 스레드 갯수 |
GetQueuedCompletionStatus() : CompletionQueue에서 완료 된 작업을 가져온다. (Worker Thread 생성)
인자값 | 설명 |
HANDLE CompletionPort | 기다린 CP(IOCP 객체의 핸들) |
LPDWORD lpNumberOfByte | 읽은 데이터 수 |
PULONG_PTR lpCompletionKey | CP를 가리키는 Key, CreateIoCompletionPort()의 3번째 인자 |
LPOVERLAPPED *lpOverlapped | Overlapped 구조체의 주소 |
DWORD dwMilliseconds | 기다릴 시간 |
WSARecv() : 소켓핸들에 IO작업이 완료되면 IOCP 통지
인자값 | 설명 |
SOCKET sock | 클라이언트 소켓 |
LPWSABUF lpBuffers | 읽을 데이터 버퍼의 포인터 |
DWORD dwBufferCount | lpBuffer가 가리키는 구조체의 크기 |
LPDWORD lpNumberOfByteRe | 전송 된 바이트 수 |
LPDWORD lpFlags | 데이터 전송 방식 옵션 |
LPWSAOVERLAPPED lpOverlapped | Overlapped 구조체의 포인터 |
LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine | Completion Routine의 포인터, IOCP에선 사용 안함 |
참고
Iocp 기본 구조 이해
Iocp 기본 구조 이해 - Download as a PDF or view online for free
www.slideshare.net
파일 관리 함수 - Win32 apps
파일을 관리하는 데 사용되는 함수입니다.
learn.microsoft.com