2008. 10. 3. 22:34

[펌] IOCP분석

1.     목적

 Winsock2 IOCP를 분석한 것입니다. 이 문서는 크게 두 가지를 설명 하고 있습니다. 전자는 일반적인 IOCP에 대해서 설명합니다. 후자는 IOCP란 무엇이고 장단점은 무엇인지 입니다.

 

 2. IOCP란?

 

 


 

위에서 보는 것처럼 IOCP의 기본적은 구성은 두개의 쓰레드로 만들어 진다. 왼편에 있는 루프는 보통 main() 함수에서 있는 루프고 오른쪽에 있는 루프는 main함수가 루프를 들어가기 전에 생성해야 하는 쓰레드로 보통 Worker쓰레드라고 한다. 권장하는 Worker쓰레드의 수는 하나의 CPU당 두개로(Send/Recv) 되어 있다. 또한 2번에서 3번으로의 데이터 전송은 전역변수를 이용하거나 Worker쓰레드를 생성할 때, 포인터를 전송하여 두 루프가 변수를 공유하는 방법이다. 이에 대해서는 달리 자세히 설명하지는 않겠다.

 

(1)       Wait for client to connect

이 과정에 이전에 이미 IOCP 핸들과 소켓 초기화, 클라이언트의 접속을 대기하는 소켓, 접속한 클라이언트들의 정보를 가지는 배열( 물론, 자료구조는 자신의 선택이다. )을 생성해 두어야 한다.여기는 클라이언트의 접속을 대기하는 소켓에 Accept()를 호출하여 클라이언트가 접속하기를 기다리는 과정이다.

 

(2)       Open communication channel for client

1번 과정에서 클라이언트가 접속을 하면 여기서는 올바른 소켓인지 판단하고, 접속한 소켓을 클라이언트 정보를 저장하는 배열에 저장하고, IOCP에 해당 소켓을 등록하고, 소켓에 읽기 작업을 신청한다. ( 읽기를 먼저 신청하는 이유는 대해서는 설명하지 않겠다. ) 이 때 중요한 것은 현재 WSARecv(), ReadFile()함수를 사용하여 읽기 작업을 신청했지만, IOCP는 작업의 완료 시에 읽기 작업을 끝냈는지 쓰기 작업을 끝냈는지 가르쳐 주지 않는다는 것이다. 따라서, OVERLAPPED구조체를 상속( C관점에서는 새로운 구조체를 선언할 때, OVERLAPPED구조체를 제일 첨에 위치하는 멤버로 선언하여 사용할 수 있다.)하여 읽기 작업을 하는 건지 쓰기 작업을 하는 건지에 대한 흔적을 남겨야 한다.

 

(3)       Read Request from client

이 과정에서 GetQueuedCompletionStatus() 함수를 사용하여 현재 등록된 소켓들 중에 읽기나 쓰기 작업이 완료된 것이 있는지 확인한다. 이 때, IOCP가 알려주는 정보는 2번 과정에서 등록 할 때, 소켓과 같이 입력했던 KEY와 I/O작업을 신청할 때, 인자로 넘겨주었던 OVERLLAPPED 구조체( 확장을 시켰다면 확장 구조체형으로 캐스팅 해주면 된다.)의 주소이다.

 

(4)       Excute request locally

이제 3번 과정에서 받은 key와 OVERLAPPED구조체를 가지고 I/O작업을 신청했을 때, 만약 작업이 끝나면 했었을 작업을 해주면 된다.

 

(5)       Return result to client

이 과정은 사실 4번 과정과 같이 포함되는 부분이다. 즉, 채팅을 예로 들면, 어떤 사용자가 메시지를 입력했을 때, 4번과정의 If( pOverlapped->mode == 읽기 ) {} 블록안이 실행될 것이고, 어떤 메시지인지 확인한 후, 접속한 모든 사용자에게 메시지를 보내게 된다.

 

 

 

3.       IOCP 장단점

ü        장점

A.       2번(IOCP)에서 빨간색 문자색으로 써 있는 것 처럼 적은 수의 쓰레드로 윈속2 서버를 구성 할 수 있다.  윈속 2 API중에서 가장 적다.

B.       윈속2 API중에서 CPU 점유율이 가장 낮다. 이 점은 적은 수의 쓰레드를 사용하므로 얻는 이점이다. 쓰레드 숫자가 적으므로 당연히 ThreadContext Switch도 적게 일어난다.

C.       윈속2 API 중에서 가장 확장성과 성능이 뛰어나다.

 

ü        단점

A.       프로그램이 어렵다. 즉, 개념 파악이 어렵다.

B.       플랫폼이 제약이 있다. 윈속2이상과 윈도우 NT이상만 지원한다. 정확하게는 윈도우 2000이상에서 개발 하는게 낫다.

 

    참고 문서

-  www.codeproject.com, msdn.Microsoft.com, www.codeguru.com

-  PlatformSDK, Network Programming For Microsoft Windows


출처 : http://blog.naver.com/process3/20022353267