Asynchrones E/A-Subsystem
Synchrone Ein-/Ausgabe (E/A) tritt auf, während Sie warten. Die Anwendungsverarbeitung kann erst fortgesetzt werden, wenn die E/A-Operation abgeschlossen ist. Im Gegensatz dazu werden asynchrone Ein-/Ausgabe (AIO) -Operationen im Hintergrund ausgeführt und blockieren keine Benutzeranwendungen. Dies verbessert die Leistung, da E/A-Operationen und Anwendungsverarbeitung gleichzeitig ausgeführt werden können.
Viele Anwendungen, wie z. B. Datenbanken und Dateiserver, nutzen die Möglichkeit zur Überlappung von Verarbeitung und Ein-/Ausgabe. Diese AIO-Operationen verwenden verschiedene Arten von Geräten und Dateien. Außerdem können mehrere AIO-Operationen gleichzeitig auf einer oder mehreren Einheiten oder Dateien ausgeführt werden. Die Verwendung von AIO verbessert normalerweise den E/A-Durchsatz für diese Anwendungstypen. Die tatsächliche Leistung hängt jedoch teilweise von der Anzahl der gleichzeitigen E/A-Anforderungen ab, die die Anwendung gleichzeitig absetzen kann. Wenn der AIO-Direktaufruf nicht verwendet wird, hängt die Leistung auch davon ab, wie viele AIO-Serverprozesse ausgeführt werden, die die E/A-Anforderungen verarbeiten. Weitere Informationen zum Direktaufruf finden Sie unter Anzahl der derzeit verwendeten AIO-Server ermitteln.
Jede AIO-Anforderung verfügt über einen entsprechenden Steuerblock im Adressraum der Anwendung. Wenn eine AIO-Anforderung abgesetzt wird, wird eine Kennung im Steuerblock eingerichtet. Diese Kennung wird zum Abrufen des Status und der Rückgabewerte der Anforderung verwendet.
Anwendungen verwenden die Subroutinen Aio_Lesen und aio_schreiben , um die Ein-/Ausgabe auszuführen. Die Steuerung wird von der Subroutine an die Anwendung zurückgegeben, sobald die Anforderung in die Warteschlange gestellt wurde. Die Anwendung kann die Verarbeitung fortsetzen, während die Plattenoperation ausgeführt wird.
Ein Kernelprozess (kproc), der als AIO-Server (AIOS) bezeichnet wird, ist für jede Anforderung ab dem Zeitpunkt verantwortlich, zu dem sie aus der Warteschlange entnommen wird, bis sie abgeschlossen ist. Die Anzahl der Server begrenzt die Anzahl der Platten-E/A-Operationen, die gleichzeitig im System in Bearbeitung sein können.
Der Standardwert des optimierbaren Parameters Minserver ist 3 und der des optimierbaren Parameters Max. Server ist 30. In Systemen, die selten Anwendungen ausführen, die AIO verwenden, ist dies in der Regel angemessen. In Umgebungen mit vielen Plattenlaufwerken und Schlüsselanwendungen, die AIO verwenden, sind die Standardwerte möglicherweise zu niedrig. Das Ergebnis eines Servermangels ist, dass Platten-E/A viel langsamer scheint, als es sein sollte. Anforderungen verbringen nicht nur übermäßig lange Zeit in der Warteschlange, aber das niedrige Verhältnis von Servern zu Plattenlaufwerken bedeutet, dass die Suchoptimierungsalgorithmen zu wenige Anforderungen haben, mit denen für jedes Laufwerk gearbeitet werden kann.
Es gibt zwei AIO-Subsysteme. Die ursprüngliche AIX® -AIO, jetzt LEGACY AIO genannt, hat dieselben Funktionsnamen wie die mit Portable Operating System Interface (POSIX) kompatible POSIX -AIO. Die wichtigsten Unterschiede zwischen den beiden betreffen die unterschiedliche Parameterübergabe. Beide Subsysteme sind in der Datei /usr/include/sys/aio.h definiert. Mit dem Makro _AIO_AIX_SOURCE wird zwischen den beiden Versionen unterschieden.
#define _AIO_AIX_SOURCE
#include <sys/aio.h>
oder geben Sie bei der Kompilierung in der Befehlszeile Folgendes ein:
xlc ... -D_AIO_AIX_SOURCE ... classic_aio_program.c
Für jede AIO-Funktion gibt es eine traditionelle und eine POSIX -Definition. LEGACY AIO verfügt über eine zusätzliche Funktion aio_nwait , die zwar nicht Teil von POSIX -Definitionen ist, aber in POSIX AIO enthalten ist, um diejenigen zu unterstützen, die von LEGACY auf POSIX -Definitionen portieren möchten. POSIX AIO verfügt über eine zusätzliche aio_fsync -Funktion, die nicht in LEGACY AIO enthalten ist. Eine Liste dieser Funktionen finden Sie unter Asynchrone E/A-Subroutinen.