Asynchrónne Disk i/o javí ako synchrónne na Windows NT, Windows 2000 a Windows XP

Preklady článku Preklady článku
ID článku: 156932 - Zobraziť produkty, ktorých sa tento článok týka.
Rozbaliť všetko | Zbaliť všetko

Na tejto stránke

Súhrn

Vstupno-výstupný súbor na Microsoft Windows NT, Windows 2000 a Windows XP môže byť synchrónny alebo asynchrónny. Predvolené správanie pre vstup/výstup je synchrónne: vstupno-výstupná funkcia sa nazýva a vráti po dokončení vstupu a výstupu. Asynchrónne i/o, na druhej strane, umožňuje vstupno-výstupná funkcia vrátiť prevedenie späť volajúci okamžite, ale i/o nie predpokladá sa je kompletný až do budúcnosti. Operačný systém upozorní volajúceho I/O je kompletný. Prípadne volajúci môže určiť stav vynikajúci vstupno-výstupné operácie pomocou služby operačného systému.

Výhodou asynchrónne i/o je, že volajúci má čas do iných prácou alebo vydávať viac žiadostí, zatiaľ čo vstupno-výstupná operácia bola splnená. Na termín Overlapped I/O je často používaný pre asynchrónne i/o, a Non-prekrývali Vstupu a výstupu pre synchrónne I/O. Tento článok používa pojmy asynchrónne a Synchrónne I/O operácií pod Windows NT. Tento článok predpokladá čitateľ má určité znalosti, súbor vstupno-výstupných operácií pomocou funkcií ako CreateFile, ReadFile, WriteFile.

Často asynchrónne vstupno-výstupných operácií správať rovnako ako synchrónne I/O. určité podmienky, ktorých tento článok pojednáva v neskoršom oddieloch robia i/o operácie dokončiť synchrónne. Volajúci nemá čas na pozadí práce, pretože vstupno-výstupné funkcie nevráti, kým i/o dokončí.

Niekoľko funkcií sú súvisiace synchrónne a asynchrónne vstupno-výstupných operácií. Tento článok používa službu ReadFile a WriteFile ako príklady; dobré alternatívy by sa ReadFileEx a WriteFileEx. Aj keď tento článok sa zaoberá iba disk i/o konkrétne, mnohé z princípov možno aplikovať na ostatné typy i/o, ako sú Sériová vstupno-výstupný alebo siete.

Poznámka: pretože Windows 95 nepodporuje asynchrónne vstupno-výstupné diskové zariadenia (hoci to na iných typoch vstupno-výstupné zariadenia), jeho správanie nie sú zahrnuté v tomto článku.

Ďalšie informácie

Nastaviť asynchrónne i/o

FILE_FLAG_OVERLAPPED vlajka musí uviesť v CreateFile pri otvorení súboru. Tento príznak umožňuje vstupno-výstupných operácií na súbore vykonajú asynchrónne. Tu je prí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í pri kódovanie pre asynchrónne i/o, pretože systém si vyhradzuje právo, aby operáciu synchrónne, ak treba. Preto je najlepšie, ak napíšete program správne spracovať vstupno-výstupná operácia, ktorá môže byť dokončená synchrónne alebo asynchrónne. Ukážkový kód demonštruje Táto úvaha.

Existuje veľa vecí, program môže robiť, kým čakajú na asynchrónny operácie na dokončenie napríklad frontu dodatočných operácií alebo robí prácu, pozadí. Napríklad nasledujúci kód správne kľučky Prekrývajúca a non-prekrývali dokončenie operácia čítania. To robí nič viac čakať vynikajúce I/O dokončenie:
   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šimnite si, že & NumberOfBytesRead prešiel do ReadFile je odlišný od & NumberOfBytesTransferred prešiel do GetOverlappedResult. Ak operáciu bola vykonaná asynchrónne, potom GetOverlappedResult sa používa na určenie aktuálny počet bajtov prenesených v prevádzke po dokončené. & NumberOfBytesRead prešiel do ReadFile je nezmyselné.

Ak, na druhej strane, operácia je dokončená hneď, potom & NumberOfBytesRead prešiel do ReadFile platí pre počet bajtov prečítaných. V tomto prípade ignorovať štruktúru OVERLAPPED prešiel do ReadFile; Nepoužívajte ju s GetOverlappedResult alebo WaitForSingleObject.

Ďalšie námietka s asynchrónnej operácie je, že nesmiete používať štruktúra OVERLAPPED kým jeho čaká operácia sa dokončila. V iných slovami, ak máte tri vynikajúce vstupno-výstupných operácií, musíte použiť tri OVERLAPPED štruktúry. Ak ste opakovane OVERLAPPED štruktúru, dostanete nepredvídateľné výsledky vo vstupno-výstupných operácií a môžu sa vyskytnúť poškodenie údajov. Navyše, pred použitím štruktúry OVERLAPPED po prvýkrát, alebo skôr, ako si to znova po dokončení predchádzajúcej operácie, musíte správne inicializovať to tak žiadne údaje odišiel-cez postihuje nové operácie.

Rovnaký druh obmedzenia uplatňuje sa vyrovnávacia pamäť používa v Operácia. Vyrovnávacia pamäť musí nie ?ítanie alebo zapisovanie do jeho zodpovedajúce vstupno-výstupná operácia má ukončené; čítanie alebo písanie medzipamäte môže spôsobiť chyby a poškodené údaje.

Asynchrónne i/o stále zdá byť synchrónny

Ak ste postupovali podľa návodu vyššie v tomto článku, však všetky vaše vstupno-výstupných operácií ešte typicky dokončiť synchrónne v objednávke vydaná, a žiadny ReadFile operácií vráti FALSE s GetLastError() návratu ERROR_IO_PENDING, to znamená, že máte čas na akékoľvek pozadia práce. Prečo k tomu dochádza?

Existuje mnoho dôvodov, prečo I/O operácie dokončiť synchrónne aj keď ste kódované pre asynchrónna operácia:

Kompresia

Jeden obštrukcie asynchrónnej operácie je kompresia systému NTFS. Súbor ovládač systému nemajú prístup k komprimované súbory asynchrónne; namiesto všetkých operácie sú len robil synchrónne. To sa nevzťahuje na súbory, ktoré sú komprimovaný pomocou utility podobná KOMPRIMOVAŤ alebo PKZIP.

NTFS šifrovanie

Podobne ako kompresia, šifrovanie súborov spôsobuje ovládač systému previesť asynchrónne i/o synchrónny. Ak sú súbory dešifrovať, bude asynchrónne vstupno-výstupných požiadaviek.

Rozšírenie súboru

Ďalším dôvodom sú synchrónne ukončenie vstupno-výstupných operácií je samotných operácií. V systéme Windows NT, žiadne napísať prevádzky do súboru, ktorý rozširuje jej dĺžka bude synchrónny.

Poznámka: aplikácie môžete urobiť spomenuté písať operácie asynchrónne zmenou platnú dĺžku údajov súboru pomocou funkcie SetFileValidData, a potom vydaním WriteFile.

Pomocou SetFileValidData, (ktorý je k dispozícii na Windows XP a novšími verziami), aplikácie efektívne rozšíriť súbory bez vynaloženia výkon trestu pre nulu vyplňovanie im.

Pretože systém súborov NTFS nie je nula-vyplniť údaje do dĺžku platných údajov (VDL), ktorá je definovaná SetFileValidData, táto funkcia nemá bezpečnostné dôsledky, kde súbor môže byť pridelený klastre, ktoré boli predtým obsadený iné súbory. Preto, SetFileValidData vyžaduje, aby volajúci nové SeManageVolumePrivilege zapnuté (podľa predvoleného nastavenia to je pridelené len skupine administrators). Spoločnosť Microsoft odporúča, že ISV starostlivo zvážiť dôsledky použitia tejto funkcie.

Vyrovnávacia pamäť

Väčšina vodičov I/O (disku, komunikácie a iné) majú špeciálny prípad kód kde, ak žiadosť o I/O môže byť dokončená "okamžite", operácia bude dokončená a službu ReadFile alebo WriteFile funkcia vráti TRUE. Vo všetkých smeroch, tieto typy operácií sa zdajú byť synchrónny. Pre disk zariadení, spravidla žiadosť o I/O môže byť dokončená "okamžite" keď údaje je vo vyrovnávacej pamäti.

Údaje nie je vo vyrovnávacej pamäti

Vyrovnávacia pamäť systému môže pracovať proti vám, však, ak údaje nie sú v Vyrovnávacia pamäť. Windows NT cache je implementovaný vnútorne pomocou súboru priradenia. Správca pamäte v systéme Windows NT neposkytuje asynchrónne stránka chyba mechanizmus na spravovanie priradenia súboru používa Správca vyrovnávacej pamäte. Na Správca vyrovnávacej pamäte môžete však overiť, či požadovaná stránka je v pamäti, takže ak budete vydávať asynchrónne čítanie vo vyrovnávacej pamäti a stránky nie sú v pamäti, ovládač systému súborov predpokladá, že nechcete, aby vaše vlákno blokovaný a spracuje žiadosť obmedzená bazén pracovné podprocesy. Ovládanie vráti do programu po ReadFile hovor s čítať stále čaká.

To funguje na malý počet žiadostí, ale pretože bazén pracovné podprocesy je obmedzené (v súčasnosti tri systému 16MB), tam bude stále len niekoľko žiadostí frontě na ovládač disku v určitom čase. Ak vydáte mnoho vstupno-výstupných operácií pre údaje, ktoré nie je vo vyrovnávacej pamäti, cache správcu a správcu pamäte stať nasýtené a sú vaše žiadosti synchrónne.

Správanie správcovi vyrovnávacej pamäte sa môže byť ovplyvnená tiež, či na základe máte prístup k súboru postupne alebo náhodne. Sú vidieť výhody vyrovnávacej pamäte Väčšina pri prístupe k súborom postupne. FILE_FLAG_SEQUENTIAL_SCAN vlajka v CreateFile hovor bude optimalizovať cache pre tento typ prístupu. Avšak, ak máte prístup k súborom v náhodnom spôsobom, použitie FILE_FLAG_RANDOM_ACCESS príznak CreateFile poveriť správcu vyrovnávacej pamäte Optimalizujte svoje správanie pre náhodným prístupom.

Nepoužívajte Cache

FILE_FLAG_NO_BUFFERING vlajkou má najviac vplyv na správanie systém súborov pre asynchrónna operácia. To je najlepší spôsob, ako zaručiť že sú vlastne asynchrónne vstupno-výstupných požiadaviek. To inštruuje systému súborov Nepoužívať žiadne cache mechanizmus vôbec.

Upozornenie: tam sú niektoré obmedzenia pomocou tento príznak, ktorý majú čo do činenia s zarovnania medzipamäte údajov a veľkosti sektora zariadenia. Nájdete odkaz na funkcie v dokumentácii CreateFile funkciu pre viac informácií o používaní tento príznak správne.

Výsledkov reálnych testov

Nižšie sú uvedené niektoré výsledky testu z ukážkový kód. Veľkosť čísla tu nie je dôležité, a sa líši od počítaču k počítaču, ale vzťah čísla vzájomne porovnávali svieti všeobecný vplyv vlajky na výkon.

Môžete očakávať, že vidieť výsledky podobné nasledovnému:
  • 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.
    						
    Tento test sa preukáže, že spomenuté program vydané 500 vstupno-výstupných požiadaviek rýchlo a mal veľa času robiť inú prácu, alebo vydať ďalšie požiadavky.
  • 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.
    						
    Tento test ukazuje, že tento program strávil 4.495880 sekúnd volanie ReadFile dokončiť jeho činnosti, keďže test 1 strávil len 0.224264 sekúnd vydať rovnaké požiadavky. V teste 2, tam bol žiadny "extra" čas pre program urobiť nejaké pozadia pracovať.
  • 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 synchrónne charakter cache. Všetky číta boli vydané a dokončená v 0.251670 sekúnd. Inými slovami, asynchrónne žiadosti boli dokončené synchrónne. Tento test tiež preukazuje vysoký výkon správcu vyrovnávacej pamäte, keď údajov je v cache.
  • 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 rovnaké výsledky ako v teste 3. Všimnite si, že Synchrónne čítanie z vyrovnávacej pamäte dokončiť trochu rýchlejšie, než asynchrónne čítanie z vyrovnávacej pamäte. Tento test tiež ukazuje vysoký výkon správcu vyrovnávacej pamäte, keď dáta vo vyrovnávacej pamäti.

ZÁVER

Môžete sa rozhodnúť, ktorá metóda je najlepšie, pretože to všetko závisí na typ, veľkosť a počet operácií, ktoré program vykonáva.

Predvolený súbor prístup bez zadania akýchkoľvek špeciálnych vlajky CreateFile je synchrónne a vyrovnávacej pamäte operácie.

Poznámka: získate niektoré automatické asynchrónne správanie v tomto režime, pretože ovládač systému súborov nemá prediktívne asynchrónne čítanie dopredu a asynchrónne líný písanie zmenené údaje. Hoci to nerobí aplikácia [ASCII 146] s I/O asynchrónne, je to ideálny prípad drvivá väčšina jednoduchých aplikácií.

Ak, na druhej strane, vaša žiadosť nie je jednoduché, budete musieť urobiť niektoré profilovanie monitorovanie výkonu a určiť najlepší spôsob, podobná skúškach ilustrovaný vyššie v tomto článku. Profilovanie čas strávený v ReadFile alebo WriteFile funkcia a potom porovnávať tento čas ako dlho trvá pre skutočné I/O operácie dokončiť je veľmi užitočné. Ak väčšina času strávená v skutočne vydávanie vstupu a výstupu, potom je vaša I/O dokončiť synchrónne. Ak čas strávený vydávajúci vstupno-výstupných požiadaviek je však relatívne malé oproti času to berie pre vstupno-výstupné operácie, ktoré sa kompletné, potom vaše operácie sú liečení asynchrónne. Vzorky kódu uvedeného vyššie v tomto článku používa funkciu QueryPerformanceCounter robiť svoje vlastné vnútorné profilovanie.

Monitorovanie výkonu môže pomôcť určiť, ako efektívne je váš program pomocou vyrovnávacej pamäte a disku. Sledovanie počítadiel výkonu pre všetky Vyrovnávacia pamäť objektu bude uvádzať výkon správcu vyrovnávacej pamäte. Sledovanie počítadiel výkonu pre fyzický Disk alebo logický Disk objekty bude uvádzať výkon disku systémov.

Existuje niekoľko utilít, ktoré sú užitočné pre monitorovanie výkonnosti; PerfMon a pomôcky DiskPerf sú obzvlášť užitočné. Systému na zber údajov o výkone diskov systémy, musíte najprv vydať príkaz pomôcky diskperf -y. Po vydaní príkazu, musíte reštartovať systém začať zber dát.

Odkazy

Ďalšie informácie o týchto utilít a monitorovanie výkonu, pozri objem "optimalizáciu Windows NT" v systéme Windows NT Resource Súprava dokumentácie.
SQL Server vyžaduje systémov na podporu "garantované dodávka na stabilné médiá", ako je naznačené podľa programu Microsoft SQL Server Always-On skladovanie roztoku preskúmanie. FoĎalšie informácie o vstupných a výstupných požiadavkách pre SQL Server database engine, kliknite na nasledovné číslo článku publikovaného v databáze Microsoft Knowledge Base:
967576Microsoft SQL Server databázu motora vstupné/výstupné požiadavky

Vlastnosti

ID článku: 156932 - Posledná kontrola: 30. mája 2013 - Revízia: 3.0
Informácie v tomto článku sa týkajú nasledujúcich produktov:
  • 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
Kľúčové slová: 
kbapi kbfileio kbinfo kbkernbase kbmt KB156932 KbMtsk
Strojovo preložené
DÔLEŽITÉ: Tento článok bol preložený pomocou softvéru na strojový preklad od spoločnosti Microsoft, nie prekladateľom. Spoločnosť Microsoft ponúka články preložené prekladateľmi aj strojovo preložené články, vďaka čomu máte možnosť prístupu ku všetkým článkom databázy Knowledge Base vo svojom jazyku. Strojovo preložený článok však nie je vždy perfektný. Môže obsahovať chyby týkajúce sa slovnej zásoby, syntaxe alebo gramatiky, podobne ako cudzinec môže robiť chyby, keď rozpráva vašim jazykom. Spoločnosť Microsoft nenesie zodpovednosť za akékoľvek nepresnosti, chyby alebo škody spôsobené akýmkoľvek nepresným prekladom obsahu alebo jeho použitím zo strany zákazníkov. Spoločnosť Microsoft softvér na strojový preklad pravidelne aktualizuje.
Pokiaľ chcete vidieť anglickú verziu článku, kliknite sem: 156932

Odošlite odozvu

 

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