Windows 겹친 된 IO 시도하고 있지만 그것을 비동기 적으로 작동하도록 얻을 수 없습니다. 아래의 프로그램을 컴파일하고 실행했지만 아무 것도 출력하지 않습니다. 자동으로 완료됩니다. 나는 작은 읽기가 동기가 될 수 있다는 것을 읽었습니다. 그래서 나는 의도적으로 512MB를 읽도록 선택했습니다. ReadFileEx
통화 중Windows 중복 IO 사실 블록
const DWORD Size = 1<<29; // 512MB
char* Buffer = (char*)malloc(Size);
DWORD BytesRead;
OVERLAPPED Overlapped;
memset(&Overlapped, 0, sizeof(Overlapped));
HANDLE File = CreateFile("BigFile", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED, NULL);
assert(File!=INVALID_HANDLE_VALUE);
DWORD Result = ReadFileEx(File, Buffer, Size, &Overlapped, NULL); // This line takes 150ms according to the debugger
assert(Result);
while(!GetOverlappedResult(File, &Overlapped, &BytesRead, FALSE)) {
printf("Waiting...\n");
}
추가 정보로서, 나는 디버거로 코드를 밟아야하고, Overlapped.InternalHigh
값 (Size
와 같은 값으로) 업데이트됩니다.
나는 FILE_FLAG_NO_BUFFERING
을 추가 ReadFileEx
ReadFile
으로, VirtualAlloc
와 malloc
를 교체했는데, ReadFile
의 반환이 0임을 확인하고 그 GetLastError
는 읽기 후 ERROR_IO_PENDING
될했습니다. RAMMap을 사용하여 파일이 캐시에 있었는지 확인했지만 그 중 96KB 밖에 없었습니다.
저는 8GB RAM이 장착 된 Windows 10 (ver. 1703)을 사용하고 있습니다.
때문에 OS는 쉽게 바로 읽을 서비스를 제공 할 수 있다는 결정 ? – EOF
@EOF 전체 512MB + 파일을 심각하게 캐시합니까? 게다가 캐시 된 경우, 내 읽기는 여전히 150ms가 걸립니다 ... 그러면 빠른 리턴을 보장 할 수 없다면 겹쳐지는 부분은 무엇입니까? – Lutopia
이것은 실제로 캐시 관련입니다. FILE_FLAG_OVERLAPPED | FILE_FLAG_NO_BUFFERING' 파일을 열고'PVOID Buffer = VirtualAlloc (0, Size, MEM_COMMIT, PAGE_READWRITE)'(비 캐시 읽기를 위해 정렬되어야 함)을 할당하고 결과를 확인하십시오. ('Ex'없이)'ReadFile'을 더 잘 사용하십시오 -이 경우 마지막 오류가 있으면 false를 반환합니다 - ERROR_IO_PENDING' – RbMm