Momentan sunteți offline, așteptați să vă reconectați la internet

Asincron Disk I/O apare ca sincron pe Windows

IMPORTANT: Acest articol este tradus cu ajutorul software-ului Microsoft de traducere automată și poate fi corectat prin intermediul tehnologiei Community Translation Framework (CTF). Microsoft oferă articole traduse automat, post-editate de comunitate și articole traduse de oameni, pentru a permite accesul la toate articolele din Baza noastră de cunoștințe în mai multe limbi. Articolele traduse automat și post-editate pot conține greșeli de vocabular, sintaxă și/sau gramatică. Microsoft nu este responsabil de inexactitățile, erorile sau daunele cauzate de traducerea greșită a conținutului sau de utilizarea acestuia de către clienți. Găsiți mai multe informații despre traducerea în colaborare la http://support.microsoft.com/gp/machine-translation-corrections/ro.

Faceți clic aici pentru a vizualiza versiunea în limba engleză a acestui articol: 156932
Rezumat
Fișier I/O pe Microsoft Windows poate fi sincron sau asincron. Comportamentul implicit pentru I/O este sincron, în cazul în care o funcţie I/O este denumit și returnează după terminarea I/O. Asincron I/O permite o funcţie I/O pentru a reveni executarea apelantului imediat, dar I/O nu se presupune să fie complet până la ceva marcă de timp viitoare. Sistemul de operare notifică apelantului după terminarea I/O. Ca alternativă, apelantului poate stabili starea de funcționare I/O incredibil utilizând serviciile de sistem de operare.

Avantajul asincron I/O este că apelantului are marcă de timp pentru a face alte locul de muncă sau problemă mai multe solicitări în marcă de timp ce se finalizează operațiunea I/O. Termenul suprapusă I / Ois frecvent utilizate pentru asincron I/O și Non-suprapusă I/O pentru sincron I/O. Acest articol utilizează termenii Asynchronous și sincrone pentru operațiuni I/O. Acest articol presupune cititorul are familiaritate cu funcțiile I/O de fișier, cum ar fi CreateFile, ReadFile, WriteFile.

Frecvent, operațiuni I/O asincron se comporte doar ca sincron I/O. anumite condiții care acest articol prezintă în secțiuni mai târziu marca operațiunile I/O finaliza sincron. Apelantului nu are marcă de timp de lucru de fundal, deoarece funcțiile I/O returnează până la terminarea I/O.

Mai multe funcții legate de I/O sincrone și asincrone. Acest articol utilizează ReadFile și WriteFile ca exemple; alternative bune ar fi ReadFileEx şi WriteFileEx. Deși acest articol prezintă numai disk I/O în mod special, multe dintre principiile pot fi aplicate la alte tipuri de I/O, cum ar fi serial I/O sau I/O de rețea.
Informaţii suplimentare

Configurați asincron I/O

Pavilion FILE_FLAG_OVERLAPPED trebuie specificate în CreateFile când se deschide fișierul. Această semnalizare permite operațiuni I/O pe fișier pentru a efectua asincron. Iată un exemplu:
   HANDLE hFile;   hFile = CreateFile(szFileName,                      GENERIC_READ,                      0,                      NULL,                      OPEN_EXISTING,                      FILE_FLAG_NORMAL | FILE_FLAG_OVERLAPPED,                      NULL);   if (hFile == INVALID_HANDLE_VALUE)      ErrorOpeningFile();				
Aveți grijă când codificare pentru asincron I/O, deoarece sistemul rezerve theright pentru a efectua o operațiune sincron dacă trebuie să. De aceea, se recomandă dacă se scrie programul pentru a gestiona corect o operațiune de I/O care să se termine sincron sau asincron. exemplu de cod demonstrează acest cont.

Există multe lucruri un program poate face în marcă de timp ce așteaptă asynchronousoperations pentru a efectua operațiuni queuing suplimentare sau doingbackground lucru. De exemplu, următorul cod în mod corespunzător handlesoverlapped şi finalizarea non-suprapusă de o operațiune de citire. Acesta doesnothing mai așteptați I/O incredibil pentru a termina:
   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);				
Rețineți că & NumberOfBytesRead trecut în ReadFile este diferită de & NumberOfBytesTransferred trecut în GetOverlappedResult. Dacă o operationhas au efectuat asincron, apoi GetOverlappedResult este folosit pentru a determinethe numărul efectiv de octeți transferate în funcționarea după o hascompleted. & NumberOfBytesRead trecut în ReadFile este sens.

În cazul în care, pe de altă parte, o operațiune s-a terminat imediat, apoi & NumberOfBytesRead trecut în ReadFile este valid pentru numărul de octeți citiți. În acest caz, ignoră structura OVERLAPPED a trecut în ReadFile; nu utilizați cu GetOverlappedResult sau WaitForSingleObject.

Un alt avertisment cu operaţiune asincronă este că nu trebuie să utilizați o structură OVERLAPPED până când s-a terminat activitate de firmă în așteptare. În otherwords, dacă aveți trei operațiuni I/O deosebite, trebuie să utilizați trei structuri OVERLAPPED. Dacă să reutilizați o structură OVERLAPPED, veți primi rezultate imprevizibile în operațiunile I/O și este posibil să apară deteriorarea datelor. În plus, înainte de a utiliza o structură OVERLAPPED pentru prima dată sau înainte să reutilizați it după terminarea unei operațiuni anterioare, trebuie să corect inițializați se astfel date stânga peste afectează operațiunea noi.

Același tip de restricție se aplică buffer acoperire de date utilizate în anoperation. Un buffer acoperire de date nu trebuie să fie citi sau scrie până când s-a terminat operațiunea de I/O itscorresponding; citirea sau scrierea buffermay provoca erori și date deteriorate.

Asincron I/O apare în continuare să fie sincrone

Dacă aţi urmat instrucțiunile de mai sus în acest articol, cu toate acestea, toate de operațiuni I/O încă de obicei finalizați sincron în ordine emise, și niciuna dintre operațiunile ReadFile returnează FALSE cu GetLastError() returning ERROR_IO_PENDING, acest lucru înseamnă că aveți marcă de timp pentru orice activitate de fundal. De ce acest lucru are loc?

Există o serie de motive ce operațiuni I/O completa synchronouslyeven dacă vă codificate pentru operațiune asincronă:

Compresie

Un obstacol pentru operaţiune asincronă este Compresia NTFS. Driverul de fișiere va accesa fișiere comprimate asincron; în schimb alloperations sunt puse doar sincron. Acest lucru nu se aplică la fișiere care arecompressed cu utilitare similare pentru a COMPRIMA sau PKZIP.

Criptare NTFS

Similar cu compresie, criptarea fișierelor provoacă driverul de sistem pentru a efectua conversia asincron I/O pentru sincron. Dacă fișierele sunt decriptate, solicitările de I/O va fi asincron.

Extinderea unui fișier

Un alt motiv că operațiuni I/O s-au terminat sincron este operațiunile în sine. În Windows NT, orice scriere operațiunea într-un fișier care se extinde lungimea va fi sincron.

Notă: aplicaţii pot face operațiunea de scriere menționate anterior asincron prin modificarea Valid Data Length fișierului utilizând funcția SetFileValidData, și apoi emitentă o WriteFile.

Utilizarea SetFileValidData (care este disponibil în Windows XP și versiuni ulterioare), aplicații poate extinde eficient fișierele fără a suporta o penalizare de performanță pentru umplere zero le.

Deoarece sistemul de fișiere NTFS nu zero-umplere datele până la lungimea date valide (VDL) care este definit de SetFileValidData, această funcție are implicații de securitate în cazul în care fișierul pot fi atribuite clustere care s-au ocupat anterior de alte fișiere. De aceea, SetFileValidData necesită apelantul că noi SeManageVolumePrivilege activat (implicit, acest lucru este atribuit numai pentru administratori). Microsoft recomandă ISV analizați implicațiile utilizării această funcție.

Memorie cache

Majoritatea driverelor de I/O (disc, comunicații și altele) au cod caz special în cazul în care, dacă o solicitare de I/O poate fi finalizat "imediat", va fi finalizat operația și funcția ReadFile sau WriteFile va returna TRUE. În toate modurile, aceste tipuri de operațiuni pare să fie sincron. Pentru o diskdevice, de obicei, o solicitare de I/O poate fi finalizat "imediat" atunci când este în cache a datelor în memorie.

Datele nu sunt în Cache

Schema de cache poate lucra împotriva, cu toate acestea, dacă datele nu sunt în thecache. Memoria cache de Windows NT se implementează intern utilizând fișierul mapările. Managerul de memorie în Windows NT nu furnizează un mecanism de pagefault asincron pentru a gestiona mapările fișiere utilizate de către managerul de cache. Thecache manager cu toate acestea, verificați dacă pagina solicitată este în memorie, astfel încât dacă se emite o citire asincron cache și paginile nu sunt în memorie, driverul de sistem de fișiere presupune că nu doriți thread-ul blocat și solicitarea vor fi tratate de un rezervor limitată de fire de lucru. Control este returnat în programul după apelul ReadFile cu citire încă în curs.

Aceasta funcționează bine pentru un număr mic de cereri, dar deoarece rezervorul de fire de lucru este limitat (în prezent trei într-un sistem de 16 MO), va mai fi numai câteva solicitări coadă la driverul de disc la un anumit moment. Dacă se emite o mulțime de operațiuni I/O pentru datele pe care nu se află în memoria cache, cache manager și memorie deveni saturate și solicitarea dvs. sunt puse sincron.

Comportamentul managerul de memorie cache, de asemenea, pot fi influenţate bazate pe whetheryou acces un fișier ordine sau aleator. Avantajele memoria cache sunt seenmost la accesarea fișierelor ordine. Flagin FILE_FLAG_SEQUENTIAL_SCAN CreateFile apelul va optimiza memoria cache pentru acest tip de acces. Cu toate acestea, dacă aveți acces la fișierele în mod aleatoriu, utilizați semnalizatorul theFILE_FLAG_RANDOM_ACCESS în CreateFile pentru a instrui cache manager tooptimize comportamentul pentru acces aleator.

Nu utilizați memoria Cache

Pavilion FILE_FLAG_NO_BUFFERING are efect majoritatea comportamentul fișierul pe sistem pentru operaţiune asincronă. Aceasta este cea mai bună modalitate de a guaranteethat I/O solicitările sunt efectiv asincron. Instruieşte fișierul systemto nu utilizează niciun mecanism de cache deloc.

Avertisment: există anumite restricții să utilizați această semnalizare care trebuie să fac cu alinierea buffer acoperire de date și dimensiune de sector al dispozitivului. Consultați reference function din documentația pentru funcția CreateFile pentru mai multe informații despre cum se utilizează această semnalizare corect.

Rezultatele testului lumea reală

Iată unele rezultatele testului, de exemplu de cod. Mărimea thenumbers nu este important aici și variază de la computer la computer, dar relația dintre numerele în comparație cu fiecare alte iluminează thegeneral afectează Flags performanța.

Vă puteţi aştepta pentru a vedea rezultate similar cu următorul:
  • 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.						
    Acest test demonstrează că programul menționate anterior 500 solicitări I/O a emis rapid și a avut mult marcă de timp pentru a face alte funcționează sau mai multe solicitări de problemă.
  • 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.						
    Acest test demonstrează că acest program petrecut 4.495880 secunde apelarea ReadFile pentru a finaliza activitate de firmă, întrucât testul 1 cheltuit numai 0.224264 secunde pentru solicitările de aceeași problemă. În test 2, nu a fost "suplimentare" marcă de timp pentru programul pentru a face orice lucru de fundal.
  • Test 3
    Asynchronous, buffered I/O: asynchio /f*.dat   Operations completed in the order issued.   500 requests issued and completed in 0.251670 seconds.						
    Acest test demonstrează natura sincron memoria cache. Toate citiri au fost emise și finalizat în 0.251670 secunde. Cu alte cuvinte, solicitările asincron s-au terminat sincron. Acest test, de asemenea, demonstrează performanță înaltă managerului de memorie cache când datele se află în memoria 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.						
    Acest test demonstrează aceleași rezultate ca test 3. Rețineți că sincron citiri din memoria cache complet un pic mai repede decât asincron citiri din memoria cache. Acest test, de asemenea, demonstrează performanță înaltă managerului de memorie cache când datele se află în memoria cache.

ÎNCHEIEREA

Aveți posibilitatea să decideți ce metodă este cea mai bună, deoarece toate depinde de tipul, dimensiunea și numărul de operațiuni efectuate de programul.

Acces de fișier implicit fără a specifica toate semnalizările speciale pentru CreateFileis o operațiune sincron și memoria cache.

Notă: te unele comportament asincron automate în acest mod deoarece driverul de sistem de fișiere nu predicție asincron înainte de citire și asincron leneș scrierea acoperire de date modificate. Deși acest lucru nu face cererea I/O asincron, este cazul ideal pentru Marea majoritate a stratul aplicaţiilor simplă.

În cazul în care, pe de altă parte, aplicația nu este simplă, trebuie să dosome profilare şi monitorizarea performanței pentru a determina cea mai bună metodă similară cu teste ilustrat mai sus în acest articol. Profilare timpul petrecut cu theReadFile sau WriteFile funcţia şi apoi compararea acest marcă de timp cum lung it takesfor reale operațiuni I/O pentru a termina este extrem de util. Dacă majorityof marcă de timp în fapt emitentă I/O, apoi vă I/O este beingcompleted sincron. Cu toate acestea, dacă timpul petrecut emitentă I/O solicitările isrelatively mici în comparație la timpul necesar pentru tocomplete de operațiuni I/O, apoi de operațiuni sunt tratate asincron. Samplecode menționate mai sus în acest articol utilizează funcția QueryPerformanceCounter pentru a face sa owninternal profilare.

Monitorizarea performanței poate determina cât de eficient isusing de program şi memoria cache de disc. Urmărirea oricare dintre contoare de performanță pentru Cache obiect vor indica performanța managerului de memorie cache. Urmărirea contoarelor de performanță pentru disc fizic sau logice Diskobjects va indica performanțele sistemele de disc.

Există câteva utilitare care sunt utile în monitorizarea performanței; PerfMon și DiskPerf sunt utile mai ales. Pentru sistemul să colecteze date privind performanțele sistemele de disc, trebuie să elibereze mai întâi comanda -y diskperf. După ce problemă comanda, trebuie să reporniți sistemul pentru a începe colectarea datelor.
Referinţe
Consultați documentația MSDN pe Sincron şi asincron I/O pentru informații suplimentare.

Asynczip ReadFile ReadFileEx WriteFile kbdss kbfile WriteFileEx GetOverlappedResult asincron sincron suprapusă Non-suprapusă

Avertisment: acest articol a fost tradus automat

Proprietăți

ID articol: 156932 - Ultima examinare: 06/27/2015 02:22:00 - Revizie: 1.0

Interfaţă de programare aplicaţii pentru Microsoft Win32

  • kbapi kbfileio kbinfo kbkernbase kbmt KB156932 KbMtro
Feedback