File Buffering

Topik ini mencakup berbagai pertimbangan untuk kontrol aplikasi buffering file, juga dikenal sebagai input/output file yang tidak dibuffer (I/O). Buffering file biasanya ditangani oleh sistem di belakang layar dan dianggap sebagai bagian dari penembolokan file dalam sistem operasi Windows kecuali ditentukan lain. Meskipun istilah penembolokan dan buffering terkadang digunakan secara bergantian, topik ini menggunakan istilah buffering khususnya dalam konteks menjelaskan cara berinteraksi dengan data yang tidak di-cache (di-buffer) oleh sistem, di mana sebaliknya sebagian besar berada di luar kontrol langsung aplikasi mode pengguna.

Saat membuka atau membuat file dengan fungsi CreateFile , bendera FILE_FLAG_NO_BUFFERING dapat ditentukan untuk menonaktifkan penembolokan sistem data yang dibaca dari atau ditulis ke file. Meskipun ini memberikan kontrol lengkap dan langsung atas buffering I/O data, dalam kasus file dan perangkat serupa ada persyaratan penyelarasan data yang harus dipertimbangkan.

Catatan

Informasi penyelarasan ini berlaku untuk I/O pada perangkat seperti file yang mendukung pencarian dan konsep penunjuk posisi file (atau offset). Untuk perangkat yang tidak mencari, seperti pipa bernama atau perangkat komunikasi, menonaktifkan buffering mungkin tidak memerlukan perataan tertentu. Setiap batasan atau efisiensi yang mungkin diperoleh dengan keselarasan dalam hal ini tergantung pada teknologi yang mendasar.

 

Dalam contoh sederhana, aplikasi akan membuka file untuk akses tulis dengan bendera FILE_FLAG_NO_BUFFERING dan kemudian melakukan panggilan ke fungsi WriteFile menggunakan buffer data yang ditentukan dalam aplikasi. Buffer lokal ini, dalam keadaan ini, secara efektif satu-satunya buffer file yang ada untuk operasi ini. Karena tata letak disk fisik, tata letak penyimpanan sistem file, dan pelacakan posisi penunjuk file tingkat sistem, operasi tulis ini akan gagal kecuali buffer data yang ditentukan secara lokal memenuhi kriteria perataan tertentu, yang dibahas di bagian berikut.

Catatan

Diskusi penembolokan tidak mempertimbangkan penembolokan perangkat keras pada disk fisik itu sendiri, yang tidak dijamin berada dalam kontrol langsung sistem dalam kasus apa pun. Ini tidak berpengaruh pada persyaratan yang ditentukan dalam topik ini.

 

Untuk informasi selengkapnya tentang bagaimana FILE_FLAG_NO_BUFFERING berinteraksi dengan bendera terkait cache lainnya, lihat CreateFile.

Persyaratan Penyelarasan dan Akses File

Seperti yang dibahas sebelumnya, aplikasi harus memenuhi persyaratan tertentu saat bekerja dengan file yang dibuka dengan FILE_FLAG_NO_BUFFERING. Spesifikasi berikut berlaku:

  • Ukuran akses file, termasuk offset file opsional dalam struktur TUMPANG TINDIH , jika ditentukan, harus untuk sejumlah byte yang merupakan kelipatan bilangan bulat dari ukuran sektor volume. Misalnya, jika ukuran sektor adalah 512 byte, aplikasi dapat meminta baca dan tulis 512, 1.024, 1.536, atau 2.048 byte, tetapi tidak 335, 981, atau 7.171 byte.
  • Alamat buffer akses file untuk operasi baca dan tulis harus selaras dengan sektor fisik, yang berarti diselaraskan pada alamat dalam memori yang merupakan kelipatan bilangan bulat dari ukuran sektor fisik volume. Tergantung pada disk, persyaratan ini mungkin tidak diberlakukan.

Pengembang aplikasi harus mencatat jenis perangkat penyimpanan baru yang diperkenalkan ke pasar dengan ukuran sektor media fisik 4.096 byte. Nama industri untuk perangkat ini adalah "Format Lanjutan". Karena mungkin ada masalah kompatibilitas dengan secara langsung memperkenalkan 4.096 byte sebagai unit alamat untuk media, solusi kompatibilitas sementara adalah memperkenalkan perangkat yang meniru perangkat penyimpanan sektor 512 byte biasa tetapi menyediakan informasi tentang ukuran sektor yang sebenarnya melalui perintah ATA dan SCSI standar.

Sebagai hasil dari emulasi ini, pada dasarnya ada dua ukuran sektor yang perlu dipahami pengembang:

  • Sektor Logis: Unit yang digunakan untuk alamat blok logis untuk media. Kita juga dapat menganggapnya sebagai unit tulis terkecil yang dapat diterima penyimpanan. Ini adalah "emulasi".
  • Sektor Fisik: Unit yang operasi baca dan tulis ke perangkat selesai dalam satu operasi. Ini adalah unit penulisan atomik, dan I/O yang tidak dibuffer perlu diselaraskan untuk memiliki karakteristik performa dan keandalan yang optimal.

Sebagian besar API Windows saat ini, seperti IOCTL_DISK_GET_DRIVE_GEOMETRY dan GetDiskFreeSpace, akan mengembalikan ukuran sektor logis, tetapi ukuran sektor fisik dapat diambil melalui kode kontrol IOCTL_STORAGE_QUERY_PROPERTY , dengan informasi relevan yang terkandung dalam anggota BytesPerPhysicalSector dalam struktur STORAGE_ACCESS_ALIGNMENT_DESCRIPTOR . Misalnya, lihat kode sampel di STORAGE_ACCESS_ALIGNMENT_DESCRIPTOR. Microsoft sangat menyarankan agar pengembang menyelaraskan I/O yang tidak dibuffer ke ukuran sektor fisik seperti yang dilaporkan oleh kode kontrol IOCTL_STORAGE_QUERY_PROPERTY untuk membantu memastikan aplikasi mereka disiapkan untuk transisi ukuran sektor ini.

Windows Server 2003 dan Windows XP: Struktur STORAGE_ACCESS_ALIGNMENT_DESCRIPTOR tidak tersedia. Ini diperkenalkan dengan Windows Vista dan Windows Server 2008.

Karena alamat buffer untuk operasi baca dan tulis harus selaras dengan sektor, aplikasi harus memiliki kontrol langsung tentang bagaimana buffer ini dialokasikan. Salah satu cara untuk buffer yang selaras dengan sektor adalah dengan menggunakan fungsi VirtualAlloc untuk mengalokasikan buffer. Pertimbangkan hal berikut:

  • VirtualAlloc mengalokasikan memori yang selaras pada alamat yang merupakan kelipatan bilangan bulat dari ukuran halaman sistem. Ukuran halaman adalah 4.096 byte pada x64 dan x86 atau 8.192 byte untuk sistem berbasis Itanium. Untuk informasi tambahan, lihat fungsi GetSystemInfo .
  • Ukuran sektor biasanya 512 hingga 4.096 byte untuk perangkat penyimpanan akses langsung (hard drive) dan 2.048 byte untuk CD-ROM.
  • Ukuran halaman dan sektor adalah kekuatan 2.

Oleh karena itu, dalam kebanyakan situasi, memori yang selaras dengan halaman juga akan selaras dengan sektor, karena kasus di mana ukuran sektor lebih besar dari ukuran halaman jarang terjadi.

Cara lain untuk mendapatkan buffer memori yang selaras secara manual adalah dengan menggunakan fungsi _aligned_malloc dari pustaka C Run-Time. Untuk contoh cara mengontrol perataan buffer secara manual, lihat contoh kode bahasa C++ di bagian Kode Contoh writeFile.