[windows 핵심 프로 그래 밍] IO 완료 포트 (IOCP) 파일 복사

2931 단어

 
1. IOCP 에 대하 여
    IOCP 즉 IO 완성 포트 는 높 은 신축 고 효율 의 비동기 IO 방식 입 니 다. 한 장치 나 파일 은 하나의 IO 완성 포트 와 연결 되 어 있 습 니 다. 파일 이나 장치 의 비동기 IO 작업 이 완 료 될 때 IO 에 가서 포트 의 [완성 대기 열] 하 나 를 취하 고 완성 키 (Complete Key) 에 따라 어떤 장치 나 파일 의 작업 이 완료 되 었 는 지 판단 합 니 다.그리고 실제 상황 에 따라 처리 하 겠 습 니 다.
 
2. 관련 API 와 데이터 구조
 
    완 료 된 IO 알림 을 IOCP 의 [완료 대기 열] 에 추가 합 니 다.
    BOOL   PostQueuedCompletionStatus(
        HANDLE    hCompletionPort,     //IO 완료 포트
        DWORD    dwNumBytes,          //전송 바이트 수
        ULONG_PTR  completionKey,    //완료 키
        OVERLAPPED*   pOverlapped    //장치 나 파일 이 비동기 IO 요청 을 보 낼 때의 관련 OVERLAPPED 구조 지침
)
 
   [대기 열 완성] 에서 하 나 를 가 져 옵 니 다.
   BOOL    GetWQueuedCompletionStatus(
       HANDLE       hCompletionPort,    //IOCP
       PWORD       pdwNumberOfBytesTransferred, / 전 송 된 바이트 수
       PULONG_PTR   pCompletionKey,    //완료 키
       OVERLAPPED**  ppOverlapped,     //파일 이나 장치 와 연 결 된 OVERLAPPED 구조, 포인터 포인터 포인터, [out]
       DWORD    dwMilliseconds               //대기 시간
)
 
 
  IOCP 를 만 들 거나 파일 / 장 치 를 IOCP 와 연결 합 니 다.
HANDLE WINAPI CreateIoCompletionPort( __in HANDLE FileHandle, //        __in_opt HANDLE ExistingCompletionPort, //  IOCP   __in ULONG_PTR CompletionKey, //    __in DWORD NumberOfConcurrentThreads //            );


HANDLE hIOCP = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, );


CreateIoCompletionPort(hFile, hIOCP, CK_XXX, );



OVERLAPPED
typedef struct _OVERLAPPED {
  ULONG_PTR Internal;       //    ,    
  ULONG_PTR InternalHigh;  //           
  union {
    struct {
      DWORD Offset;         //       ,       :           
      DWORD OffsetHigh;    //       
    } ;
    PVOID  Pointer;
  } ;
  HANDLE    hEvent;         //      
} OVERLAPPED, *LPOVERLAPPED;


 

 IOCP 의 다섯 가지 데이터 구조
① 장치 목록
이 포트 와 연 결 된 하나 이상 의 장 치 를 표시 합 니 다.
② IO 대기 열 완료 FIFO
전 송 된 바이트 수, 완료 키, OVERLAPPED 구조, 오류 코드 등 포함
IO 가 PostQueued Complete Status 를 요청 하거나 호출 할 때 이 대기 열 에 항목 을 추가 합 니 다.
③ 대기 라인 대기 열 FILO
스 레 드 탱크 의 모든 스 레 드 가 GetQueued Complete Status 를 호출 할 때 스 레 드 를 호출 하 는 스 레 드 표시 자 는 이 대기 스 레 드 대기 열 에 추 가 됩 니 다. 이 때문에 IOCP 는 완 료 된 IO 요청 을 처리 하 는 스 레 드 가 있 는 지 항상 알 수 있 습 니 다.
④ 방출 된 스 레 드 목록
IO 요청 후 처 리 된 스 레 드 는 어떤 이유 로 걸 렸 다가 다시 깨 어 나 스 레 드 목록 에 들 어 갑 니 다.
⑤ 일시 정 지 된 스 레 드 목록
IO 요청 후 처 리 된 스 레 드 는 어떤 이유 로 걸 린 후 정지 스 레 드 목록 에 들 어 갑 니 다.
 
 
3. 설명
IOCP 에서 실행 중인 최대 스 레 드 수 는 보통 CPU 개수 입 니 다.
스 레 드 탱크 의 최대 스 레 드 수 는 일반적으로 CPU 개수 의 2 배 이다.
 
 
다음 편 은 파일 을 복사 하 는 예 로 IOCP 사용 을 보 여 줍 니 다.
 
 

좋은 웹페이지 즐겨찾기