Es gibt im Internet verstreute Seiten, die POSIX AIO-Funktionen in unterschiedlichen Details beschreiben. Keiner von ihnen ist schrecklich neu. Es ist nicht klar, was genau sie beschreiben. Auf der "offiziellen" (?) Website für die asynchrone E / A-Unterstützung des Linux-Kernels heißt es beispielsweise, dass Sockets nicht funktionieren, aber die "aio.h" -Handbuchseiten auf meiner Ubuntu 8.04.1-Workstation scheinen dies alle zu implizieren Es funktioniert für beliebige Dateideskriptoren. Dann gibt es noch ein anderes Projekt, das auf Bibliotheksebene mit noch weniger Dokumentation zu funktionieren scheint .
Ich würde gerne wissen:
- Was ist der Zweck von POSIX AIO? Angesichts der Tatsache, dass das offensichtlichste Beispiel für eine Implementierung, die ich finden kann, besagt, dass sie keine Sockets unterstützt, erscheint mir das Ganze seltsam. Ist es nur für asynchrone Festplatten-E / A? Wenn ja, warum die hyper-allgemeine API? Wenn nicht, warum wurde die Festplatten-E / A als erstes angegriffen?
- Wo gibt es beispielsweise vollständige POSIX AIO-Programme, die ich mir ansehen kann?
- Verwendet es tatsächlich jemand?
- Welche Plattformen unterstützen POSIX AIO? Welche Teile davon unterstützen sie? Unterstützt jemand wirklich das implizite "Any I / O to Any FD",
<aio.h>
das zu versprechen scheint?
Die anderen Multiplexing-Mechanismen, die mir zur Verfügung stehen, sind vollkommen gut, aber die zufälligen Informationsfragmente, die da draußen herumschwirren, haben mich neugierig gemacht.
Das effiziente Ausführen von Socket-E / A wurde mit Kqueue-, Epoll-, E / A-Abschlussports und dergleichen gelöst. Das Ausführen von asynchronen Datei-E / A ist eine Art Verspätung (abgesehen von der überlappenden E / A-Unterstützung von Windows und der frühen Unterstützung von Solaris für Posix AIO).
Wenn Sie Socket-E / A ausführen möchten, ist es wahrscheinlich besser, einen der oben genannten Mechanismen zu verwenden.
Der Hauptzweck von AIO besteht daher darin, das Problem der asynchronen Festplatten-E / A zu lösen. Dies ist höchstwahrscheinlich der Grund, warum Mac OS X AIO nur für reguläre Dateien und nicht für Sockets unterstützt (da kqueue das sowieso viel besser macht).
Schreibvorgänge werden normalerweise vom Kernel zwischengespeichert und zu einem späteren Zeitpunkt gelöscht. Zum Beispiel, wenn der Lesekopf des Laufwerks zufällig an der Stelle vorbeifährt, an der der Block geschrieben werden soll.
Für Lesevorgänge ist AIO jedoch die einzige Option, wenn der Kernel Ihre Lesevorgänge priorisieren und sortieren soll. Hier ist, warum der Kernal (theoretisch) das besser kann als jede Anwendung auf Benutzerebene:
Das heißt, posix AIO hat eine ziemlich umständliche Oberfläche, zum Beispiel:
Für reale Anwendungen mit posix AIO können Sie sich lighttpd (lighty) ansehen, das bei der Einführung der Unterstützung auch eine Leistungsmessung veröffentlicht hat.
Die meisten posix-Plattformen unterstützen derzeit posix AIO (Linux, BSD, Solaris, AIX, tru64). Windows unterstützt es über seine überlappenden Datei-E / A. Ich verstehe, dass nur Solaris, Windows und Linux Async wirklich unterstützen. Datei-E / A bis zum Treiber, während die anderen Betriebssysteme die asynchrone Funktion emulieren. E / A mit Kernel-Threads. Da Linux die Ausnahme darstellt, emuliert die Posix-AIO-Implementierung in glibc asynchrone Operationen mit Threads auf Benutzerebene, während die native asynchrone E / A-Schnittstelle (io_submit () usw.) bis zum Treiber wirklich asynchron ist, vorausgesetzt, der Treiber unterstützt sie .
Ich glaube, es ist unter Betriebssystemen ziemlich üblich, posix AIO für keine fd zu unterstützen, sondern es auf reguläre Dateien zu beschränken.
quelle
Ein Libtorrent-Entwickler liefert einen Bericht dazu: http://blog.libtorrent.org/2012/10/asynchronous-disk-io/
quelle
Es gibt aio_write - implementiert in glibc; Der erste Aufruf der Funktion aio_read oder aio_write erzeugt eine Reihe von Benutzermodus-Threads, aio_write- oder aio_read-Post-Anforderungen an diesen Thread. Der Thread führt pread / pwrite aus, und wenn er beendet ist, wird die Antwort an den blockierten aufrufenden Thread zurückgesendet.
Es gibt auch 'echtes' Aio - unterstützt von der Kernel-Ebene (brauche libaio dafür, siehe den io_submit-Aufruf http://linux.die.net/man/2/io_submit ); brauche dafür auch O_DIRECT (wird möglicherweise auch nicht von allen Dateisystemen unterstützt, aber die wichtigsten unterstützen es)
siehe hier:
http://lse.sourceforge.net/io/aio.html
http://linux.die.net/man/2/io_submit
Unterschied zwischen POSIX AIO und libaio unter Linux?
quelle
aio_write
sind oben in stackoverflow.com/a/5307557/13564