Asynchronní vstupně-výstupních diskových se zobrazí jako synchronní v systému Windows NT, Windows 2000 a Windows XP

Překlady článku Překlady článku
ID článku: 156932 - Produkty, které se vztahují k tomuto článku.
Rozbalit všechny záložky | Minimalizovat všechny záložky

Na této stránce

Souhrn

Vstupně-výstupní soubor v systému Microsoft Windows NT, Windows 2000 a Windows XP může být synchronní nebo asynchronní. Výchozí chování pro vstup a výstup je synchronní: funkci vstupně-výstupní operace se nazývá a skončí, když vstupně-výstupní operace byla dokončena. Asynchronních v/v, na druhé straně umožňuje funkci vstupně-výstupní operace spuštění ihned vrácena zpět k volajícímu, ale vstupu a výstupu není předpokládá se dokončení až do příště. Operační systém upozorní volající po dokončení vstupu a výstupu. Volající můžete také určit stav vynikající vstupně-výstupní operace prostřednictvím služeb operačního systému.

Výhodou asynchronního I/O je, že volající má provést další práce nebo vydávání dalších požadavků při dokončení vstupně-výstupní operace. Na Overlapped I/O termín se často používá pro asynchronní v/v a bez překrytí Pro synchronní vstupně-výstupní operace vstupu a výstupu. V tomto článku používá termíny asynchronní a Synchronní vstupně-výstupní operace v systému Windows NT. Tento článek předpokládá, Čtenář má určitou znalost souborového I/O funkce například CreateFile, ReadFile, WriteFile.

Často asynchronní vstupně-výstupních operací se chovají stejně jako synchronní I/O. některé vytvořit podmínky, které tento článek popisuje v dalších oddílech vstupu a výstupu operace dokončena synchronně. Volající nemá žádný čas pro pozadí pracovat, protože vstupně-výstupní funkce nevrací dokud vstupně-výstupní operace byla dokončena.

Synchronní a asynchronní vstupně-výstupní spojeno několik funkcí. V tomto článku používá funkci ReadFile a WriteFile jako příklady; dobré alternativy by bylo ReadFileEx a WriteFileEx. Přestože tento článek popisuje konkrétně pouze disk I/O, mnohé zásady lze použít na jiné typy vstupu a výstupu, například sériové I/O nebo I/O na sítí.

Poznámka: protože Windows 95 nepodporuje asynchronní vstupně-výstupních diskových zařízení (i když tomu tak u jiných typů vstupně-výstupní zařízení), jeho chování není popsán v tomto článku.

Další informace

Nastavit asynchronních v/v

Při otevření souboru je nutné zadat příznak FILE_FLAG_OVERLAPPED v CreateFile. Tento příznak umožňuje vstupně-výstupních operací na soubor, který má být provedena asynchronně. Zde je příklad:
   HANDLE hFile;

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

   if (hFile == INVALID_HANDLE_VALUE)
      ErrorOpeningFile();
				
Buďte opatrní při kódování pro asynchronních v/v, protože systém rezerv právo provést synchronní operaci, pokud je třeba. Proto je nejlepší Pokud napíšete program správně zpracovat vstupně-výstupní operace, která může být dokončena synchronně nebo asynchronně. Ukázkový kód demonstruje toto posouzení.

Existuje mnoho činností, které může program při čekání na asynchronní operace k dokončení, například další operace služby Řízení front zpráv nebo dělá práce na pozadí. Například následující kód správně zpracovává překrývání a bez překrytí dokončení operace čtení. Ano nic více než čekat nevyřízené I/O dokončení:
   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);
				
Všimněte si, že & předaným funkci ReadFile NumberOfBytesRead se liší od & GetOverlappedResult předán NumberOfBytesTransferred. Pokud operace byla provedena asynchronní, pak GetOverlappedResult slouží k určení skutečný počet bajtů přenesených v provozu až po Dokončit. & NumberOfBytesRead předaným funkci ReadFile je nesmyslné.

Pokud na druhé straně dokončení operace okamžitě, pak & NumberOfBytesRead předaným funkci ReadFile je platný pro počet bajtů přečtených. V tomto případě ignorujte struktury OVERLAPPED předaným funkci ReadFile; nepoužívejte ji GetOverlappedResult nebo WaitForSingleObject.

Jiné výstražné s asynchronní operace je struktury OVERLAPPED nesmí používat, dokud její čekající operace byla dokončena. V ostatních slova, pokud máte tři vynikající vstupně-výstupních operací, je nutné použít tři OVERLAPPED struktury. Pokud jste znovu struktury OVERLAPPED, zobrazí se neočekávané výsledky ve vstupně-výstupních operací a může dojít k poškození dat. Navíc před prvním použitím struktury OVERLAPPED nebo před znovu po dokončení předchozí operace je třeba správně inicializovat tak, aby žádná data zbývá ovlivňuje novou operaci.

Stejný typ omezení platí pro vyrovnávací paměť pro data v operace. Vyrovnávací paměť pro data nesmí být číst nebo zapisovat do jeho odpovídajícího vstupně-výstupní operace byla dokončena; čtení nebo zápisu do vyrovnávací paměti může způsobit chyby a poškozená data.

Asynchronní vstupně-výstupní stále zdá být synchronní

Pokud jste postupovali podle pokynů v tomto článku výše, nicméně všechny vstupně-výstupní operace stále obvykle dokončena synchronně v pořadí vydání a žádná operace ReadFile vrací hodnotu FALSE pomocí GetLastError() vrátit ERROR_IO_PENDING, to znamená, že žádný čas pro všechny práce na pozadí. Proč to dochází?

Existuje několik důvodů, proč vstupně-výstupní operace dokončena synchronně i když jsou kódována pro asynchronní operace:

Komprese

Jeden bránit asynchronní operace je komprese NTFS. Soubor ovladač systému nebude přístup komprimované soubory asynchronně; Místo toho všechny operace jsou prováděny pouze synchronní. To se nevztahuje na soubory, které jsou komprimován pomocí nástroje podobné KOMPRIMOVAT nebo program PKZIP.

Šifrování systému souborů NTFS

Podobná kompresi, šifrování souborů způsobuje ovladač systému převést asynchronního I/O synchronní. Pokud jsou soubory dešifrovat, bude mít asynchronní vstupně-výstupních požadavků.

Rozšíření souboru

Dalším důvodem, že jsou vstupně-výstupní operace dokončena synchronně je samotné operace. V systému Windows NT některé zápisy na soubor, který rozšiřuje jeho délka operace bude synchronní.

Poznámka: aplikace lze provést výše zmíněné operace asynchronní změnou platnou délku dat souboru pomocí funkce SetFileValidData a potom vydáním WriteFile.

Použití SetFileValidData, (která je k dispozici v systému Windows XP a novější verze), aplikace efektivně rozšířit soubory aniž by tím narůstaly pro nulu plnění, je snížení výkonu.

Vzhledem k tomu, že systém souborů NTFS není nula výplň až délku platných dat (VDL), který je definován SetFileValidData, tato funkce má bezpečnostní důsledky kde soubor může být přiřazena clustery, které byly dříve obsazené jiné soubory. Proto SetFileValidData vyžaduje, aby volající měl nový SeManageVolumePrivilege povoleno (ve výchozím nastavení, to je přiřazen pouze pro správce). Doporučuje společnost Microsoft, nezávislí dodavatelé softwaru pečlivě zvážit důsledky použití této funkce.

Mezipaměť

Většina ovladačů vstupně-výstupní (disk, komunikace a další) mají zvláštní případ kódu, kde, pokud požadavek I/O lze dokončit "ihned", bude operace dokončena a ReadFile a WriteFile funkce vrací hodnotu TRUE. Všechny způsoby tyto typy operací zdá být synchronní. Pro disk zařízení, obvykle dokončení vstupně-výstupní požadavek "okamžitě" když je ukládána do mezipaměti data.

Nejsou data v mezipaměti

Mezipaměť schématu můžete pracovat proti vám, ale pokud nejsou data uložena v mezipaměť. Mezipaměť systému Windows NT je implementováno interně pomocí mapování souborů. Správce paměti v systému Windows NT neposkytuje asynchronní stránky odolný mechanismus pro správu mapování souborů používá správce mezipaměti. Na Správce mezipaměti však může ověřit, zda je požadovaná stránka v paměti, takže pokud vydáte asynchronní čtení z mezipaměti stránky nejsou v paměti, ovladač systému souborů předpokládá, že nechcete, aby vaše vlákno blokováno a bude žádost zpracována omezený fond pracovních podprocesů. Ovládací prvek se vrátí do programu po volání s oprávněním Číst stále čeká na funkci ReadFile.

Tato metoda funguje spolehlivě pro malý počet požadavků, ale vzhledem k tomu, že je fond pracovních podprocesů (aktuálně tři systému 16MB), není omezen bude i nadále být pouze několik požadavky ve frontě na disku ovladač v určitém čase. Pokud velké množství vstupně-výstupních operací pro data, která není v mezipaměti, mezipaměť správce a správce paměti nasytit a vašich požadavků jsou provedeny synchronní.

Chování správce mezipaměti mohou být ovlivněny také podle toho, zda postupně nebo náhodně, přístup k souboru. Výhody mezipaměti jsou vidět. Většina při přístupu k souborům postupně. FILE_FLAG_SEQUENTIAL_SCAN příznak v CreateFile optimalizuje volání mezipaměť pro tento typ přístupu. Pokud je přístup k souborům náhodné způsobem, ale použít Příznak FILE_FLAG_RANDOM_ACCESS v CreateFile na pokyn správce mezipaměti pro Optimalizujte své chování pro náhodný přístup.

Nepoužívejte mezipaměti

Příznak FILE_FLAG_NO_BUFFERING má největší vliv na chování systém souborů pro asynchronní operace. To je nejlepší způsob, jak zaručit že jsou ve skutečnosti asynchronní požadavky v/v. Dává pokyn instalačnímu systému souborů bez použití jakékoli mezipaměti mechanismus vůbec.

Upozornění: existují některá omezení použití tohoto příznaku, které při zarovnání vyrovnávací paměti dat a velikost sektoru na zařízení. Viz odkaz na funkci v dokumentaci pro další informace o použití tohoto příznaku správně funkce CreateFile.

Výsledky testů skutečně Světové

Následují některé výsledky testů z ukázkový kód. Velikost čísla zde není důležité a liší se od počítače, ale vztah čísla ve srovnání s sebou illuminates Obecné příznaky na výkon vliv.

Můžete očekávat, že chcete-li zobrazit výsledky podobné následujícím:
  • Zkouška 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.
    						
    Tento test ukazuje, že uvedený program vydána 500 vstupně-výstupní požadavky rychle a měl spoustu času k provedení jiné práce nebo vydají další požadavky.
  • Zkouška 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.
    						
    Tento test ukazuje, že tento program strávené 4.495880 sekund volání k dokončení své operace ReadFile, že test 1 čas strávený jen 0.224264 sekund vydat stejné požadavky. V test 2, nebyl žádný "extra" čas pro program provádět žádné pozadí práce.
  • Test 3
    Asynchronous, buffered I/O: asynchio /f*.dat
    
       Operations completed in the order issued.
       500 requests issued and completed in 0.251670 seconds.
    						
    Tento test ukazuje synchronní povahy mezipaměti. Všechny operace čtení byly vydány a dokončena v 0.251670 sekund. Jinými slovy, asynchronních požadavků byla dokončena synchronně. Tento test také Vysoký výkon správce mezipaměti ukazuje, když data v mezipaměť.
  • Test 4
    Synchronous, buffered I/O: asynchio /f*.dat /s
    
       Operations completed in the order issued.
       500 requests and completed in 0.217011 seconds.
    						
    Tento test ukazuje stejné výsledky jako při zkoušce 3. Poznámka: mírně rychlejší než asynchronní čtení provedení synchronní čtení z mezipaměti z mezipaměti. Tento test také ukazuje vysoký výkon správce mezipaměti, když data v mezipaměti.

UZAVŘENÍ

Můžete se rozhodnout, která metoda je nejvhodnější, protože vše závisí na typ, velikost a počet operací, které provádí program.

Výchozí soubor přístup bez zadání žádné zvláštní příznaky CreateFile je synchronní a probíhá v mezipaměti operace.

Poznámka: v tomto režimu získat některé automatické asynchronní chování, protože ovladač systému souborů nemá prediktivní asynchronní čtení napřed a asynchronní opožděné zapisování dat upravené. I když to nedává aplikace [ASCII 146] s I/O asynchronní, je ideální případ v převážné většině jednoduché aplikace.

Pokud na druhé straně není jednoduché aplikace, bude pravděpodobně nutné provést Některé profilování a určit nejlepší metodu sledování výkonu podobné testy, které jsou popsány dříve v tomto článku. Profilování čas strávený na ReadFile a WriteFile funkce a potom porovnávání tentokrát jak dlouho trvá pro skutečné vstupně-výstupní operace na dokončení je velmi užitečné. Pokud většina času stráveného při vydávání skutečně I/O, pak probíhá v vstupně-výstupní dokončena synchronně. Pokud doba strávená vydávající vstupně-výstupních požadavků je však relativně malý srovnání čas to bere pro vstupně-výstupních operací na kompletní, pak operace jsou zpracovávána asynchronně. Vzorek kód uvedené dříve v tomto článku používá funkci QueryPerformanceCounter provádět své vlastní vnitřní profilování.

Sledování výkonu může pomoci zjistit, jak efektivně je program použití disku a mezipaměti. Všechny čítače výkonu pro sledování výkon správce mezipaměti bude označovat objektu mezipaměti. Sledování výkonu čítače Fyzický Disk nebo logický Disk výkon diskových systémů bude označovat objekty.

Existuje několik nástrojů, které jsou užitečné pro sledování výkonu; PerfMon a DiskPerf jsou obzvláště užitečné. Systém shromažďování dat o výkonu diskových systémů musíte nejprve vydat příkaz diskperf -y. Po vydáním příkazu, je třeba restartovat systém, chcete-li spustit shromažďování dat.

Odkazy

Další informace o těchto nástrojích a sledování výkonu naleznete v tématu svazku "optimalizace Windows NT" v Windows NT Resource Sada dokumentace.
SQL Server vyžaduje systémy podporují zaručené dodání na stabilní média, jak je uvedeno v rámci programu Microsoft SQL Server Always-On Storage řešení recenze. FODalší informace o požadavcích na vstupní a výstupní databázový stroj SQL Server získáte v následujícím článku znalostní báze Microsoft Knowledge Base:
967576Vstupní a výstupní požadavky na Microsoft SQL Server databáze stroj

Vlastnosti

ID článku: 156932 - Poslední aktualizace: 30. května 2013 - Revize: 6.0
Informace v tomto článku jsou určeny pro produkt:
  • Microsoft Win32 Application Programming Interface
  • Microsoft SQL Server 2008 Developer
  • Microsoft SQL Server 2008 Enterprise
  • Microsoft SQL Server 2008 Express
  • Microsoft SQL Server 2008 Standard
Klíčová slova: 
kbapi kbfileio kbinfo kbkernbase kbmt KB156932 KbMtcs
Strojově přeložený článek
Důležité: Tento článek byl přeložen pomocí software společnosti Microsoft na strojový překlad, ne profesionálním překladatelem. Společnost Microsoft nabízí jak články přeložené překladatelem, tak články přeložené pomocí software na strojový překlad, takže všechny články ve Znalostní databázi (Knowledge Base) jsou dostupné v češtině. Překlad pomocí software na strojový překlad ale není bohužel vždy dokonalý. Obsahuje chyby ve skloňování slov, skladbě vět, nebo gramatice, podobně jako když cizinci dělají chyby při mluvení v češtině. Společnost Microsoft není právně zodpovědná za nepřesnosti, chyby nebo škody vzniklé chybami v překladu, nebo při použití nepřesně přeložených instrukcí v článku zákazníkem. Společnost Microsoft aktualizuje software na strojový překlad, aby byl počet chyb omezen na minimum.
Projděte si také anglickou verzi článku: 156932

Dejte nám zpětnou vazbu

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com