파일 포인터 시스템 API
SetFilePointer(hFile, sizeof(TCHAR)*4, NULL, FILE_BEGIN);
32bit 시스템에서는 파일의 최대 크기는 4G byte - 2 이다
32bit 는 4G - 1 만큼 표현 가능 하다. 여기서의 -1 은 인덱스 0부터 시작하기에 -1 보정
그리고 에러가 났을 경우 사용할 INVALID_SET_FILE_POINTER(0xFFFFFFFF)를 사용하기에 또 -1 보정
따라서 표현 가능한 최대 크기는 4G byte - 2
시스템(CPU, 버스...) 클럭이 높아지면 I/O가 높아질까 ?
물론 영향을 주지만 많이 영향을 주지 않는다 I/O 성능에 정말 중요한 것은 버퍼링 성능이다
결국 시스템의 클럭 보다는 시스템의 버퍼링 정책이 더 중요한 것이다
CPU 사용률을 높이기 위해서이다 동기적으로 사용하게 되면 CPU가 I/O를 처리하는 동안 DLE 상태가 된다. 불필요하게 CPU가 쉬고 있다
하지만 비동기 I/O의 경우 I/O 처리를 시키고 비동기적으로 다른 작업을 처리할 수 있기에 효율적으로 CPU를 사용할 수 있다
I/O 작업을 이왕 기다릴 거면 여러 I/O를 동시에 기다려서 대기 시간을 줄인다
중첩 I/O의 문제는 작업이 완료된 후 작업을 해주어야 하는데 만약 작업들 유형이 다향하다면 작업을 구분한 후 처리 해주어야 하는 처리를 구현 해야한다
중첩 I/O를 확장한 기술이기에 역시 중첩 I/O와 마찬가지이다
작업을 수행하고 이후 처리해야할 루틴(콜백)을 같이 등록하기에 완료된 후 작업을 구분할 처리가 필요 없다
중첩 I/O를 사용하기 위해서는 Overlapped 구조체를 사용해야 한다
hEvent : I/O가 완료되었는지 확인하기 위해 사용
Offset, OffsetHigh : 는 union 으로 묶여 있다
OVERLAPPED 구조체 생성 후 event 할당
중요 : 생성된 OVERLAPPED 구조체는 0으로 초기화 해주어야 한다
OVERLAPPED 구조체 사용하여 비동기 I/O 실행
WriteFile은 작업이 완료되지 않아도 다음 코드 수행한다
비동기 I/O에서는 전송된 데이터의 크기는 크게 의미가 있지 않다
WaitForSingleObject를 사용하여 I/O가 완료 될때까지 대기 가능 하다
전송된 데이터의 크기는 전달한 OVERLAPPED 구조체에 담겨 있다
전송된 데이터 크기를 얻기 위해서는 OVERLAPPED 구조체와 GetOverlappedResut를 사용해서 획득 해야 한다
중첩 I/O와 비슷하지만 여기에 Completion Routine(콜백)을 등록할 수 있으며 overlapped 구조체를 연결하여 I/O가 완료되면 윈도우 시스템에 의해서 Completion Routine을 자동으로 호출해준다.
SleepEx : 알림 가능한 상태로 만들기 위해 호출
작업 완료되면 알아서 Completion Routine을 호출하기에 event 오브젝트도 직접 생성하여 OVERLAPPED 구조체에 설정할 필요 없음 그래서 hEvent에 추가적으로 데이터를 전송 하기도 한다
Completio Routine을 사용할 경우 알림을 받을 수 있는 상태가 되어야 Completion Routine이 호출된다. 이를 위해서는 다음 함수들을 사용
이런 식으로 아림 가능한 상태를 명시하도록 설정하는 이유는 메인 쓰레드에서 어떤 작업이 완료 된 후 Completio Routine 작업을 처리하도록 하는 작업 순서 제어를 위해서이다