Asynchrone Festplatten-e/a wird unter Windows als synchrone

Wichtig: Dieser Artikel wurde maschinell übersetzt und wird dann möglicherweise mithilfe des Community Translation Framework (CTF) von Mitgliedern unserer Microsoft Community nachbearbeitet. Weitere Informationen zu CTF finden Sie unter http://support.microsoft.com/gp/machine-translation-corrections/de.

Den englischen Originalartikel können Sie über folgenden Link abrufen: 156932
Zusammenfassung
Datei-e/a auf dem Microsoft Windows kann synchron oder asynchron sein. Das Standardverhalten für e/a ist synchron, wenn eine e/a-Funktion aufgerufen wird und gibt nach Abschluss der e/a. Asynchrone e/a ermöglicht eine e/a-Funktion, die Ausführung sofort wieder an den Aufrufer zurückgegeben, aber die e/a ist nicht übernommen, bis zu einem zukünftigen Zeitpunkt abgeschlossen sein muss. Das Betriebssystem benachrichtigt den Aufrufer, wenn die e/a abgeschlossen ist. Alternativ kann der Aufrufer den Status des ausstehenden e/a-Vorgangs ermitteln, mithilfe von Diensten des Betriebssystems.

Die Vorteile der asynchronen e/a ist, dass der Aufrufer Zeit für andere arbeiten oder mehr Anforderungen absetzen, während der e/a-Vorgang abgeschlossen ist. Der Begriff Overlapped I / Ois für asynchrone e/a und nicht überlappende e/a-häufig für synchrone e/a verwendet. In diesem Artikel werden die Begriffe asynchrone und synchrone für e/a-Operationen verwendet. In diesem Artikel wird davon ausgegangen, dass die Leser mit der Datei-e/a-Funktionen wie CreateFile ReadFile, WriteFile vertraut.

Häufig Verhalten sich asynchrone e/a-Vorgänge nur synchrone e/a. bestimmte Bedingungen, die in späteren Abschnitten stellen erläutert, die e/a-Vorgänge synchron abgeschlossen. Der Aufrufer hat keine Zeit für die Hintergrundverarbeitung, da die e/a-Funktionen bis zum Abschluss der e/a nicht zurückgegeben werden.

Mehrere Funktionen beziehen sich auf die synchrone und asynchrone e/a. In diesem Artikel werden ReadFile und WriteFile als Beispiele verwendet. gute alternativen wäre ReadFileEx und WriteFileEx. Obwohl nur Festplattenzugriffe insbesondere erläutert, können viele der Prinzipien an andere Typen von e/a, wie serielle e/a- oder Netzwerk-e/a-angewendet werden.
Weitere Informationen

Einrichten von asynchronen e/a

FILE_FLAG_OVERLAPPED-Flag muss in CreateFile angegeben werden, wenn die Datei geöffnet wird. Dieses Flag ermöglicht es, i/o-Vorgänge an der Datei asynchron durchgeführt werden. Es folgt ein Beispiel:
   HANDLE hFile;   hFile = CreateFile(szFileName,                      GENERIC_READ,                      0,                      NULL,                      OPEN_EXISTING,                      FILE_FLAG_NORMAL | FILE_FLAG_OVERLAPPED,                      NULL);   if (hFile == INVALID_HANDLE_VALUE)      ErrorOpeningFile();				
Seien Sie vorsichtig beim Codieren für asynchrone e/a, da das System Ressourcenbaumstruktur reserviert um eine Operation synchron, wenn notwendig machen. Aus diesem Grund empfiehlt es beim Schreiben ordnungsgemäß einen e/a-Vorgang verarbeitet, der synchron oder asynchron ausgeführt werden kann. Der Beispielcode demonstriert diese Überlegung.

Ein Programm kann viele Dinge tun während noch nicht für Asynchronousoperations, z. B. können zusätzliche oder Doingbackground Arbeit abgeschlossen sind. Im folgenden Codebeispiel ordnungsgemäß Handlesoverlapped und der Abschluss einen Lesevorgang nicht überlappend. Es Doesnothing warten mehr als der ausstehenden e/a abgeschlossen:
   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);				
Beachten Sie, dass & NumberOfBytesRead übergebenen ReadFile unterscheidet sich von & NumberOfBytesTransferred an GetOverlappedResult übergeben. Asynchrone eine Operationhas vorgenommen, dann GetOverlappedResult wird verwendet, um tatsächliche Anzahl der übertragenen Bytes in den Betrieb nach dem es Determinethe Hascompleted. Die & NumberOfBytesRead übergebenen ReadFile ist ohne Bedeutung.

Wenn auf der anderen Seite dann ein Vorgang sofort abgeschlossen & NumberOfBytesRead übergebenen gilt ReadFile für die Anzahl der gelesenen Bytes. In diesem Fall die OVERLAPPED-Struktur übergeben ReadFile zu ignorieren; Verwenden Sie es nicht mit GetOverlappedResult oder WaitForSingleObject.

Eine andere Einschränkung asynchroner Vorgang ist, dass Sie eine OVERLAPPED-Struktur nicht verwenden dürfen, bis die ausstehende Operation abgeschlossen ist. In anderen Worten Sie drei ausstehenden e/a-Vorgänge haben, müssen Sie drei OVERLAPPED-Strukturen verwenden. Wenn Sie eine überlappende Struktur wiederverwenden, wird Ihnen zu unvorhersehbaren Ergebnissen in den e/a-Vorgängen und Datenbeschädigungen auftreten. Darüber hinaus müssen vor der Verwendung einer OVERLAPPED-Struktur zum ersten Mal oder bevor er nach Abschluss eine frühere Operation wiederverwenden, Sie richtig initialisieren, damit keine Daten mehr wirkt sich auf den neuen Vorgang.

Die gleiche Art von Einschränkung gilt für die Anoperation verwendeten Datenpuffer. Ein Datenpuffer muss nicht gelesen oder geschrieben, bis Itscorresponding e/a-Vorgang abgeschlossen ist; Lesen oder Schreiben der Buffermay verursachen Fehler und fehlerhafte Daten.

Asynchrone e/a-noch ist anscheinend Synchronous

Wenn Sie weiter oben in diesem Artikel beschriebenen Anweisungen ausgeführt haben, jedoch alle i/o-Operationen weiterhin in der Regel führen Sie synchron in der Reihenfolge ausgegeben, und keiner der Vorgänge ReadFile gibt FALSE zurück, mit GetLastError() ERROR_IO_PENDING zurückgibt; Dies bedeutet, dass Sie keine Zeit für eine Hintergrundverarbeitung Warum geschieht dies?

Es gibt eine Reihe von Gründen, warum e/a-Vorgänge Synchronouslyeven abschließen, wenn Sie für den asynchronen Vorgang programmiert haben:

Komprimierung

Ein Hindernis für den asynchronen Betrieb ist die NTFS-Komprimierung. Der Dateisystemtreiber greift nicht asynchron auf das komprimierte Dateien; Stattdessen werden Alloperations nur synchrone vorgenommen. Dies gilt nicht für Dateien mit Dienstprogrammen wie COMPRESS oder PKZIP, Arecompressed.

NTFS-Verschlüsselung

-Komprimierung entspricht, Dateiverschlüsselung wird den Systemtreiber, asynchrone e/a in synchronen zu konvertieren. Wenn die Dateien entschlüsselt sind, werden die e/a-Anforderungen asynchron sein.

Erweitern einer Datei

E/a-Vorgänge synchron abgeschlossen sind ein weiterer Grund ist die Vorgänge selbst. Unter Windows NT schreiben eine synchrone Operation in eine Datei, die die Länge erweitert werden.

Hinweis: Anwendungen können, den zuvor erwähnten Schreibvorgang asynchrone indem ändern die gültige Datenlänge der Datei mithilfe der SetFileValidData-Funktion, und dann eine WriteFile.

Mit SetFileValidData (die unter Windows XP und neueren Versionen zur Verfügung steht) können Anwendungen effizient Dateien erweitern, ohne Leistungseinbußen für 0 (null) füllen sie.

Da das NTFS-Dateisystem nicht 0 (null)-füllen die Daten bis zu die gültige Datenlänge (Valid VDL), die durch die SetFileValidData definiert ist, diese Funktion hat Auswirkungen auf die Sicherheit, kann die Datei Cluster zugewiesen werden, die zuvor durch andere Dateien belegt wurden. SetFileValidData erfordert daher, dass der Aufrufer den neuen SeManageVolumePrivilege aktiviert haben (in der Standardeinstellung, dies ist nur Administratoren zugewiesen). Microsoft empfiehlt, die Auswirkungen der Verwendung dieser Funktion ISVs überdenken.

Cache

Die meisten e/a-Treiber (Festplatte, Kommunikation und andere) haben besonderen Fall Code, wenn eine e/a-Anforderung "sofort" abgeschlossen werden kann, wird der Vorgang abgeschlossen und die ReadFile oder WriteFile-Funktion gibt TRUE zurück. Diese Art von Vorgängen scheinbar in jeder Hinsicht synchron sein. Für eine Diskdevice kann in der Regel eine e/a-Anforderung abgeschlossen werden "sofort", wenn die Daten im Arbeitsspeicher zwischengespeichert werden.

Daten sind nicht im Cache.

Das Schema Cache kann jedoch gegen Sie, funktionieren, wenn die Daten nicht Thecache sind. Der Windows NT-Cache wird intern mit Dateizuordnungen implementiert. Der Speicher-Manager in Windows NT bietet keinen asynchrone Fehler Mechanismus zum Verwalten der Dateizuordnungen von der Cache-Manager verwendet. Thecache-Manager kann jedoch überprüfen, ob die angeforderte Seite im Arbeitsspeicher befindet, also wenn Sie einen asynchronen Lesevorgang zwischengespeicherten ausgeben und die Seiten nicht im Speicher sind, wird der Dateisystemtreiber davon ausgegangen, dass Sie nicht, dass des Threads blockiert möchten und die Anforderung von einem begrenzten Pool von Worker-Threads verarbeitet werden. Steuerelement wird nach der ReadFile-Aufruf mit der Lese-noch an Ihr Programm zurückgegeben.

Dies funktioniert gut für eine kleine Anzahl von Anforderungen, sondern weil der Pool von Worker-Threads ist begrenzt (derzeit drei auf einem System 16MB), es werden noch werden nur wenige Anforderungen in der Warteschlange an den Datenträgertreiber zu einem bestimmten Zeitpunkt. Wenn Sie viele e/a-Operationen für Daten, die nicht im Cache enthalten ist ausführen, den CacheManager und Speicher-Manager gesättigt werden und Ihre Anforderungen synchron.

Das Verhalten der Cache-Manager kann auch beeinflusst Grundlage Whetheryou Zugriff auf eine Datei sequenziell oder zufällig. Vorteile des Caches sind Seenmost beim Zugriff auf Dateien sequenziell. FILE_FLAG_SEQUENTIAL_SCAN-Flagin der CreateFile-Aufruf wird den Cache für diese Art von Zugriff optimieren. Jedoch, wenn Sie Dateien auf eine zufällige Weise zugreifen, mithilfe TheFILE_FLAG_RANDOM_ACCESS-Flag in CreateFile anweisen der Cache-Manager-Tooptimize das Verhalten für den zufälligen Zugriff.

Verwenden Sie nicht den Cache

Das FILE_FLAG_NO_BUFFERING-Flag wurde am stärksten auf das Verhalten der file System für asynchrone Vorgänge. Dies ist die beste Möglichkeit, Guaranteethat, e/a fordert tatsächlich asynchron sind. Es weist die Datei automatisiert verwenden Cache-Mechanismus überhaupt nicht.

Warnung: Es gibt einige Einschränkungen, die mit diesem Flag, die mit der Datenausrichtung Puffer und das Gerät Sektorgröße zu tun haben. Finden Sie unter der Funktionsverweis in der Dokumentation für die Funktion "CreateFile" für Weitere Informationen zur Verwendung dieses Flag ordnungsgemäß.

Reale Ergebnisse

Im folgenden werden einige Testergebnisse aus dem Beispielcode. Das Ausmaß der Thenumbers ist hier ohne Bedeutung und von Computer zu Computer variieren, aber die Beziehung zwischen den Zahlen miteinander verglichene beleuchtet vorstehenden Auswirkungen der Flags auf die Leistung.

Sie können erwarten, Ergebnisse ähnlich den folgenden angezeigt:
  • 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.						
    Dieser Test zeigt, dass die oben erwähnte Anwendung 500 e/a-Anforderungen schnell ausgestellt und viel Zeit hatte für andere arbeiten oder mehr Anforderungen ausgeben.
  • 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.						
    Dieser Test zeigt, dass dieses Programm 4.495880 Sekunden ReadFile, um seine Vorgänge ausführen aufrufen, während der Test 1 nur 0.224264 Sekunden zum Ausstellen von denselben Anforderungen ausgegeben, die. In test 2, es gab keine Zeit "extra" für das Programm Hintergrund arbeiten.
  • Test 3
    Asynchronous, buffered I/O: asynchio /f*.dat   Operations completed in the order issued.   500 requests issued and completed in 0.251670 seconds.						
    Dieser Test wird die synchrone Art des Caches veranschaulicht. Alle Lesevorgänge wurden ausgegeben und in 0.251670 Sekunden abgeschlossen. Anders gesagt wurden asynchrone Anforderungen synchron abgeschlossen wurde. Dieser Test wird wenn Daten im Cache sind auch hohe Performance der Cache-Manager veranschaulicht.
  • Test 4
    Synchronous, buffered I/O: asynchio /f*.dat /s   Operations completed in the order issued.   500 requests and completed in 0.217011 seconds.						
    Dieser Test wird die gleichen Ergebnisse wie bei Test 3 veranschaulicht. Beachten Sie, dass ein wenig schneller als asynchrone Lesevorgänge führen Sie synchrone Lesevorgänge aus dem Cache aus dem Cache. Dieser Test wird wenn Daten im Cache sind auch hohe Performance der Cache-Manager veranschaulicht.

ABSCHLUSS

Sie können entscheiden, welche Methode am besten ist, da alles hängt von der Art, Größe und Anzahl der Vorgänge, die das Programm ausführt.

Der Standard-Dateizugriff ohne spezielle Attribute auf einen Vorgang synchron und zwischengespeicherten CreateFileis.

Hinweis: Sie führen Sie einige Automatisches asynchrones Verhalten in diesem Modus erhalten, weil der Dateisystemtreiber predictive asynchrones Read-ahead und asynchrones verzögertes Schreiben von geänderten Daten enthält. Obwohl dies nicht die Anwendung e/a asynchrone machen, ist es der Idealfall für die meisten einfachen Anwendungen.

Wenn auf der anderen Seite die Anwendung nicht einfach ist, müssen Sie contentirgendwie Profilerstellung und Leistungsüberwachung, um die beste Methode, ähnlich wie die weiter oben in diesem Artikel dargestellten Tests zu bestimmen. TheReadFile aufgewendete Zeit Profilerstellung oder WriteFile-Funktion und anschließender Vergleich dieser Zeit, wie lange es Takesfor aktuelle e/a-Vorgänge abgeschlossen ist äußerst nützlich. Wenn die-schwere verbrachte Zeit, bei der Ausstellung tatsächlich die e/a, und klicken Sie dann auf die e/a Beingcompleted synchron ist. Die aufgewendete Zeit ausstellenden e/a-Anforderungen Isrelatively klein verglichen mit der Zeitaufwand für die e/a-Vorgänge amsterdambegonnenen und Ihre Vorgänge asynchron behandelt werden. Die weiter oben in diesem Artikel erwähnten Samplecode verwendet QueryPerformanceCounter-Funktion für die Profilerstellung für Owninternal.

Performance-Überwachung können bestimmen, wie effizient Ihre Anwendung Isusing der Datenträger und der Cache. Verfolgen alle Leistungsindikatoren für das Cache-Objekt wird die Leistung des Cache-Managers angezeigt. Verfolgen von Leistungsindikatoren für die physischen Datenträger oder logische Diskobjects wird die Leistungsfähigkeit der Festplatte anzugeben.

Es gibt verschiedene Dienstprogramme, die bei der Leistungsüberwachung hilfreich sind. PerfMon und DiskPerf sind besonders nützlich. Für das System zum Sammeln von Daten auf die Leistungsfähigkeit der Festplatte müssen Sie zunächst den Befehl Diskperf -y ausgeben. Nachdem Sie den Befehl ausgeführt haben, müssen Sie das System zum Starten der Datensammlung starten.
Informationsquellen
Finden Sie auf der MSDN-Dokumentation Synchrone und asynchrone e/a für Weitere Informationen.

Asynczip ReadFile ReadFileEx WriteFile Kbdss Kbfile WriteFileEx GetOverlappedResult asynchrone synchrone überlappende nicht überlappend

Warnung: Dieser Artikel wurde automatisch übersetzt.

Eigenschaften

Artikelnummer: 156932 – Letzte Überarbeitung: 06/25/2015 21:31:00 – Revision: 7.0

Microsoft Win32 Application Programming Interface

  • kbapi kbfileio kbinfo kbkernbase kbmt KB156932 KbMtde
Feedback