Quel est le statut de POSIX asynchronous I/O (AIO)?
Il y a des pages dispersée à travers le web qui décrivent POSIX AIO installations dans des quantités variables de détail. Aucun d'entre eux sont terriblement récente. Il n'est pas clair ce qui, exactement, ils les décrivent. Par exemple, le "officielle" (?) site web pour le noyau Linux asynchronous I/O support ici dit que les sockets ne fonctionnent pas, mais le "aio.h" les pages de manuel sur mon Ubuntu 8.04.1 poste de travail tous semblent indiquer qu'il fonctionne pour arbitraire des descripteurs de fichiers. Ensuite, il y a un autre projet qui semble fonctionner à la bibliothèque de la couche avec encore moins de la documentation.
Je voudrais savoir:
- Quel est le but de POSIX AIO? Étant donné que l'exemple le plus évident de la mise en œuvre, je peux trouver, dit-il ne supporte pas les sockets, tout cela semble bizarre pour moi. Est-il juste pour async disk I/O? Si oui, pourquoi l'hyper-général de l'API? Si non, pourquoi est-disk I/O, la première chose qui les a attaqués?
- Où sont il par exemple complète POSIX AIO programmes que je peux regarder?
- Personne ne l'utilisent vraiment, pour de vrai?
- Ce que les plates-formes de soutien POSIX AIO? Quelles parties prennent-ils en charge? Peut-on vraiment soutenir l'implicite "I/O pour tout FD" que
<aio.h>
semble promettre?
Les autres mécanismes de multiplexage qui s'offrent à moi sont très bonnes, mais l'aléatoire des fragments d'information flottant autour de là-bas ont m'a rendu curieux.
Vous devez vous connecter pour publier un commentaire.
Réseau I/O n'est pas une priorité pour AIO parce que tout le monde écrit POSIX serveurs de réseau utilise un événement, non-blocage de l'approche. L'ancien style Java "des milliards de blocage des threads" approche suce terriblement.
D'écriture sur le disque I/O est déjà amortie et de lecture du disque I/O peuvent être prefetched en mémoire tampon à l'aide des fonctions comme posix_fadvise. Qui laisse directe, sans mémoire tampon e/S de disque que la seule utilité de l'AIO.
Direct, sans tampon d'e/S n'est vraiment utile pour les bases de données transactionnelles, et ceux qui ont tendance à écrire leurs propres threads ou processus pour gérer leur e/s de disque
Ainsi, à la fin, qui laisse POSIX AIO dans la position de ne pas servir tout à des fins utiles. Ne l'utilisez pas.
Faire socket d'e/S de manière efficace a été résolu avec kqueue, epoll, IO ports d'achèvement et l'aime. Faire asynchrone fichier I/O est une sorte de fin de comer (à l'exception de windows overlapped I/O et solaris d'aide précoce posix AIO).
Si vous êtes à la recherche pour faire de la socket d'e/S, vous êtes probablement mieux d'utiliser un des mécanismes ci-dessus.
Le but principal de l'AIO est donc pour résoudre le problème de disque asynchrone I/O. C'est probablement pourquoi Mac OS X ne supporte AIO pour les fichiers réguliers, et pas de prises de courant (depuis kqueue n'est que tant mieux de toute façon).
Les opérations d'écriture sont mis en cache par le noyau et rincer à une date ultérieure. Par exemple, lorsque la tête de lecture du lecteur qui arrive à passer par l'endroit où le bloc est d'être écrite.
Toutefois, pour les opérations de lecture, si vous souhaitez que le noyau de hiérarchiser les priorités et l'ordre de votre lit, AIO est vraiment la seule option. Voici pourquoi le kernel peut (théoriquement) de le faire mieux que n'importe quel niveau de l'utilisateur de l'application:
Cela dit, posix AIO est assez maladroit de l'interface, par exemple:
Que pour les applications du monde réel à l'aide de posix AIO, vous pouvez prendre un coup d'oeil à lighttpd (lighty), qui a également posté une la mesure de la performance lors de l'introduction de soutien.
Plus posix prend en charge les plates-formes posix AIO maintenant (Linux, BSD, Solaris, AIX, tru64). Windows prend en charge via son superposées fichier I/O. Ma compréhension est que seulement Solaris, Windows et Linux supporte vraiment asynchrone. fichier I/O tout le chemin vers le pilote, tandis que les autres Systèmes d'exploitation émuler la async. I/O avec les threads du noyau. Linux étant l'exception, son posix AIO mise en œuvre dans la glibc, émule des opérations asynchrones avec des threads de niveau utilisateur, alors que son natif async interface I/O (io_submit (), etc.) sont vraiment asynchrone tout le chemin vers le pilote, en supposant que le pilote prend en charge.
Je crois que c'est assez commun parmi les Systèmes d'exploitation ne prennent pas en charge la norme posix AIO pour tout fd, mais de le restreindre à des fichiers normaux.
The only efficient and well supported mean of event callbacks are via signals
encore vrai aujourd'hui? Je suis readling posix aio et trouvé paraio_return
on peut facilement obtenir le statut. Pouvez-vous expliquer? merciaio_return()
une fois un iocb complète. Ce que je faisait allusion était notifié de son achèvement. Vous pouvez interrogeraio_return
, mais il ne va pas à l'échelle très bien. Je n'ai pas vraiment regardé l'état de l'aio ces derniers temps, donc je ne sais pas si c'est beaucoup amélioré. C'est principalement MacOS qui a le soutien des pauvres, où les signaux sont votre seule option, sans aucun indice sur ce qui iocb terminé.preadv()
etpwritev()
appels. master dispose d'un pool de threads avec les lectures et les écritures contre les fichiers mappés en mémoire. Compte tenu de l'endroit où le stockage est en cours, je pense memory mapped I/O est l'avenir. Il est synchrone si, donc, vous avez encore besoin d'un pool de threads.Un libtorrent développeur fournit un rapport sur ce: http://blog.libtorrent.org/2012/10/asynchronous-disk-io/
Il est aio_write mises en œuvre dans la glibc; premier appel de la aio_read ou aio_write fonction génère un nombre d'utilisateur en mode threads, aio_write ou aio_read requêtes post de ce thread, le thread ne pread/pwrite et quand c'est fini, la réponse est affecté à l'bloqué thread appelant.
Il est aussi "vrai" aio - pris en charge par le noyau (besoin libaio pour cela, consultez la io_submit appel http://linux.die.net/man/2/io_submit ); également besoin O_DIRECT pour que (peut aussi ne pas être pris en charge par tous les systèmes de fichiers, mais les plus importants ne le supportent)
voir ici:
http://lse.sourceforge.net/io/aio.html
http://linux.die.net/man/2/io_submit
Différence entre POSIX AIO et libaio sur Linux?
aio_write
sont couverts ci-dessus, dans le stackoverflow.com/a/5307557/13564