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

Vertaalde artikelen Vertaalde artikelen
Artikel ID: 156932 - Bekijk de producten waarop dit artikel van toepassing is.
Alles uitklappen | Alles samenvouwen

Op deze pagina

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 doen werken of meer aanvragen afgeven, terwijl de i/o-bewerking wordt voltooid. De Overlapped I/O term wordt vaak gebruikt voor asynchrone i/o- en elkaar niet overlappen I/O voor synchrone I/O. In dit artikel wordt asynchroon van de voorwaarden en Synchrone voor i/o-bewerkingen in Windows NT. In dit artikel wordt ervan uitgegaan dat de lezer 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. bepaalde voorwaarden die in dit artikel wordt beschreven in de latere secties maken de I/O bewerkingen uitvoeren synchroon. De beller heeft geen tijd voor achtergrond werken 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 het recht 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 wachten bewerkingen zoals queuing extra bewerkingen of doet werk achtergrond. Bijvoorbeeld verwerkt de volgende code correct voltooiing van een leesbewerking overlappende en elkaar niet overlappen. Het doet niets 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 bewerking gekomen asynchroon is, wordt GetOverlappedResult gebruikt om te bepalen het daadwerkelijke aantal bytes dat is overgedragen in de bewerking, nadat zij heeft voltooid. 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 andere woorden, 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 een de bewerking. Een gegevensbuffer moet niet worden gelezen of geschreven tot de i/o-bewerking is voltooid. lezen of schrijven van de buffer mogelijk 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 uitvoeren zelfs als u hebt gecodeerd voor asynchrone bewerking:

Compressie

Een obstakel voor de asynchrone bewerking is NTFS-compressie. Het bestand System-stuurprogramma heeft geen toegang tot gecomprimeerde bestanden asynchroon; in plaats daarvan alle bewerkingen zijn zojuist gemaakt synchroon. Dit geldt niet voor bestanden die zijn gecomprimeerd 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 schijf apparaat, 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 de cache. De cache van Windows NT wordt geïmplementeerd intern met toewijzingen. Het geheugenbeheer in Windows NT beschikt niet over een asynchrone pagina Fout met betrekking tot mechanisme voor het beheren van de toewijzingen die door de cache-beheer wordt gebruikt. De Cachebeheer 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 of u 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_SCAN in de CreateFile optimaliseert oproep de cache voor dit type toegang. Als u toegang bestanden op een willekeurige manier tot, gebruiken de FILE_FLAG_RANDOM_ACCESS-vlag in CreateFile als instructie voor cachebeheer te random access hiervoor wordt geoptimaliseerd.

De Cache niet gebruikt

De vlag FILE_FLAG_NO_BUFFERING heeft het meeste effect op het gedrag van de het bestandssysteem voor asynchrone bewerking. Dit is de beste manier om ervoor te zorgen dat 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 de getallen is hier niet belangrijk en varieert van computer naar computer, maar de relatie van de getallen in vergelijking met andere illuminates de algemene 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 CreateFile het 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 doen Sommige profilering en prestaties controleren om te bepalen wat de beste methode vergelijkbaar met de tests die eerder in dit artikel wordt geïllustreerd. Profilering van de tijd besteed aan de ReadFile of WriteFile functie en vervolgens dit moment hoe lang vergelijken die nodig is is zeer nuttig voor werkelijke i/o-bewerkingen zijn voltooid. Als de meeste van de tijd wordt besteed in het werkelijk verlenen de I/O en vervolgens de I/O wordt synchroon uitgevoerd. Als de tijd besteed afgifte i/o-aanvragen relatief klein vergeleken met de tijd het kost voor de i/o-bewerkingen op voltooid, klikt u vervolgens uw bewerkingen wordt behandeld asynchroon. Het monster eerder in dit artikel vermelde code gebruikmaakt van de functie QueryPerformanceCounter te doen zijn eigen interne profilering.

Prestaties controleren kunt u nagaan hoe efficiënt uw programma is met behulp van de schijf en de cache. Het bijhouden van de prestatiemeteritems voor het object Cache wordt de prestaties van de cache-beheer aangegeven. De prestatiemeteritems bijhouden voor fysieke schijf of logische schijf objecten 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 Resource Documentatie 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

Eigenschappen

Artikel ID: 156932 - Laatste beoordeling: donderdag 30 mei 2013 - Wijziging: 5.0
De informatie in dit artikel is van toepassing op:
  • Microsoft Win32-API
  • Microsoft SQL Server 2008 Developer
  • Microsoft SQL Server 2008 Enterprise
  • Microsoft SQL Server 2008 Express
  • Microsoft SQL Server 2008 Standard
Trefwoorden: 
kbapi kbfileio kbinfo kbkernbase kbmt KB156932 KbMtnl
Automatisch vertaald artikel
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

Geef ons feedback

 

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