Je bent nu offline; er wordt gewacht tot er weer een internetverbinding is

Asynchrone schijf I/O wordt weergegeven als synchrone op Windows NT, Windows 2000 en Windows XP

BELANGRIJK: Dit artikel is vertaald door middel van automatische vertalingssoftware van Microsoft en is mogelijk nabewerkt door de Microsoft Community via CTF-technologie (Community Translation Framework) of door een menselijke vertaler. Microsoft biedt zowel automatisch vertaalde, door mensen vertaalde en door de community nabewerkte artikelen aan, zodat er in meerdere talen toegang is tot alle artikelen in onze Knowledge Base. Een vertaald of bewerkt artikel kan fouten bevatten in vocabulaire, syntaxis of grammatica.. Microsoft is niet verantwoordelijk voor eventuele onjuistheden, fouten of schade ten gevolge van een foute vertaling van de inhoud van een bericht of het gebruik van deze vertaalde berichten door onze klanten.

De Engelstalige versie van dit artikel is de volgende: 156932
Samenvatting
Bestand I/O op Microsoft Windows NT, Windows 2000 en Windows XP kan worden synchroon of asynchroon is. Is het standaardgedrag voor i/o-synchroon: een i/o-functie wordt aangeroepen en als resultaat gegeven als de I/O voltooid is. Asynchrone I/O, kunnen aan de andere kant een i/o-functie kan worden uitgevoerd onmiddellijk geretourneerd naar de aanroepende functie, maar de I/O wordt niet uitgegaan voltooid tot een later tijdstip. Het besturingssysteem wordt de beller gewaarschuwd wanneer de I/O voltooid is. De beller kan ook de status van de uitstaande i/o-bewerking bepalen met behulp van services van het besturingssysteem.

Het voordeel van asynchrone I/O is dat de beller heeft andere doenwerken of meer aanvragen afgeven, terwijl de i/o-bewerking wordt voltooid. DeOverlapped I/O term wordt vaak gebruikt voor asynchrone i/o- en elkaar niet overlappenI/O voor synchrone I/O. In dit artikel wordt asynchroon van de voorwaarden enSynchrone voor i/o-bewerkingen in Windows NT. In dit artikel wordt ervan uitgegaan dat delezer heeft bepaalde bekend zijn met het bestand i/o-functies zoals CreateFile,ReadFile WriteFile.

Vaak asynchrone i/o-bewerkingen gedragen zich net als synchrone o. bepaaldevoorwaarden die in dit artikel wordt beschreven in de latere secties maken de I/Obewerkingen uitvoeren synchroon. De beller heeft geen tijd voor achtergrondwerken omdat de i/o-functies geen leveren totdat de I/O voltooid is.

Verschillende functies hebben betrekking op synchrone en asynchrone I/O. In dit artikel gebruikt ReadFile en WriteFile als voorbeelden. goede alternatieven zijn ReadFileEx en WriteFileEx. Hoewel dit artikel wordt specifiek alleen schijf I/O beschreven, kunnen veel van de beginselen worden toegepast op andere soorten I/O, zoals seriële i/o- of netwerk-i/o.

Opmerking: omdat Windows 95 ondersteunt geen asynchrone I/O op schijfapparaten (Hoewel dit het geval is op andere soorten i/o-apparaten), het gedrag is niet beschreven in dit artikel.
Meer informatie

Asynchrone I/O instellen

De vlag FILE_FLAG_OVERLAPPED moet worden opgegeven in CreateFile wanneer het bestand wordt geopend. Deze vlag kan i/o-bewerkingen op het bestand asynchroon worden uitgevoerd. Hier volgt een voorbeeld:
   HANDLE hFile;   hFile = CreateFile(szFileName,                      GENERIC_READ,                      0,                      NULL,                      OPEN_EXISTING,                      FILE_FLAG_NORMAL | FILE_FLAG_OVERLAPPED,                      NULL);   if (hFile == INVALID_HANDLE_VALUE)      ErrorOpeningFile();				
Wees voorzichtig bij het coderen voor asynchrone I/O, omdat het systeem behoudt zich hetrecht op een bewerking synchroon maken als het moet. Daarom het beste als u het programma voor een juiste afhandeling van een i/o-bewerking synchroon of asynchroon kan worden voltooid. De voorbeeldcode geeft aan dat deze vergoeding.

Er zijn veel dingen die een programma kunt uitvoeren als u asynchrone wachtenbewerkingen zoals queuing extra bewerkingen of doetwerk achtergrond. Bijvoorbeeld verwerkt de volgende code correctvoltooiing van een leesbewerking overlappende en elkaar niet overlappen. Het doetniets meer dan wachten op de uitstaande I/O te voltooien:
   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);				
Houd er rekening mee dat & NumberOfBytesRead doorgegeven aan ReadFile verschilt van& NumberOfBytesTransferred doorgegeven aan GetOverlappedResult. Als een bewerkinggekomen asynchroon is, wordt GetOverlappedResult gebruikt om te bepalenhet daadwerkelijke aantal bytes dat is overgedragen in de bewerking, nadat zij heeftvoltooid. De & NumberOfBytesRead doorgegeven aan ReadFile zinloos is.

Als aan de andere kant een bewerking is voltooid, worden onmiddellijk vervolgens& NumberOfBytesRead doorgegeven aan ReadFile is geldig voor het aantal bytes dat is gelezen. In dit geval negeert de OVERLAPPED-structuur die is doorgegeven aan ReadFile; Gebruik deze niet met GetOverlappedResult of WaitForSingleObject.

Een andere belemmering met asynchrone bewerking is dat u niet een OVERLAPPED-structuur gebruiken moet totdat de bewerking is voltooid. In anderewoorden, hebt u drie uitstaande i/o-bewerkingen moet u drie OVERLAPPED structuren. Als u opnieuw een OVERLAPPED-structuur gebruiken, ontvangt u onvoorspelbare resultaten in de i/o-bewerkingen en treedt beschadiging van gegevens. Bovendien moet voordat u een OVERLAPPED-structuur voor het eerst kunt gebruiken, of voordat u dit opnieuw gebruiken als een eerdere bewerking is voltooid, u goed initialiseren het dus geen links-over-gegevens is van invloed op de nieuwe bewerking.

Hetzelfde type beperking is van toepassing op de gegevensbuffer gebruikt in eende bewerking. Een gegevensbuffer moet niet worden gelezen of geschreven tot dei/o-bewerking is voltooid. lezen of schrijven van de buffermogelijk fouten en beschadigde gegevens.

Asynchrone i/o-nog steeds worden synchroon

Als u de instructies eerder in dit artikel hebt opgevolgd, echter uw i/o-bewerkingen meestal nog steeds uitvoeren synchroon in de volgorde die is afgegeven, en geen van de bewerkingen ReadFile FALSE retourneert met GetLastError() ERROR_IO_PENDING retourneren, dit betekent dat u hebt geen tijd op de achtergrond werkt. Waarom gebeurt dit?

Er zijn een aantal redenen waarom i/o-bewerkingen synchroon uitvoerenzelfs als u hebt gecodeerd voor asynchrone bewerking:

Compressie

Een obstakel voor de asynchrone bewerking is NTFS-compressie. Het bestandSystem-stuurprogramma heeft geen toegang tot gecomprimeerde bestanden asynchroon; in plaats daarvan allebewerkingen zijn zojuist gemaakt synchroon. Dit geldt niet voor bestanden die zijngecomprimeerd met de hulpprogramma's COMPRIMEREN of PKZIP.

NTFS-codering

Net als voor compressie, bestandscodering wordt het asynchrone I/O converteren naar synchrone stuurprogramma. Als de bestanden worden ontsleuteld, de i/o-aanvragen worden asynchroon.

Een bestand uitbreiden

Een andere reden of i/o-bewerkingen synchroon worden uitgevoerd, is de bewerkingen zelf. Op Windows NT Schrijf een bewerking naar een bestand dat zich uitstrekt van de lengte synchrone zal zijn.

Opmerking: toepassingen maken de eerder genoemde schrijfbewerking asynchrone de geldige gegevenslengte van het bestand wijzigen met behulp van de functie SetFileValidData en vervolgens een WriteFile.

Met SetFileValidData (die is beschikbaar op Windows XP en latere versies), kunnen toepassingen efficiënt bestanden uitbreiden zonder dat de prestaties voor het nul-vullen ze.

Aangezien het NTFS-bestandssysteem niet nul opvulling de gegevens tot de geldige gegevenslengte (Valid: VDL) die is gedefinieerd in SetFileValidData, deze functie beveiligingsimplicaties heeft waar het bestand kan worden toegewezen aan clusters die eerder door andere bestanden ingenomen waren. Daarom SetFileValidData vereist dat de aanvrager de nieuwe SeManageVolumePrivilege is ingeschakeld (standaard, dit is alleen toegewezen aan administrators). Microsoft raadt aan dat onafhankelijke softwareleveranciers zorgvuldig de gevolgen van het gebruik van deze functie.

Cache

De meeste i/o-stuurprogramma's (schijf, communicatie en anderen) hebben speciale geval code, waarbij, als een i/o-aanvraag "onmiddellijk" kan worden voltooid, wordt de bewerking voltooid en de ReadFile of WriteFile functie waar als resultaat. Synchrone zijn niet in alle opzichten deze typen bewerkingen. Voor een schijfapparaat, meestal een i/o-aanvraag "onmiddellijk" wanneer de gegevens in de cache in het geheugen kan worden voltooid.

Gegevens zijn niet in Cache

Het schema cache kunt werken tegen u, echter, als de gegevens niet in decache. De cache van Windows NT wordt geïmplementeerd intern met toewijzingen.Het geheugenbeheer in Windows NT beschikt niet over een asynchrone paginaFout met betrekking tot mechanisme voor het beheren van de toewijzingen die door de cache-beheer wordt gebruikt. DeCachebeheer kan echter controleren of de aangevraagde pagina in het geheugen, dus als u een asynchrone cache alleen uitgeven en de pagina's niet in het geheugen zijn, het stuurprogramma van het bestandssysteem wordt ervan uitgegaan dat u niet dat uw thread geblokkeerd wilt en de aanvraag door een beperkte groep werkthreads verwerkt wordt. De besturing wordt teruggezet naar uw programma na uw oproep ReadFile met het lezen nog in behandeling.

Dit werkt goed bij een klein aantal aanvragen, maar omdat de groep werkthreads beperkt (momenteel drie op een systeem met 16MB), er wordt nog steeds worden alleen een paar aanvragen in wachtrij aan de bestuurder van de schijf op een bepaald moment. Als u een groot aantal i/o-bewerkingen voor gegevens die niet in de cache, de cache manager en geheugenbeheer verzadigd raken en uw aanvragen synchroon worden gedaan.

Het gedrag van de cache-beheer kan ook worden beïnvloed op basis van ofu toegang tot een bestand opeenvolgend of in willekeurige volgorde. Voordelen van de cache worden gezien.meestal bij het openen van bestanden automatisch opeenvolgend genummerd. De vlag FILE_FLAG_SEQUENTIAL_SCANin de CreateFile optimaliseert oproep de cache voor dit type toegang.Als u toegang bestanden op een willekeurige manier tot, gebruiken deFILE_FLAG_RANDOM_ACCESS-vlag in CreateFile als instructie voor cachebeheer terandom access hiervoor wordt geoptimaliseerd.

De Cache niet gebruikt

De vlag FILE_FLAG_NO_BUFFERING heeft het meeste effect op het gedrag van dehet bestandssysteem voor asynchrone bewerking. Dit is de beste manier om ervoor te zorgendat i/o-aanvragen daadwerkelijk asynchroon zijn. Via het bestandssysteem.niet gebruik cache een mechanisme op alle.

Waarschuwing: Er zijn enkele beperkingen voor het gebruik van deze vlag die hebben te maken met de uitlijning van de buffer gegevens en de sectorgrootte van het apparaat. Zie de functie reference in de documentatie bij de functie CreateFile voor meer informatie over het gebruik van deze vlag goed.

Reële wereld testresultaten

Hier volgen enkele resultaten van de voorbeeldcode. De omvang van degetallen is hier niet belangrijk en varieert van computer naar computer, maarde relatie van de getallen in vergelijking met andere illuminates dealgemene invloed van de vlaggen van de prestaties.

U kunt verwachten de volgende resultaten:
  • 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.						
    Deze test wordt gedemonstreerd dat het eerder genoemde programma 500 i/o-aanvragen snel uitgegeven en veel tijd heeft aan andere werkzaamheden of meer aanvragen.
  • 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.						
    Deze test toont aan dat dit programma besteed aan 4.495880 seconden ReadFile om haar activiteiten te roepen dat de test 1 besteed slechts 0.224264 seconden voor het verlenen van de aanvragen. Test in 2, er is geen "extra" voor het programma op de achtergrond werken.
  • Test 3
    Asynchronous, buffered I/O: asynchio /f*.dat   Operations completed in the order issued.   500 requests issued and completed in 0.251670 seconds.						
    Deze test toont de synchrone aard van de cache. Alle leesbewerkingen zijn afgegeven en voltooid in 0.251670 seconden. Met andere woorden, asynchrone aanvragen zijn synchroon voltooid. Dit ook testen de hoge prestaties van de cache manager ziet u wanneer gegevens in de 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.						
    Deze test toont dezelfde resultaten als in test 3. Opmerking synchrone lezen uit de cache voltooien iets sneller asynchrone lezen uit de cache. Deze test wordt de hoge prestaties van de cache manager ook getoond wanneer gegevens in de cache.

CONCLUSIE

U kunt bepalen welke methode werkt het beste omdat alles afhankelijk is van het type, de grootte en het aantal bewerkingen dat het programma wordt uitgevoerd.

De toegang tot bestanden standaard zonder een speciale vlaggen CreateFilehet is een synchrone en in de cache.

Opmerking: U ontvangt een automatische asynchrone gedrag in deze modus omdat het bestandssysteemstuurprogramma voorspellende asynchrone vooruit lezen en asynchrone langzaam schrijven van gewijzigde gegevens. Hoewel dit niet de toepassing [ASCII-146] s i/o-asynchrone maakt, is het ideale geval voor de overgrote meerderheid van eenvoudige toepassingen.

Als uw toepassing aan de andere kant eenvoudig is, er doenSommige profilering en prestaties controleren om te bepalen wat de beste methodevergelijkbaar met de tests die eerder in dit artikel wordt geïllustreerd. Profilering van de tijd besteed aan deReadFile of WriteFile functie en vervolgens dit moment hoe lang vergelijken die nodig isis zeer nuttig voor werkelijke i/o-bewerkingen zijn voltooid. Als de meestevan de tijd wordt besteed in het werkelijk verlenen de I/O en vervolgens de I/O wordtsynchroon uitgevoerd. Als de tijd besteed afgifte i/o-aanvragenrelatief klein vergeleken met de tijd het kost voor de i/o-bewerkingen opvoltooid, klikt u vervolgens uw bewerkingen wordt behandeld asynchroon. Het monstereerder in dit artikel vermelde code gebruikmaakt van de functie QueryPerformanceCounter te doen zijn eigeninterne profilering.

Prestaties controleren kunt u nagaan hoe efficiënt uw programma ismet behulp van de schijf en de cache. Het bijhouden van de prestatiemeteritems voorhet object Cache wordt de prestaties van de cache-beheer aangegeven.De prestatiemeteritems bijhouden voor fysieke schijf of logische schijfobjecten aan de prestaties van de schijfsystemen is.

Er zijn verschillende hulpprogramma's die handig zijn bij het controleren van de prestaties;PerfMon en DiskPerf zijn vooral handig. Voor het systeem voor het verzamelen van gegevens over de prestaties van de schijfsystemen, moet u eerst de opdracht diskperf -y uitgeven. Nadat u de opdracht verzendt, moet u het systeem om te beginnen de gegevens opnieuw.
Referenties
Zie voor meer informatie over deze hulpprogramma's en de controle van prestaties, het volume ' optimaliseren van Windows NT ' in de Windows NT ResourceDocumentatie van de Kit.
SQL Server vereist systemen ter ondersteuning van "gegarandeerde levering aan stabiele media" als omschreven in het programma Microsoft SQL Server Always-On opslag oplossing bekijken. FOVoor meer informatie over de vereisten voor invoer en uitvoer voor de SQL Server-database-engine, klikt u op het volgende artikelnummer om het artikel in de Microsoft Knowledge Base weer te geven:
967576Microsoft SQL Server Database Engine invoer/uitvoer-vereisten
Asynczip ReadFile ReadFileEx WriteFile kbdss kbfile WriteFileEx GetOverlappedResult asynchrone synchrone overlappen niet overlappen

Waarschuwing: dit artikel is automatisch vertaald

Eigenschappen

Artikel-id: 156932 - Laatst bijgewerkt: 05/30/2013 06:03:00 - Revisie: 5.0

Microsoft Win32-API, Microsoft SQL Server 2008 Developer, Microsoft SQL Server 2008 Enterprise, Microsoft SQL Server 2008 Express, Microsoft SQL Server 2008 Standard

  • kbapi kbfileio kbinfo kbkernbase kbmt KB156932 KbMtnl
Feedback
ickstreamTracker.init();