Il existe des pages dispersées sur le Web qui décrivent les installations POSIX AIO avec plus ou moins de détails. Aucun d'entre eux n'est terriblement récent. On ne sait pas exactement ce qu'ils décrivent. Par exemple, le site Web "officiel" (?) Pour la prise en charge des E / S asynchrones du noyau Linux indique ici que les sockets ne fonctionnent pas, mais les pages de manuel "aio.h" sur ma station de travail Ubuntu 8.04.1 semblent toutes impliquer que cela fonctionne pour les descripteurs de fichiers arbitraires. Ensuite, il y a un autre projet qui semble fonctionner au niveau de la couche bibliothèque avec encore moins de documentation.
J'aimerais savoir:
- À quoi sert POSIX AIO? Étant donné que l'exemple le plus évident d'implémentation que je puisse trouver dit qu'il ne prend pas en charge les sockets, tout cela me semble bizarre. Est-ce uniquement pour les E / S de disque asynchrones? Si oui, pourquoi l'API hyper-générale? Sinon, pourquoi les E / S disque sont-elles la première chose qui a été attaquée?
- Où puis-je consulter des exemples de programmes POSIX AIO complets ?
- Quelqu'un l'utilise-t-il réellement, pour de vrai?
- Quelles plates-formes prennent en charge POSIX AIO? Quelles parties soutiennent-ils? Quelqu'un prend-il vraiment en charge le "Any I / O to any FD" implicite qui
<aio.h>
semble promettre?
Les autres mécanismes de multiplexage dont je dispose sont parfaitement bons, mais les fragments aléatoires d'informations qui flottent là-bas m'ont rendu curieux.
Effectuer efficacement les E / S de socket a été résolu avec kqueue, epoll, les ports d'achèvement d'E / S et autres. Faire des E / S de fichiers asynchrones est une sorte de retard (à part les E / S superposées de Windows et le support précoce de Solaris pour posix AIO).
Si vous recherchez des E / S de socket, vous feriez probablement mieux d'utiliser l'un des mécanismes ci-dessus.
L'objectif principal d'AIO est donc de résoudre le problème des E / S de disque asynchrones. C'est très probablement pourquoi Mac OS X ne prend en charge AIO que pour les fichiers normaux, et non les sockets (puisque kqueue le fait tellement mieux de toute façon).
Les opérations d'écriture sont généralement mises en cache par le noyau et supprimées ultérieurement. Par exemple, lorsque la tête de lecture du lecteur passe par l'emplacement où le bloc doit être écrit.
Cependant, pour les opérations de lecture, si vous voulez que le noyau priorise et ordonne vos lectures, AIO est vraiment la seule option. Voici pourquoi le noyau peut (théoriquement) faire cela mieux que n'importe quelle application de niveau utilisateur:
Cela dit, posix AIO a une interface assez maladroite, par exemple:
En ce qui concerne les applications réelles utilisant posix AIO, vous pouvez jeter un œil à lighttpd (lighty), qui a également publié une mesure des performances lors de l'introduction du support.
La plupart des plates-formes posix prennent désormais en charge posix AIO (Linux, BSD, Solaris, AIX, tru64). Windows le prend en charge via ses E / S de fichiers superposées. Je crois comprendre que seuls Solaris, Windows et Linux prennent vraiment en charge l'async. E / S de fichier jusqu'au pilote, tandis que les autres systèmes d'exploitation émulent l'async. E / S avec les threads du noyau. Linux étant l'exception, son implémentation AIO posix dans la glibc émule les opérations asynchrones avec des threads de niveau utilisateur, alors que son interface d'E / S asynchrone native (io_submit () etc.) est vraiment asynchrone jusqu'au pilote, en supposant que le pilote le supporte .
Je pense qu'il est assez courant parmi les systèmes d'exploitation de ne pas prendre en charge posix AIO pour aucun fd, mais de le limiter aux fichiers normaux.
la source
Un développeur de libtorrent fournit un rapport à ce sujet: http://blog.libtorrent.org/2012/10/asynchronous-disk-io/
la source
Il y a aio_write - implémenté dans la glibc; Le premier appel de la fonction aio_read ou aio_write engendre un certain nombre de threads en mode utilisateur, aio_write ou aio_read post demandes à ce thread, le thread pread / pwrite et quand il est terminé, la réponse est renvoyée au thread appelant bloqué.
Il y a aussi 'vrai' aio - supporté par le niveau du noyau (besoin de libaio pour cela, voir l'appel io_submit http://linux.die.net/man/2/io_submit ); ont également besoin de O_DIRECT pour cela (peut également ne pas être pris en charge par tous les systèmes de fichiers, mais les principaux le prennent en charge)
vois ici:
http://lse.sourceforge.net/io/aio.html
http://linux.die.net/man/2/io_submit
Différence entre POSIX AIO et libaio sous Linux?
la source
aio_write
sont couvertes ci-dessus, dans stackoverflow.com/a/5307557/13564