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 |
데이터가 클 때 (KB |
DO_DIRECT_IO 추천 |
데이터가 매우 작을 때 (수십~수백 바이트) | DO_BUFFERED_IO 추천 |