Momentálne ste offline a čaká sa, kým sa znova pripojíte na internet

Váš prehliadač nie je podporovaný

Ak chcete lokalitu používať, aktualizujte svoj prehliadač.

Aktualizovať na najnovšiu verziu Internet Explorera

Asynchrónna Disk I/O zobrazuje ako synchrónne v systéme Windows

DÔLEŽITÉ: Tento článok je preložený pomocou softvéru na strojový preklad od spoločnosti Microsoft a možno ho opraviť prostredníctvom technológie Community Translation Framework (CTF). Microsoft ponúka strojovo preložené články, články upravené komunitou aj články preložené prekladateľmi, aby zabezpečil prístup ku všetkým článkom databázy Knowledge Base vo viacerých jazykoch. Strojovo preložené články aj upravené články môžu obsahovať chyby týkajúce sa slovnej zásoby, syntaxe alebo gramatiky. Microsoft nenesie zodpovednosť za akékoľvek nepresnosti, chyby alebo škody spôsobené neprávnym prekladom obsahu alebo jeho použitím zo strany našich zákazníkov. Ďalšie informácie o technológii CTF nájdete na lokalite http://support.microsoft.com/gp/machine-translation-corrections/sk.

Pokiaľ chcete vidieť anglickú verziu článku, kliknite sem: 156932
Súhrn
Vstupno-výstupný súbor Microsoft Windows môže byť synchrónne alebo asynchrónne. Predvolené správanie I/O je synchrónna, I/O funkcia sa nazýva a vráti po dokončení I/O. Asynchrónne vstupno-výstupných umožňuje I/O funkcie vykonania na volajúci okamžite, ale I/O predpokladá nie musí byť dokončená do budúcnosti. Operačný systém upozorní, volajúci po dokončení I/O. Prípadne volajúci zistiť stav dlhší vstupno-výstupné operácie pomocou služby operačného systému.

Výhodou asynchrónne vstupno-výstupných je volajúci čas inej práce alebo vydať ďalšie požiadavky, kým dokončuje vstupno-výstupné operácie. Termín prekrývajú I / Ois, ktoré často používajú asynchrónne vstupno-výstupné a Non-prekrývajú I/O synchrónne I/O. V tomto článku sa používa asynchrónne a synchrónny vstupno-výstupných operácií. Tento článok predpokladá, že reader má úroveň vstupno-výstupný súbor funkcie 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é tento článok sa zaoberá v neskoršej časti vstupno-výstupné operácie dokončiť synchrónne. Volajúci má čas na pozadí práce, pretože vstupno-výstupné funkcie vrátiť až po dokončení I/O.

Niektoré funkcie súvisiace synchrónne a asynchrónne I/O. V tomto článku sa používa ReadFile a WriteFile napríklad; funkčná iné možnosti by sa ReadFileEx a WriteFileEx. Napriek tomu, že tento článok sa zaoberá iba disk I/O konkrétne, mnohé z princípov uplatniť iné I/O, napríklad sériové vstupno-výstupný alebo siete.
Ďalšie informácie

Nastaviť asynchrónne I/O

FILE_FLAG_OVERLAPPED príznak musí podľa CreateFile pri otvorení súboru. Tento príznak umožňuje vstupno-výstupných operácií v súbore vykonať 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 asynchrónne vstupno-výstupných preto, lebo systém si vyhradzuje právo urobiť operáciu synchrónne, ak je to potrebné. Preto je najlepšie, ak napíšete program správne spracovať, môže byť dokončená synchrónne alebo asynchrónne vstupno-výstupné operácie. Vzorka kódu ukazuje tejto úvahy.

Existuje veľa vecí, program môže zároveň čaká asynchronousoperations osobám, ďalších operácií frontu alebo doingbackground práce. Napríklad nasledujúci kód správne handlesoverlapped a netýkajú sa prekrývajú dokončenie operácie čítania. To doesnothing viac čakať dlhší 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 odovzdaná ReadFile sa líši od & NumberOfBytesTransferred odovzdaná GetOverlappedResult. Ak operationhas sa asynchrónne GetOverlappedResult použije determinethe skutočný počet bajtov v operácie za hascompleted. & NumberOfBytesRead odovzdaná ReadFile nemá zmysel.

Ak na strane neukončí, potom & NumberOfBytesRead odovzdaná ReadFile platí pre počet bajtov prečítaných. V takom prípade ignorovať OVERLAPPED štruktúry do ReadFile; Nepoužívajte GetOverlappedResult alebo WaitForSingleObject.

Ďalšie upozornenie s asynchrónna operácia je, musíte používať OVERLAPPED štruktúry až po dokončení jeho prebiehajúce operácie. V otherwords, ak máte tri dlhší vstupno-výstupné operácie, musíte použiť tri OVERLAPPED štruktúry. Ak znovu OVERLAPPED štruktúra zobrazí neočakávané výsledky vstupno-výstupných operácií a môžu sa vyskytnúť poškodenie údajov. Okrem toho pred použitím OVERLAPPED štruktúra prvýkrát alebo predtým, ako môžete použiť, po dokončení predchádzajúcich, sa musí správne inicializovať tak neuvádza doľava cez ovplyvňuje nové operácie.

Rovnaký typ obmedzenia sa vyrovnávacia pamäť používa v anoperation. Vyrovnávacia pamäť musí nečíta alebo napísané až po dokončení itscorresponding vstupno-výstupné operácie; čítanie alebo zapisovanie buffermay spôsobovať chyby a poškodené údaje.

Asynchrónna I/O stále zdá byť synchrónny

Ak ste postupovali podľa pokynov v tomto článku, však dokončiť všetky vstupno-výstupné operácie stále zvyčajne synchrónne aby vydané žiadne ReadFile operácií vráti hodnotu FALSE s GetLastError() návratu ERROR_IO_PENDING a to znamená, že nemáte čas pre všetky práce na pozadí. Prečo k tomu dochádza?

Existuje niekoľko dôvodov, prečo vstupno-výstupné operácie dokončiť synchronouslyeven, ak ste kódované pre asynchrónna operácia:

Kompresia

Jeden brániť asynchrónna operácia je kompresia systému NTFS. Ovládač systému súborov nie prístup komprimované súbory asynchrónne; namiesto alloperations sa len synchrónne. Toto sa nevzťahuje na súbory tohto arecompressed pomocou nástrojov, ktoré sú podobné KOMPRIMOVAŤ alebo PKZIP.

Šifrovanie systému súborov NTFS

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

Rozširovanie súboru

Ďalším dôvodom sú synchrónne dokončenie vstupno-výstupných operácií sa samotných operácií. V systéme Windows NT, všetky písať operácie na súbor, ktorý presahuje dĺžku bude synchrónne.

Poznámka: aplikácie môžete spomínané zápis asynchrónne zmenou platnú dĺžku údajov súboru pomocou funkcie SetFileValidData, a potom vydaním WriteFile.

Pomocou SetFileValidData, (čo je k dispozícii v systéme Windows XP a novších verziách), aplikácie efektívne rozšíriť súbory bez sankcie plnení nula, ich výkon.

Keďže systém súborov NTFS nie je nula-vyplniť údaje na dĺžku platných údajov (VDL), ktorá je definovaná SetFileValidData, táto funkcia vplýva na zabezpečenie kde súbor môže byť priradená klastre, ktoré boli predtým zaberá iné súbory. Preto SetFileValidData vyžaduje, aby volajúci nové SeManageVolumePrivilege povolená (v predvolenom nastavení toto je určená len pre správcov). Spoločnosť Microsoft odporúča, aby ISV dôkladne zvážiť dopady používania tejto funkcie.

Vyrovnávacia pamäť

Väčšina ovládač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 ReadFile alebo WriteFile funkcia vráti TRUE. Vo všetkých smeroch, tieto typy operácií sú synchrónne. Pre diskdevice zvyčajne žiadosť o I/O môže byť dokončená "okamžite" v prípade, že údaje uložené v pamäti.

Údaje nie je vo vyrovnávacej pamäti

Vyrovnávacej pamäte systému môže pracovať proti vám, ale ak údaje nie sú v thecache. Vyrovnávacia pamäť systému Windows NT vykonáva pomocou priradenia súborov. Správca pamäte v systéme Windows NT neposkytuje asynchrónne chyba stránkovania pamäte mechanizmom na spravovanie priradenia súborov používa Správca vyrovnávacej pamäte. Thecache správca môže však overiť, či požadovaná stránka je v pamäti, ak vydáte asynchrónne čítanie vo vyrovnávacej pamäti a stránky nie sú v pamäti, ovládač systému súborov predpokladá, že chcete vlákno blokovaný a spracuje požiadavku limitovaný pracovného vlákna. Ovládací prvok vráti program po ReadFile hovor s čítať ešte.

To funguje niekoľko požiadaviek, ale pretože fond pracovné podprocesy je obmedzené (v súčasnosti tri systému 16MB), tam bude stále len niekoľko žiadostí vo fronte na ovládač disku v danom čase. Ak sa problém s množstvom vstupno-výstupných operácií pre údaje, ktoré nie je vo vyrovnávacej pamäti, Správca vyrovnávacej pamäte a Správca pamäte sa nasýtená a vaše požiadavky sa synchrónne.

Správanie správcovi vyrovnávacej pamäte môže ovplyvňovať aj na základe whetheryou prístup k súboru postupne alebo náhodne. Výhody vyrovnávacej pamäte sa seenmost pri prístupe k súborom postupne. FILE_FLAG_SEQUENTIAL_SCAN flagin volanie CreateFile optimalizovať vyrovnávaciu pamäť pre tento typ prístupu. Ak máte prístup k súborom náhodne, používať theFILE_FLAG_RANDOM_ACCESS príznak v CreateFile navrhnúť tooptimize Správca vyrovnávacej pamäte RAM jeho správanie.

Nepoužívajte Cache

Príznak FILE_FLAG_NO_BUFFERING najviac vplýva na správanie systému SČ uloží asynchrónna operácia. To je najlepší spôsob, ako guaranteethat I/O požiadavky sú skutočne asynchrónne. V ňom súbor systemto Nepoužívajte cache mechanizmus vôbec.

Upozornenie: existujú určité obmedzenia pomocou tento príznak, ktoré majú zarovnania medzipamäte údajov a veľkosti sektora zariadenia. Pozrite funkčné v dokumentácii CreateFile funkcie ďalšie informácie o používaní tento príznak správne.

Skutočný svet výsledky

Nižšie sú uvedené niektoré výsledky testov ukážkový kód. Veľkosť thenumbers tu nie je dôležité a mení k počítaču, ale vzťah čísla v porovnaní s navzájom svieti všeobecnej vplyv na výkon zo.

Môžete očakávať výsledky podobné nasledujúcim:
  • 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 ukazuje, že spomínané program vydané 500 vstupno-výstupných požiadaviek rýchlo a veľa času iné práce 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 venovaný 4.495880 sekúnd volania ReadFile na vykonanie operácií, keďže test 1 venovaný len 0.224264 sekúnd vydať rovnaké požiadavky. V test 2, nebol "ďalšie" čas na všetky práce na pozadí programu.
  • 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 vyrovnávacej pamäte. Všetky číta boli vydané a v 0.251670 sekúnd. Inými slovami, asynchrónnych požiadaviek ukončili synchrónne. Tento test tiež ukazuje vysoký výkon správcu vyrovnávacej pamäte, keď údaje vo vyrovnávacej pamäti.
  • 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 testovanie 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ď údaje vo vyrovnávacej pamäti.

UZAVRETIE

Môžete sa rozhodnúť, ktorý postup je najlepšie, pretože všetko závisí od typu, veľkosti a počtu operácie, ktoré program vykonáva.

Predvolený súbor prístup bez zadania špeciálne príznaky na CreateFileis operácie synchrónne a vyrovnávacej pamäte.

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 lenivého písanie úpravy údajov. Hoci to robiť aplikácie I/O asynchrónne, je ideálnym prípade väčšina jednoduchých aplikácií.

Ak na strane aplikácie nie je jednoduché, budete musieť dosome profilovanie a monitorovanie výkonu určiť najlepší spôsob, podobné testy znázornené vyššie v tomto článku. Profilovanie čas venovaný theReadFile alebo WriteFile funkcia a potom porovnať tento čas ako dlho takesfor skutočné vstupno-výstupné operácie na dokončenie je veľmi užitočný. Ak majorityof čas v skutočnosti vydanie I/O, potom vaše I/O beingcompleted synchrónne. Čas venovaný vydávajúcou vstupno-výstupných požiadaviek isrelatively malé v porovnaní čas potrebný pre vstupno-výstupné operácie tocomplete potom vaše operácie považujú asynchrónne. Samplecode uvedených vyššie v tomto článku je funkcia QueryPerformanceCounter na jeho owninternal profilu.

Monitorovanie výkonu môže pomôcť určiť, ako efektívne vášho programu isusing disku a vyrovnávacej pamäte. Sledovanie na počítadlá výkonu vyrovnávacia pamäť objektov udáva výkon správcu vyrovnávacej pamäte. Sledovanie výkonu počítadlá fyzický Disk alebo logický Diskobjects udáva výkon disku systémov.

Existuje niekoľko nástrojov, ktoré sú užitočné pre monitorovanie výkonu; Užitočná PerfMon a pomôcky DiskPerf. Systému na zhromažďovanie údajov o výkone systému disku, musíte prvé vydanie príkazu pomôcky diskperf -y. Po vydaní príkazu, musíte reštartovať systém spustiť zhromažďovanie údajov.
Odkazy
Pozrite si dokumentáciu MSDN na Synchrónna a asynchrónna I/O Ďalšie informácie.

Asynczip ReadFile ReadFileEx WriteFile kbdss WriteFileEx GetOverlappedResult asynchrónne synchrónne prekrývajú bez prekrývajú kbfile

Upozornenie: Tento článok bol preložený automaticky.

Vlastnosti

ID článku: 156932 – Posledná kontrola: 06/27/2015 02:23:00 – Revízia: 4.0

  • Microsoft Win32 Application Programming Interface
  • kbapi kbfileio kbinfo kbkernbase kbmt KB156932 KbMtsk
Pripomienky
" + (window.location.protocol) + "//c.microsoft.com/ms.js'><\/script>");