[windows 핵심 프로 그래 밍] IO 완료 포트 (IOCP) 파일 복사
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 사용 을 보 여 줍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.