직접 I/O 사용
한 번에 많은 양의 데이터를 전송할 수 있는 디바이스의 드라이버는 이러한 전송에 직접 I/O를 사용해야 합니다. 큰 전송에 직접 I/O를 사용하면 인터럽트 오버헤드를 줄이고 버퍼링된 I/O에 내재된 메모리 할당 및 복사 작업을 제거하여 드라이버의 성능을 향상시킵니다.
일반적으로 대용량 스토리지 디바이스 드라이버는 DMA(직접 메모리 액세스) 또는 PIO(프로그래밍된 I/O)를 사용하는 최저 수준 드라이버와 그 위에 연결된 중간 드라이버를 포함하여 전송 요청에 대한 직접 I/O를 요청합니다.
I/O 관리자는 다음과 같이 I/O 작업이 직접 I/O를 사용하고 있음을 확인합니다.
IRP_MJ_READ 및 IRP_MJ_WRITE 요청의 경우 DEVICE_OBJECT 구조의 Flags 멤버에 DO_DIRECT_IO 설정됩니다. 자세한 내용은 디바이스 개체 초기화를 참조하세요.
IRP_MJ_DEVICE_CONTROL 및 IRP_MJ_INTERNAL_DEVICE_CONTROL 요청의 경우 IOCTL 코드의 값에는 IOCTL 값의 TransferType 값으로 METHOD_IN_DIRECT 또는 METHOD_OUT_DIRECT 포함됩니다. 자세한 내용은 I/O 제어 코드 정의를 참조하세요.
직접 I/O를 사용하는 드라이버는 버퍼링된 I/O를 사용하여 일부 IRP를 처리하는 경우도 있습니다. 특히 드라이버는 일반적으로 드라이버가 읽기 및 쓰기 작업에 직접 I/O를 사용하는지 여부에 관계없이 데이터 전송이 필요한 IRP_MJ_DEVICE_CONTROL 요청에 대해 일부 I/O 제어 코드에 버퍼링된 I/O를 사용합니다.
직접 I/O 전송 설정은 DMA 또는 PIO 사용 여부에 따라 약간 다릅니다. 자세한 내용은 다음을 참조하세요.
드라이버는 DMA 및 PIO 전송 중에 캐시 일관성을 유지하기 위한 단계를 수행해야 합니다. 자세한 내용은 캐시 일관성 유지 관리를 참조하세요.