Windows Driver/Kernel & Driver 개발

DO_DIRECT_IO vs DO_BUFFERED_IO 차이 & 성능 비교

lwj789 2025. 4. 2. 12:59

DO_DIRECT_IO vs DO_BUFFERED_IO 차이 & 성능 비교

항목DO_DIRECT_IODO_BUFFERED_IO
메모리 처리 방식 MDL (Memory Descriptor List)로 유저 모드 버퍼를 커널에서 직접 접근 I/O Manager가 유저 모드 버퍼를 커널 메모리에 복사해서 SystemBuffer를 제공
데이터 복사 횟수 유저 버퍼 ↔ 커널 버퍼 복사 ❌ (복사 없음) 유저 버퍼 → 커널 버퍼 복사 있음
버퍼 접근 방법 MmGetSystemAddressForMdlSafe()로 커널에서 유저 버퍼 직접 접근 바로 Irp->AssociatedIrp.SystemBuffer 사용 가능
성능 ★ 더 좋음 (복사가 없으므로 대용량 처리에 유리) 복사 때문에 약간 느림 (특히 큰 데이터)
안전성 유저 버퍼를 커널에서 직접 접근하기 때문에 실수 시 블루스크린 가능성 ↑ 커널이 복사한 안전한 버퍼를 사용하므로 안정성 ↑
사용 추천 상황 대용량 파일, 스트리밍, 고속 네트워크 패킷 처리 작은 데이터, 설정값 전달, 단순 명령 처리용
복잡성 MDL 처리를 반드시 해야 함 (약간 복잡) 단순한 구조, 개발 편함

✅ 핵심 요약

  • DO_DIRECT_IO
    👉 복사 없이 직접 I/O
    👉 속도 빠름, 대용량에 유리
    👉 실수하면 위험성(블루스크린) 있음
    👉 MDL 다루는 코드 필요
  • DO_BUFFERED_IO
    👉 안전하게 복사해서 I/O
    👉 속도는 좀 느리지만 안전
    👉 소규모 I/O, 설정 전달, 제어 명령 등에 적합
    👉 코드 간단

✅ 실전 TIP

상황추천
파일 시스템 드라이버 대부분 DO_DIRECT_IO
네트워크 드라이버 보통 DO_DIRECT_IO
설정, Control IOCTL 보통 DO_BUFFERED_IO
로그, 간단한 메시지 보통 DO_BUFFERED_IO
데이터가 클 때 (KBMBGB) DO_DIRECT_IO 추천
데이터가 매우 작을 때 (수십~수백 바이트) DO_BUFFERED_IO 추천