Şu anda çevrimdışısınız; İnternet'in yeniden bağlanması bekleniyor

Zaman uyumsuz g/ç Disk Windows üzerinde eşzamanlı olarak görünür

ÖNEMLİ: Bu makale, Microsoft Makine Çevirisi Düzenleme yazılımı tarafından tercüme edilmiş olup, yüksek olasılıkla profesyonel bir çevirmen yerine CTF teknolojisi kullanılarak, Microsoft Topluluğu tarafından düzenlenmiştir. Microsoft, Bilgi Bankamız içindeki tüm makaleleri kendi dilinizde okuyabilmeniz için size hem profesyonel çevirmenler tarafından tercüme edilen hem de makine tarafından tercüme edildikten sonra Topluluk tarafından kontrol edilen makaleler sunar. Bununla birlikte, makine tarafından tercüme edilen, hatta Topluluk tarafından kontrol edilen bir makale bile her zaman mükemmel dil kalitesinde olmayabilir. Makalede dilinizi konuşan yabancı birisinin yapabileceği türden sözcük, söz dizimi veya dilbilgisi hataları bulunabilir. Microsoft, içeriğin hatalı tercümesinin veya müşterilerimiz tarafından kullanımının doğurabileceği olası yanlış anlamalar, hatalar veya zararlardan sorumlu değildir. Öte yandan Microsoft, Makine Çevirisi Düzenleme işlemini geliştirmek amacıyla Makine Çevirisi Düzenleme yazılımını ve araçlarını sık sık güncelleştirmektedir.

Makalenin İngilizcesi aşağıdaki gibidir: 156932
Özet
Microsoft Windows dosya g/ç, zaman uyumlu veya zaman uyumsuz olabilir. Burada bir g/ç işlev çağrılır ve g/ç işlemi tamamlandığında verir g/ç için varsayılan davranışı, zaman uyumludur. Zaman uyumsuz g/ç yürütme hemen çağrıyı yapana geri dönmek bir g/ç işlevi sağlar, ancak g/ç gelecekteki bir süreye kadar tam olarak kabul edilir değil. G/ç işlemi tamamlandığında işletim sistemi arayan bildirir. Alternatif olarak, arayanın durumu bekleyen g/ç işlemi işletim sistemi hizmetlerini kullanarak belirleyebilirsiniz.

Zaman uyumsuz g/ç avantajı arayan diğer iş yapmak veya g/ç işlemi tamamlanırken sorun daha fazla isteği zaman olmasıdır. Terim örtüşen ı / Ois zaman uyumsuz g/ç ve olmayan çakışan g/ç için sık kullanılan eşzamanlı g/ç için. Bu makalede, g/ç işlemleri için zaman uyumsuz ve zaman uyumlu terimleri kullanılmaktadır. Bu makalede okuyucu CreateFile ' ReadFile, WriteFile gibi dosya g/ç işlevleri ile benzerlik vardır varsayar.

Sık sık, zaman uyumsuz g/ç işlemleri yalnızca olarak eşzamanlı g/ç. sonraki bölümlerde yapma eşzamanlı g/ç işlemlerini tamamlamak bu makalede açıklanan belirli koşullar davranırlar. G/ç işlemi tamamlanana kadar g/ç işlevleri değil çünkü geri çağıran arka plan iş zaman vardır.

Zaman uyumlu ve zaman uyumsuz g/ç için birkaç işlevleri ilgili. Bu makalede ReadFile WriteFile örnek olarak kullanır; iyi alternatifler, ReadFileEx ve WriteFileEx olacaktır. Yalnızca disk g/ç özellikle anlatılmaktadır, ancak birçok ilkeleri gibi seri bir g/ç veya ağ g/ç g/ç diğer türlere uygulanır.
Daha fazla bilgi

Zaman uyumsuz g/ç Ayarla

Dosya açıldığında CreateFile FILE_FLAG_OVERLAPPED bayrağı belirtilmelidir. Bu bayrak, zaman uyumsuz olarak gerçekleştirilecek dosya g/ç işlemlerini sağlar. İşte bir örnek:
   HANDLE hFile;   hFile = CreateFile(szFileName,                      GENERIC_READ,                      0,                      NULL,                      OPEN_EXISTING,                      FILE_FLAG_NORMAL | FILE_FLAG_OVERLAPPED,                      NULL);   if (hFile == INVALID_HANDLE_VALUE)      ErrorOpeningFile();				
Sistem, gerekiyorsa, zaman uyumlu işlem yapmak için balıklama ayırdığından, zaman uyumsuz g/ç için kodlama yaparken dikkatli olun. Zaman uyumlu veya zaman uyumsuz olarak tamamlanmış bir g/ç işlemi doğru şekilde işlemek için program yazmak, bu nedenle, en iyisidir. Örnek kod, bu husus göstermektedir.

Bir program için pek çok asynchronousoperations için ek sıralama işlemlerini veya doingbackground çalışma gibi tamamlanmasını beklerken sırada vardır. Örneğin, aşağıdaki doğru handlesoverlapped ve bir okuma işlemi tamamlandığında gelmeyecek kod. Bu doesnothing fazla tamamlamak bekleyen g/ç için bekleyin:
   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);				
Unutmayın & NumberOfBytesRead ReadFile geçirilen farklıdır & NumberOfBytesTransferred GetOverlappedResult geçti. Bir operationhas zaman uyumsuz olarak yapılmış, sonra GetOverlappedResult determinethe gerçek işlemi sonra yeniden aktarılan bayt sayısı için kullanılan hascompleted. & ReadFile aktarılan NumberOfBytesRead anlamsız.

Diğer taraftan, bir işlemin hemen ardından tamamlandı & içine NumberOfBytesRead geçti, ReadFile okunan bayt sayısı için geçerlidir. Bu durumda, ReadFile geçirilen bir ÇAKIŞAN yapı atlayın; GetOverlappedResult ya da WaitForSingleObject kullanmayın.

Zaman uyumsuz işlem ile bir başka uyarı bekliyor, işlem tamamlanıncaya kadar bir ÇAKIŞAN yapı kullanmamalısınız olur. Diğer bir deyişle, üç bekleyen g/ç işlemleri varsa, üç ÇAKIŞAN yapıları kullanmanız gerekir. Bir ÇAKIŞAN yapı yeniden, g/ç işlemlerinde öngörülemeyen sonuçlar alırsınız ve veri bozulmalarla karşılaşabilirsiniz. Yeni işlem sol üzerinden veri etkiler için ayrıca bir ÇAKIŞAN yapı ilk kez kullanmadan önce veya bir önceki işlemi tamamlandıktan sonra tekrar önce doğru başlatmanız gerekir.

Kısıtlaması aynı tür veri arabelleği anoperation içinde geçerlidir. Veri arabelleği gerekir okumak veya itscorresponding g/ç işlemi tamamlanıncaya kadar yazılmış; Okuma veya yazma buffermay neden hatalarını ve bozuk veri.

Zaman uyumsuz g/ç hala zaman uyumlu olarak görünüyor

Bu makaledeki yönergeleri izlediyseniz, ancak tüm g/ç işlemlerini yine genellikle eşzamanlı olarak verilen, sırayla tamamlayın ve ReadFile işlemlerden hiçbiri ERROR_IO_PENDING döndüren FALSE ile GetLastError() işlevinin yeterli verir, bu herhangi bir arka plan iş zaman gerektiği anlamına gelir. Bu neden oluşuyor?

Zaman uyumsuz işlem için kodlanmış durumunda synchronouslyeven neden g/ç işlemlerini tamamlamak nedenleri vardır:

Sıkıştırma

NTFS sıkıştırması zaman uyumsuz işlem için bir engel olur. Dosya sistemi sürücüsü sıkıştırılmış dosyaları zaman uyumsuz olarak erişemez; Bunun yerine alloperations yalnızca zaman uyumlu hale getirilir. Bu dosyalar için SIKIŞTIRMA veya PKZIP benzer yardımcı programları ile bu arecompressed geçerli değildir.

NTFS şifreleme

Benzer şekilde sıkıştırma, dosya şifreleme sistemi sürücüsünün zaman uyumsuz g/ç için zaman uyumlu dönüştürme neden olur. Dosyaların şifresi, g/ç istekleri zaman uyumsuz olabilir.

Bir dosya genişletme

G/ç işlemleri eşzamanlı olarak tamamlanan başka işlemler nedenidir. Windows NT'de herhangi uzunluğunu aşan bir dosyaya işlem zaman uyumlu yazın.

Not: uygulamalar yapabilirsiniz yukarıda sözü edilen yazma işlemi zaman uyumsuz SetFileValidData işlevini kullanarak ve ardından bir WriteFile keserek dosyanın geçerli veri uzunluğunu değiştirerek.

(Bu Windows XP ve sonraki sürümlerde kullanılabilir) SetFileValidData kullanarak, uygulamaları verimli dosyaları bunları sıfır doldurma için bir başarım cezası olmaz işletilmeden genişletebilirsiniz.

NTFS dosya sistemi değil çünkü sıfır-dolgusu SetFileValidData tarafından tanımlanan geçerli veri uzunluğu (VDL) kadar veri bu işlevi olan güvenlik uygulamalarını dosya diğer dosyalar tarafından daha önce kullanılmakta kümeler nerede atanmış olabilir. Bu nedenle, SetFileValidData çağıran etkin yeni SeManageVolumePrivilege gerekir (varsayılan olarak, bu yalnızca Yöneticiler'e atanmıştır). Microsoft ISV bu işlevi kullanarak etkileri dikkatle ele almanızı önerir.

Önbellek

Birçok g/ç (disk, iletişim ve diğerleri) sürücüleri nerede, g/ç isteği "hemen" tamamlanabilir, işlem tamamlanır ve ReadFile veya WriteFile işlev TRUE döndürecektir özel durum kodu vardır. Zaman uyumlu olması için bu tür işlemler tüm şekillerde görünür. "Hemen" verileri bellekte önbelleğe alındığında bir diskdevice için tipik olarak bir g/ç isteği tamamlanabilir.

Veri önbellekte değil

Önbellek düzeni veri thecache içinde değilse, karşı ancak çalışabilirsiniz. Windows NT önbelleği, dahili olarak dosyası eşleştirmeleri kullanılarak uygulanır. Windows NT'de bellek yöneticisi önbellek yöneticisi tarafından kullanılan dosya eşlemelerini yönetmek için zaman uyumsuz pagefault bir mekanizma sağlamaz. Thecache Yöneticisi ancak doğrulayabilirsiniz istenen sayfa bellekte olup olmadığını zaman uyumsuz bir önbelleğe alınan okuma sorunu, ve sayfa bellekte değilse, dosya sistemi sürücüsü, engellenen iş parçacığı, istemediğiniz isteği sınırlı bir çalışan iş parçacığı havuzu tarafından işleneceğini varsayar ve böylece. Denetim programınıza ReadFile aramanız hala bekliyor okuma sonra geri döner.

Bu istekler, az sayıda için sorunsuz çalışıyor ancak çalışan iş parçacığı havuzu olduğundan (şu anda üç 16 MB sistem üzerinde), sınırlı yine sadece birkaç istekleri için disk sürücüsü belirli bir zamanda sıraya alınır. Çok fazla g/ç işlemleri için önbellekte bulunmayan verileri kestiğinizde, önbellek Yöneticisi ve bellek doygun ve isteklerinizi eşzamanlı yapılmaz.

Önbellek Yöneticisi davranışını da etkisinde sıralı veya rasgele bir dosya üzerinde whetheryou erişim dayalı. Önbelleğin yararları seenmost dosyaları sırayla erişirken ' dir. CreateFile çağrı FILE_FLAG_SEQUENTIAL_SCAN flagin, bu tür erişimi için önbelleği en iyi duruma getirir. Rasgele bir şekilde dosyalara erişebilir, ancak, theFILE_FLAG_RANDOM_ACCESS bayrağı CreateFile'de önbellek Yöneticisi tooptimize davranışı için rasgele erişim istemek için kullanın.

Önbellek kullanmayın

FILE_FLAG_NO_BUFFERING bayrağı çoğu zaman uyumsuz işlem için File sistemi davranışını etkilemez. Aslında zaman uyumsuz olan g/ç istekleri guaranteethat için en iyi yol budur. Dosyayı bildirir systemto kullanma herhangi bir önbellek mekanizma hiç.

Uyarı: veri arabellek hizalama ve aygıtın kesim boyutu ile yapmak zorunda Bu bayrak kullanmanın bazı kısıtlamaları vardır. İşlev belgelerinde CreateFile işlevi bu bayrak düzgün kullanma hakkında daha fazla bilgi için bkz.

Gerçek dünya Test sonuçları

Bazı test sonuçlarını örnek kod aşağıda verilmiştir. Thenumbers büyüklüğünü burada önemli değildir ve bilgisayardan bilgisayara değişir, ancak sayıları arasındaki ilişki birbirine General etkisini gösterir bayrakları performans üzerinde karşılaştırılması.

Aşağıdakine 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 seconds.   500 requests completed in 4.982481 seconds.						
    Bu sınama, yukarıda belirtilen program 500 g/ç istekleri hızlı bir şekilde verilmiş ve çok daha fazla istekleri yayınlar ya da diğer iş yapmak için zaman vardı 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 program 4.495880 aynı istekleri yayınlar için yalnızca 0.224264 saniye 1 test harcanan ise kendi işlemleri tamamlamak için ReadFile çağırma saniye harcanan bu test gösterir. Test 2'de, programın herhangi bir arka plan iş yapmak "ek" hiçbir zaman vardı.
  • Test 3
    Asynchronous, buffered I/O: asynchio /f*.dat   Operations completed in the order issued.   500 requests issued and completed in 0.251670 seconds.						
    Bu test önbellek zaman uyumlu yapısı gösterilmektedir. Tüm okuma verilmiş ve 0.251670 saniyede tamamlandı. Diğer bir deyişle, zaman uyumsuz istekler eşzamanlı olarak tamamlandı. Veri önbellekte olduğunda bu sınama ayrıca önbellek Yöneticisi'nin yüksek performans 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 olduğu gibi aynı sonuçları göstermektedir. Zaman uyumlu okumalar önbellekten biraz daha hızlı zaman uyumsuz okuma önbellekten tamamlamak unutmayın. Veri önbellekte olduğunda bu sınama ayrıca önbellek Yöneticisi'nin yüksek performans gösterir.

SONUÇ

Türü, boyutu ve programınız gerçekleştirdiği işlemlerin sayısı bağlıdır hangi en iyi yöntemdir, çünkü karar verebilirsiniz.

CreateFileis eş zamanlı ve önbelleğe alınmış bir işlem için özel bayrakları belirtmeden varsayılan dosya erişimi.

Not: dosya sistemi sürücüsü öngörü zaman uyumsuz önceden okuma ve zaman uyumsuz geç yazma değiştirilen veri çünkü bu modda bazı otomatik zaman uyumsuz davranışı Al. Bu uygulama g/ç zaman uyumsuz yapmaz, ancak büyük çoğunluğu basit uygulamalar için ideal durumdur.

Diğer taraftan, uygulamanızın basit değilse, dosome profil oluşturma ve en iyi yöntem, bu makalenin önceki bölümlerinde gösterilen testler benzer belirlemek için performans izleme olabilir. TheReadFile içinde harcanan zaman profil oluşturma veya WriteFile işlevini ve sonra bu sefer nasıl karşılaştırma uzun onu tamamlamak için takesfor gerçek g/ç işlemleri son derece yararlıdır. G/ç, daha sonra g/ç gerçekten veren harcanan zamanı majorityof beingcompleted eş zamanlı olarak ise. Ancak, harcanan süre veren g/ç istekleri isrelatively küçük karşılaştırıldığında, g/ç işlemleri tocomplete için geçen süre ve işlemlerinizi zaman uyumsuz olarak davranılan. Bu makalede daha önce sözü edilen samplecode QueryPerformanceCounter işlevi korurlar profil yapmak için kullanır.

Performans izleme yardımcı olabilir nasıl verimli bir şekilde belirlemek, program isusing disk ve önbellek. Cache nesnesi için performans sayaçları birini izleme önbellek yöneticisinden veritabanı performansını gösterir. Fiziksel Disk veya mantıksal Diskobjects için performans sayaçlarını izleme disk sistemleri performansını gösterir.

Performans izleme yardımcı olan birkaç özelliği vardır; PerfMon ve DiskPerf özellikle yararlıdır. Sistem disk sistemleri performans verilerini toplamak, öncelikle diskperf -y komut kesmeniz gerekir. Komut vermek sonra veri toplama başlatmak için sistemi yeniden başlatmanız gerekir.
Referanslar
Üzerinde MSDN belgelerine bakın. Zaman uyumlu ve zaman uyumsuz g/ç ek bilgi için.

ReadFile ReadFileEx WriteFile Asynczip kbdss kbfile WriteFileEx GetOverlappedResult zaman uyumsuz eşzamanlı örtüşen gelmeyecek

Uyarı: Bu makalenin çevirisi otomatik olarak yapılmıştır

Özellikler

Makale No: 156932 - Son İnceleme: 06/27/2015 02:23:00 - Düzeltme: 7.0

Microsoft Win32 Uygulama Programlama Arabirimi

  • kbapi kbfileio kbinfo kbkernbase kbmt KB156932 KbMttr
Geri bildirim