Dosya tamponlama

Bu konu, dosya arabelleği olarak da bilinen ara belleksiz dosya girişi/çıkışı (G/Ç) uygulama kontrolüyle ilgili dikkate alınması gereken çeşitli hususları ele almaktadır. Dosya arabelleğe alma genellikle arka planda sistem tarafından işlenir ve aksi belirtilmedikçe Windows işletim sistemi içinde dosya önbelleğe alma işleminin bir parçası olarak kabul edilir. Önbelleğe alma ve arabelleğe alma terimleri bazen birbirinin yerine kullanılsa da, bu konu özellikle sistem tarafından önbelleğe alınmayan (arabelleğe alınmamış) verilerle nasıl etkileşim kurulduğunu ve bunun kullanıcı modu uygulamalarının doğrudan denetiminin büyük ölçüde dışında olduğunu açıklamak bağlamında arabelleğe alma terimini kullanır.

Genel Bakış

CreateFile işleviyle bir dosya açarken veya oluştururken, dosyadan okunan veya dosyaya yazılan verilerin sistem önbelleğe alınmasını devre dışı bırakmak için FILE_FLAG_NO_BUFFERING bayrağı belirtilebilir. Bu, veri G/Ç arabelleği üzerinde tam ve doğrudan denetim sağlar, ancak dosyalar ve benzer cihazlar söz konusu olduğunda dikkate alınması gereken veri hizalama gereksinimleri vardır.

Uyarı

Bu hizalama bilgileri, aramayı destekleyen dosyalar ve dosya konumu işaretçileri (veya ofsetler) kavramı gibi cihazlarda G/Ç için geçerlidir. Adlandırılmış kanallar veya iletişim cihazları gibi arama yapmayan cihazlar için arabelleği kapatmak belirli bir hizalama gerektirmeyebilir. Bu durumda hizalamayla elde edilebilecek tüm sınırlamalar veya verimlilikler, temel alınan teknolojiye bağlıdır.

Basit bir örnekte uygulama, FILE_FLAG_NO_BUFFERING bayrağıyla yazma erişimi için bir dosya açar ve ardından uygulama içinde tanımlanan bir veri arabelleği kullanarak WriteFile işlevine bir çağrı gerçekleştirir. Bu yerel arabellek, bu durumlarda, bu işlem için mevcut olan tek dosya arabelleğidir. Fiziksel disk düzeni, dosya sistemi depolama düzeni ve sistem düzeyinde dosya işaretçisi konum izlemesi nedeniyle, yerel olarak tanımlanan veri arabellekleri aşağıdaki bölümde açıklanan belirli hizalama ölçütlerini karşılamadığı sürece bu yazma işlemi başarısız olur.

Uyarı

Önbellek yönetimi tartışması, fiziksel diskin üzerinde yer alan donanım önbelleğini dikkate almaz ve bu önbelleğin sistemin doğrudan kontrolünde olacağı garanti edilmez. Bunun bu konuda belirtilen gereksinimler üzerinde hiçbir etkisi yoktur.

FILE_FLAG_NO_BUFFERING önbellekle ilgili diğer bayraklarla nasıl etkileşim kuracağı hakkında daha fazla bilgi için bkz. CreateFile.

Hizalama ve Dosya Erişim Gereksinimleri

Daha önce açıklandığı gibi, uygulamanın FILE_FLAG_NO_BUFFERING ile açılan dosyalarla çalışırken belirli gereksinimleri karşılaması gerekir. Aşağıdaki ayrıntılar geçerlidir:

  • Belirtildiyse, OVERLAPPED yapıdaki isteğe bağlı dosya uzaklığı da dahil olmak üzere, dosya erişim boyutları birim sektör boyutunun tamsayı katı olan bir bayt sayısı olmalıdır. Örneğin, kesim boyutu 512 baytsa, uygulama 512, 1.024, 1.536 veya 2.048 bayt okuma ve yazma işlemleri isteyebilir, ancak 335, 981 veya 7.171 baytlık okuma ve yazma işlemleri isteyemez.
  • Okuma ve yazma işlemleri için dosya erişim arabellek adresleri fiziksel kesime göre hizalanmalıdır; bu da birimin fiziksel kesim boyutunun tamsayı katları olan bellekteki adreslere hizalanmış olması anlamına gelir. Diske bağlı olarak, bu gereksinim uygulanmayabilir.

Uygulama geliştiricileri, 4.096 baytlık fiziksel medya kesimi boyutuyla piyasaya sürülmekte olan yeni depolama cihazı türlerini not almalıdır. Bu cihazların endüstri adı "Gelişmiş Biçim"dir. Medya için adresleme birimi olarak doğrudan 4.096 bayt girişinde uyumluluk sorunları olabileceğinden geçici bir uyumluluk çözümü, normal bir 512 baytlık kesim depolama cihazına öykünen ancak standart ATA ve SCSI komutları aracılığıyla gerçek kesim boyutu hakkında bilgi sağlayan cihazlar tanıtmaktır.

Bu öykünme sonucunda, geliştiricilerin anlaması gereken iki sektör boyutu vardır:

  • Mantıksal Kesim: Medya için mantıksal blok adresleme için kullanılan birim. Bunu depolamanın kabul edebildiği en küçük yazma birimi olarak da düşünebiliriz. Bu "öykünme"dir.
  • Fiziksel Kesim: Cihaza yönelik okuma ve yazma işlemlerinin tek bir işlemle tamamlandığı birim. Bu, atomik yazma birimidir ve en iyi performans ve güvenilirlik özelliklerine sahip olmak için arabelleklenmemiş G/Ç'nin hizalanması gerekeceği bir değeri ifade eder.

IOCTL_DISK_GET_DRIVE_GEOMETRY ve GetDiskFreeSpace gibi en güncel Windows API'leri mantıksal kesim boyutunu döndürür, ancak fiziksel kesim boyutu, STORAGE_ACCESS_ALIGNMENT_DESCRIPTOR yapısındaki BytesPerPhysicalSector üyesinde yer alan ilgili bilgilerle IOCTL_STORAGE_QUERY_PROPERTY denetim kodu aracılığıyla alınabilir. Örneğin, STORAGE_ACCESS_ALIGNMENT_DESCRIPTOR'daki örnek koda bakın. Microsoft, geliştiricilerin uygulamalarının bu sektör boyutu geçişine hazır olduğundan emin olmaları için, IOCTL_STORAGE_QUERY_PROPERTY denetim kodu tarafından bildirilen fiziksel sektör boyutuna tampersiz G/Ç'yi hizalamalarını şiddetle tavsiye eder.

Windows Server 2003 ve Windows XP:STORAGE_ACCESS_ALIGNMENT_DESCRIPTOR yapısı kullanılamaz. Windows Vista ve Windows Server 2008 ile birlikte sunulmuştur.

Okuma ve yazma işlemlerinin arabellek adreslerinin kesimle hizalanmış olması gerektiğinden, uygulamanın bu arabelleklerin nasıl ayrıldığını doğrudan denetlemesi gerekir. Arabellekleri kesime göre hizalamanın bir yolu, arabellekleri ayırmak için VirtualAlloc işlevini kullanmaktır. Aşağıdakileri göz önünde bulundurun:

  • VirtualAlloc , sistemin sayfa boyutunun tamsayı katları olan adreslere hizalanmış bellek ayırır. Sayfa boyutu x64 ve x86'da 4.096 bayt veya Itanium tabanlı sistemler için 8.192 bayttır. Ek bilgi için bkz. GetSystemInfo işlevi.
  • Kesim boyutu genellikle doğrudan erişimli depolama cihazları (sabit sürücüler) için 512 ile 4.096 bayt ve CD-ROM'lar için 2.048 bayttır.
  • Hem sayfa hem de kesim boyutları 2'nin katlarıdır.

Bu nedenle, çoğu durumda, kesim boyutunun sayfa boyutundan büyük olduğu durum nadir olduğundan, sayfaya hizalanmış bellek de kesime hizalanır.

El ile hizalanmış bellek arabelleklerini elde etmenin bir diğer yolu da C Run-Time kitaplığından _aligned_malloc işlevini kullanmaktır. Tampon hizalamasını manuel olarak kontrol etme örneği için WriteFile bölümündeki Örnek Kod'da yer alan C++ dil kodu örneğine bakın.

dosya önbelleğe alma

CreateFile

Dosya Yaz