Windows'ta zaman uyumsuz disk G/Ç zaman uyumlu olarak görünüyor

Bu makale G/Ç için varsayılan davranışın zaman uyumlu olmasına rağmen zaman uyumsuz olarak görünmesi sorununu çözmenize yardımcı olur.

Orijinal ürün sürümü: Windows
Özgün KB numarası: 156932

Özet

Microsoft Windows'ta dosya G/Ç zaman uyumlu veya zaman uyumsuz olabilir. G/Ç için varsayılan davranış, G/Ç işlevinin çağrıldığı ve G/Ç tamamlandığında döndürdüğü zaman uyumludur. Zaman uyumsuz G/Ç, G/Ç işlevinin yürütmeyi çağırana hemen geri döndürmesine izin verir, ancak G/Ç'nin gelecekteki bir zamana kadar tamamlanacağı varsayılmaz. İşletim sistemi, G/Ç tamamlandığında çağıranı bilgilendirir. Bunun yerine, çağıran, işletim sisteminin hizmetlerini kullanarak bekleyen G/Ç işleminin durumunu belirleyebilir.

Zaman uyumsuz G/Ç'nin avantajı, çağıranın G/Ç işlemi tamamlanırken başka işler yapmak veya daha fazla istek göndermek için zamanı olmasıdır. Çakışan G/Ç terimi sık sık Zaman Uyumsuz G/Ç ve Zaman Uyumlu G/Ç için Çakışmayan G/Ç için kullanılır. Bu makalede G/Ç işlemleri için Zaman Uyumsuz ve Zaman Uyumlu terimleri kullanılır. Bu makalede, okuyucunun , , ReadFileWriteFilegibi CreateFileDosya G/Ç işlevleri hakkında bilgi sahibi olduğu varsayılır.

Zaman uyumsuz G/Ç işlemleri genellikle aynı zaman uyumlu G/Ç gibi davranır. Bu makalenin sonraki bölümlerde ele aldığı ve G/Ç işlemlerinin zaman uyumlu bir şekilde tamamlanmasını sağlayan bazı koşullar. G/Ç işlevleri G/Ç tamamlanana kadar geri dönmediğinden çağıranın arka plan çalışması için zamanı yok.

Zaman uyumlu ve zaman uyumsuz G/Ç ile ilgili çeşitli işlevler vardır. Bu makalede örnek olarak ve WriteFile kullanılırReadFile. İyi alternatifler ve WriteFileExolacaktırReadFileEx. Bu makalede özellikle yalnızca disk G/Ç'leri ele alınsa da, ilkelerin çoğu seri G/Ç veya ağ G/Ç gibi diğer G/Ç türlerine uygulanabilir.

Zaman uyumsuz G/Ç ayarlama

FILE_FLAG_OVERLAPPED Dosya açıldığında bayrağının içinde CreateFile belirtilmesi gerekir. Bu bayrak, dosyadaki G/Ç işlemlerinin zaman uyumsuz olarak gerçekleştirilmesini sağlar. Aşağıda bir örnek verilmiştir:

HANDLE hFile;

hFile = CreateFile(szFileName,
                      GENERIC_READ,
                      0,
                      NULL,
                      OPEN_EXISTING,
                      FILE_FLAG_NORMAL | FILE_FLAG_OVERLAPPED,
                      NULL);

if (hFile == INVALID_HANDLE_VALUE)
      ErrorOpeningFile();

Zaman uyumsuz G/Ç kodu oluştururken dikkatli olun çünkü sistem gerektiğinde işlemi zaman uyumlu yapma hakkını saklıdır. Bu nedenle, programı zaman uyumlu veya zaman uyumsuz olarak tamamlanabilecek bir G/Ç işlemini doğru şekilde işlemek için yazmanız en iyisidir. Örnek kodda bu önemli nokta gösterilmektedir.

Bir programın zaman uyumsuz işlemlerin tamamlanmasını beklerken ek işlemler kuyruğa alma veya arka plan çalışması yapma gibi birçok işlem yapılabilir. Örneğin, aşağıdaki kod bir okuma işleminin çakışan ve çakışmayan tamamlanmasını düzgün bir şekilde işler. Bekleyen G/Ç'nin tamamlanmasını beklemekten başka bir şey yapmaz:

if (!ReadFile(hFile,
               pDataBuf,
               dwSizeOfBuffer,
               &NumberOfBytesRead,
               &osReadOperation )
{
   if (GetLastError() != ERROR_IO_PENDING)
   {
      // Some other error occurred while reading the file.
      ErrorReadingFile();
      ExitProcess(0);
   }
   else
      // Operation has been queued and
      // will complete in the future.
      fOverlapped = TRUE;
}
else
   // Operation has completed immediately.
   fOverlapped = FALSE;

if (fOverlapped)
{
   // Wait for the operation to complete before continuing.
   // You could do some background work if you wanted to.
   if (GetOverlappedResult( hFile,
                           &osReadOperation,
                           &NumberOfBytesTransferred,
                           TRUE))
      ReadHasCompleted(NumberOfBytesTransferred);
   else
      // Operation has completed, but it failed.
      ErrorReadingFile();
}
else
   ReadHasCompleted(NumberOfBytesRead);

Not

&NumberOfBytesReadiçine ReadFile geçirilen, içine GetOverlappedResultgeçirilenden &NumberOfBytesTransferred farklıdır. Bir işlem zaman uyumsuz hale getirildiyse, GetOverlappedResult tamamlandıktan sonra işlemde aktarılan gerçek bayt sayısını belirlemek için kullanılır. 'a &NumberOfBytesReadReadFile geçirilen anlamsız.

Öte yandan, bir işlem hemen tamamlanırsa, &NumberOfBytesRead geçirilen ReadFile değeri okunan bayt sayısı için geçerlidir. Bu durumda, içine ReadFilegeçirilen yapıyı yoksayınOVERLAPPED; veya WaitForSingleObjectile GetOverlappedResult kullanmayın.

Zaman uyumsuz işlemle ilgili bir diğer uyarı da, bekleyen işlemi tamamlanana kadar bir OVERLAPPED yapı kullanmamanız gerektiğidir. Başka bir deyişle, üç bekleyen G/Ç işleminiz varsa üç OVERLAPPED yapı kullanmanız gerekir. Bir OVERLAPPED yapıyı yeniden kullanırsanız G/Ç işlemlerinde tahmin edilemeyen sonuçlar alırsınız ve veri bozulmasıyla karşılaşabilirsiniz. Ayrıca, bir yapıyı ilk kez kullanabilmeniz için veya önceki bir OVERLAPPED işlem tamamlandıktan sonra yeniden kullanmadan önce, artık verilerin yeni işlemi etkilememesi için bunu doğru bir şekilde başlatmanız gerekir.

Aynı kısıtlama türü, bir işlemde kullanılan veri arabelleği için de geçerlidir. Veri arabelleği ilgili G/Ç işlemi tamamlanana kadar okunmamalı veya yazılmamalıdır; arabelleği okumak veya yazmak hatalara ve bozuk verilere neden olabilir.

Zaman uyumsuz G/Ç yine de zaman uyumlu görünüyor

Ancak, bu makalenin önceki bölümlerindeki yönergeleri izlediyseniz, tüm G/Ç işlemleriniz genellikle verilen sırayla zaman uyumlu bir şekilde tamamlanmıştır ve işlemlerin ReadFile hiçbiri döndürerek ERROR_IO_PENDINGYANLIŞGetLastError() değerini döndürmez; bu da arka plan çalışması için zamanınız olmadığı anlamına gelir. Bu neden oluyor?

Zaman uyumsuz işlem için kod oluştursanız bile G/Ç işlemlerinin zaman uyumlu bir şekilde tamamlanmasının çeşitli nedenleri vardır.

Sıkıştırma

Zaman uyumsuz işleme yönelik bir engel, Yeni Teknoloji Dosya Sistemi (NTFS) sıkıştırmadır. Dosya sistemi sürücüsü sıkıştırılmış dosyalara zaman uyumsuz olarak erişmeyecek; bunun yerine tüm işlemler zaman uyumlu yapılır. Bu engelleme, COMPRESS veya PKZIP'ye benzer yardımcı programlarla sıkıştırılmış dosyalar için geçerli değildir.

NTFS şifrelemesi

Sıkıştırmaya benzer şekilde, dosya şifrelemesi sistem sürücüsünün zaman uyumsuz G/Ç'yi zaman uyumluya dönüştürmesine neden olur. Dosyaların şifresi çözülürse G/Ç istekleri zaman uyumsuz olur.

Dosyayı genişletme

G/Ç işlemlerinin zaman uyumlu bir şekilde tamamlanmasının bir diğer nedeni de işlemlerin kendisidir. Windows'ta, uzunluğunu genişleten bir dosyaya yapılan tüm yazma işlemleri zaman uyumlu olur.

Not

Uygulamalar, daha önce bahsedilen yazma işlemini zaman uyumsuz hale getirmek için işlevini kullanarak SetFileValidData dosyanın Geçerli Veri Uzunluğunu değiştirebilir ve ardından bir WriteFileverebilir.

Uygulamaları kullanarak SetFileValidData (Windows XP ve sonraki sürümlerde kullanılabilir), uygulamalar dosyaları sıfır doldurma için performans cezası uygulamadan verimli bir şekilde genişletebilir.

NTFS dosya sistemi tarafından SetFileValidDatatanımlanan geçerli veri uzunluğuna (VDL) kadar verileri sıfırdan doldurmadığından, bu işlevin, dosyanın daha önce diğer dosyalar tarafından işgal edilmiş kümelere atanabileceği güvenlik etkileri vardır. Bu nedenle, SetFileValidData çağıranın yeni SeManageVolumePrivilege etkin olmasını gerektirir (varsayılan olarak, bu yalnızca yöneticilere atanır). Microsoft, bağımsız yazılım satıcılarının (ISV) bu işlevi kullanmanın etkilerini dikkatle dikkate almalarını önerir.

Önbellek

Çoğu G/Ç sürücüsünde (disk, iletişim ve diğerleri) bir G/Ç isteği hemen tamamlanabilirse işlemin tamamlanacağı ve veya WriteFile işlevinin ReadFileTRUE döndüreceği özel durum kodu vardır. Her şekilde, bu tür işlemler zaman uyumlu gibi görünür. Bir disk cihazı için genellikle veriler bellekte önbelleğe alınırken G/Ç isteği hemen tamamlanabilir.

Veriler önbellekte değil

Ancak, veriler önbellekte değilse önbellek düzeni size karşı çalışabilir. Windows önbelleği, dosya eşlemeleri kullanılarak dahili olarak uygulanır. Windows'daki bellek yöneticisi, önbellek yöneticisi tarafından kullanılan dosya eşlemelerini yönetmek için zaman uyumsuz bir sayfa hata mekanizması sağlamaz. Önbellek yöneticisi, istenen sayfanın bellekte olup olmadığını doğrulayabilir, dolayısıyla zaman uyumsuz önbelleğe alınmış bir okuma işlemi yaparsanız ve sayfalar bellekte değilse, dosya sistemi sürücüsü iş parçacığınızın engellenmesini istemediğinizi ve isteğin sınırlı bir çalışan iş parçacığı havuzu tarafından işlendiğini varsayar. Aramanızdan sonra okuma hala beklemede olan denetim programınıza ReadFile döndürülür.

Bu, az sayıda istek için düzgün çalışır, ancak çalışan iş parçacıkları havuzu sınırlı olduğundan (şu anda 16 MB'lık bir sistemde üç tane), yine de belirli bir zamanda disk sürücüsüne yönelik yalnızca birkaç istek kuyruğa alınır. Önbellekte olmayan veriler için çok sayıda G/Ç işlemi yaparsanız, önbellek yöneticisi ve bellek yöneticisi doygun hale gelir ve istekleriniz zaman uyumlu hale gelir.

Önbellek yöneticisinin davranışı, bir dosyaya sırayla veya rastgele erişip erişmediğinize bağlı olarak da etkilenebilir. Önbellek avantajları en çok dosyalara sırayla erişirken görülür. FILE_FLAG_SEQUENTIAL_SCAN Çağrıdaki CreateFile bayrak, önbelleği bu erişim türü için iyileştirir. Ancak, dosyalara rastgele bir şekilde erişiyorsa, önbellek yöneticisine FILE_FLAG_RANDOM_ACCESS rastgele erişim için davranışını iyileştirmesini bildirmek için içindeki bayrağını CreateFile kullanın.

Önbelleği kullanma

Bayrağı, FILE_FLAG_NO_BUFFERING dosya sisteminin zaman uyumsuz işlem davranışı üzerinde en fazla etkiye sahiptir. G/Ç isteklerinin zaman uyumsuz olmasını garanti etmenin en iyi yoludur. Dosya sistemine hiçbir önbellek mekanizması kullanmamasını emreder.

Not

Bu bayrağı kullanmanın veri arabelleği hizalaması ve cihazın kesim boyutuyla ilgili bazı kısıtlamaları vardır. Daha fazla bilgi için CreateFile işlevinin bu bayrağı düzgün kullanma hakkındaki belgelerindeki işlev başvurusuna bakın.

Gerçek dünya test sonuçları

Aşağıda örnek koddan bazı test sonuçları verilmiştir. Sayıların büyüklüğü burada önemli değildir ve bilgisayardan bilgisayara değişir, ancak sayıların birbirine göre ilişkisi bayrakların performans üzerindeki genel etkisini aydınlatmaktadır.

Aşağıdakilerden birine benzer sonuçlar görmeyi bekleyebilirsiniz:

  • Test 1

    Asynchronous, unbuffered I/O:  asynchio /f*.dat /n
    Operations completed out of the order in which they were requested.
       500 requests queued in 0.224264 second.
       500 requests completed in 4.982481 seconds.
    

    Bu test, daha önce bahsedilen programın hızlı bir şekilde 500 G/Ç isteği yayımladığını ve diğer işleri yapmak veya daha fazla istek göndermek için çok fazla zamanı olduğunu gösterir.

  • Test 2

    Synchronous, unbuffered I/O: asynchio /f*.dat /s /n
        Operations completed in the order issued.
        500 requests queued and completed in 4.495806 seconds.
    

    Bu test, bu programın işlemlerini tamamlamak için ReadFile'ı çağırmak için 4,495880 saniye harcadığını, ancak test 1'in aynı istekleri göndermek için yalnızca 0,224264 saniye harcadığını gösterir. Test 2'de, programın herhangi bir arka plan çalışması yapması için fazladan zaman yoktu.

  • Test 3

    Asynchronous, buffered I/O: asynchio /f*.dat
        Operations completed in the order issued.
        500 requests issued and completed in 0.251670 second.
    

    Bu test, önbelleğin zaman uyumlu doğasını gösterir. Tüm okumalar 0,251670 saniye içinde verildi ve tamamlandı. Başka bir deyişle, zaman uyumsuz istekler zaman uyumlu olarak tamamlandı. Bu test, veriler önbellekte olduğunda önbellek yöneticisinin yüksek performansını da gösterir.

  • Test 4

    Synchronous, buffered I/O: asynchio /f*.dat /s
        Operations completed in the order issued.
        500 requests and completed in 0.217011 seconds.
    

    Bu test, test 3 ile aynı sonuçları gösterir. Önbellekten zaman uyumlu okumalar, önbellekten zaman uyumsuz okuma işlemlerinden biraz daha hızlı tamamlanır. Bu test, veriler önbellekte olduğunda önbellek yöneticisinin yüksek performansını da gösterir.

Sonuç

Her şey programınızın gerçekleştirdiği işlemlerin türüne, boyutuna ve sayısına bağlı olduğundan, hangi yöntemin en iyi olduğuna karar vekleyebilirsiniz.

Özel bayrak CreateFile belirtmeden varsayılan dosya erişimi zaman uyumlu ve önbelleğe alınmış bir işlemdir.

Not

Dosya sistemi sürücüsü, değiştirilen verilerin zaman uyumsuz olarak okunmasını ve zaman uyumsuz yavaş yazmasını tahmin ettiğinden, bu modda bazı otomatik zaman uyumsuz davranışlar elde edersiniz. Bu davranış uygulamanın G/Ç'sini zaman uyumsuz hale getirmese de, basit uygulamaların büyük çoğunluğu için ideal bir durumdur.

Öte yandan, uygulamanız basit değilse, bu makalenin önceki bölümlerinde gösterilen testlere benzer şekilde en iyi yöntemi belirlemek için bazı profil oluşturma ve performans izlemesi yapmanız gerekebilir. veya WriteFile işlevinde harcanan sürenin ReadFile profilini oluşturmak ve ardından bu süreyi gerçek G/Ç işlemlerinin tamamlanmasının ne kadar süreceğiyle karşılaştırmak yararlıdır. Zamanın büyük bölümü G/Ç'yi gerçekten verme işlemine harcanıyorsa G/Ç'niz zaman uyumlu olarak tamamlanıyor demektir. Bununla birlikte, G/Ç isteklerinin verilmesi için harcanan süre G/Ç işlemlerinin tamamlanması için geçen süreyle karşılaştırıldığında görece küçükse, işlemleriniz zaman uyumsuz olarak ele alınır. Bu makalede daha önce bahsedilen örnek kod, kendi iç profil oluşturma işlemini gerçekleştirmek için işlevini kullanır QueryPerformanceCounter .

Performans izleme, programınızın diski ve önbelleği ne kadar verimli kullandığını belirlemeye yardımcı olabilir. Cache nesnesi için performans sayaçlarından herhangi birinin izlenmesi önbellek yöneticisinin performansını gösterir. Fiziksel Disk veya Mantıksal Disk nesnelerinin performans sayaçlarının izlenmesi disk sistemlerinin performansını gösterir.

Performans izleme konusunda yararlı olan çeşitli yardımcı programlar vardır. PerfMon ve DiskPerf özellikle yararlıdır. Sistemin disk sistemlerinin performansıyla ilgili veri toplaması için önce komutunu vermelisiniz DiskPerf . Komutu verdikten sonra, veri toplamayı başlatmak için sistemi yeniden başlatmanız gerekir.

Başvurular

Zaman Uyumlu ve Zaman Uyumsuz G/Ç