2009년 9월 29일 화요일

Overlapped 모델 - IOCP-

IOCP(I/O Completion Port : 입출력 완료 포트)
    비동기 입출력 결과와 이 결과를 처리할 스레드에 대한 정보를 담고 있는 구조

 

IOCP를 이용한 입출력 방법

   1. CreateIoCompletionPort()함수를 사용하여 입출력 완료 포트를 생성한다.
   2. CPU 개수에 비례하여 작업 스레드를 생성한다. 모든 작업스레드는 GetQueuedCompletionStatus() 함수를 호출하여 대기한다.
   3. 비동기 입출력을 지원하는 소켓을 생성한다. 이 소켓에 비동기 입출력 완료에 대해서 포트를 설정하려면, CreateIoCompletionPort()함수를 호출하여, 소켓과 입출력 완료 포트를 연결해야 한다.
   4. 비동기 입출력 함수를 호출한다. 비동기 입출력 작업이 곧바로 완료되지 않으면, 소켓 함수는 오류를 리턴하고, WSA_IO_PENDING으로 설정된다.
   5. 비동기 입출력 작업이 완료되면, 운영제체는 입출력 완료 포트에 결과를 저장하고, 대기중인 스레드 하나를 깨운다. 대기상태에서 깨어난 작업자 스레드는 비동기 입출력 결과를 처리한다.
   6. 새로운 소켓을 생성하면 3 ~ 5를 그렇지 않으면 4 ~ 5를 반복한다.

 

함수 

   // 입출력 포트 생성 함수
   HANDLE CreateIoCompletionPort(
      HANDLE FileHandle,  // 입출력 완료 포트와 연결할 파일 핸들. 새로운 입출력 포트를 생성할때는 INVALID_HANDLE_VALUE값을 사용해도 된다.
      HANDLE ExistingCompletionPort, // 파일 또는 소켓과 연결할 입출력 완료 포트 핸들, 이 값이 NULL이면 새로운 입출력 완료 포트를 생성한다.
      ULONG ComletionKey, // 입출력 완료 패킷에 들어갈 부가적인 정보(32비트)
      DWORD NumberOfConcurrentThreads // 동시에 실행할 수 있는 작업자 스레드 개수, 0을 사용하면 자동으로 CPU개수와 같은 수로 설정된다.
   );

   // 비동기 입출력 결과 확인 함수
   BOOL GetQueuedCompletionStatus(
      HANDLE CompletionPort, // 입출력 완료 포트 핸들
      LPDWORD lpNumberOfBytes, // 비동기 입출력 작업으로 전송된 바이트 수를 얻는다
      LPDWORD lpCompletionKey, // CreateIoCompletionPort()함수 호출시 전달한 세번째 인자(32비트)가 여기에 저장됨
      LPOVERLAPPED* lpOverlapped, // 비동기 입출력 함수 호출 시 전달한 OVERLAPPED 구조체의 주소값이 여기에 저장됨
      DWORD dwMilliseconds // 결과 확인 대기시간 지정
   );

   // 특정한 상황을 알리기 위해 직접 입출력 완료 패킷을 생성하는 함수
   // GetQueuedCompletionStatus() 함수 파라메터 주석 참조
   BOOL PostQueuedCompletionStatus(
      HANDLE CompletionPort,
      DWORD dwNumberOfBytesTransferred,
      DWORD dwCompletionKey,
      LPOVERLAPPED lpOverlapped
   );

댓글 없음:

댓글 쓰기