Existem páginas espalhadas pela web que descrevem os recursos do POSIX AIO em vários detalhes. Nenhum deles é terrivelmente recente. Não está claro o que exatamente eles estão descrevendo. Por exemplo, o site "oficial" (?) Para suporte de I / O assíncrono do kernel Linux aqui diz que os soquetes não funcionam, mas as páginas de manual "aio.h" em minha estação de trabalho Ubuntu 8.04.1 parecem sugerir que ele funciona para descritores de arquivo arbitrários. Depois, há outro projeto que parece funcionar na camada da biblioteca com ainda menos documentação.
Eu gostaria de saber:
- Qual é o objetivo do POSIX AIO? Dado que o exemplo mais óbvio de uma implementação que posso encontrar diz que ela não oferece suporte a soquetes, a coisa toda parece estranha para mim. É apenas para E / S de disco assíncrono? Se sim, por que a API hipergeral? Se não, por que a E / S de disco foi a primeira coisa a ser atacada?
- Onde há exemplos de programas POSIX AIO completos que posso ver?
- Alguém realmente usa isso, de verdade?
- Quais plataformas suportam POSIX AIO? Que partes eles apóiam? Alguém realmente apóia o implícito "Qualquer I / O para qualquer FD" que
<aio.h>
parece promissor?
Os outros mecanismos de multiplexação disponíveis para mim são perfeitamente bons, mas os fragmentos aleatórios de informação flutuando por aí me deixaram curioso.
Fazer E / S de soquete de forma eficiente foi resolvido com kqueue, epoll, portas de conclusão de IO e outros semelhantes. Fazer E / S de arquivo assíncrono é meio tardio (além da E / S sobreposta do Windows e do suporte inicial solaris para posix AIO).
Se você está procurando fazer socket I / O, provavelmente é melhor usar um dos mecanismos acima.
O principal objetivo do AIO é, portanto, resolver o problema de E / S de disco assíncrono. É mais provável que seja por isso que o Mac OS X suporta apenas AIO para arquivos regulares, e não soquetes (já que kqueue faz isso muito melhor de qualquer maneira).
As operações de gravação são normalmente armazenadas em cache pelo kernel e eliminadas posteriormente. Por exemplo, quando o cabeçote de leitura do drive passa pelo local onde o bloco deve ser escrito.
No entanto, para operações de leitura, se você deseja que o kernel priorize e ordene suas leituras, AIO é realmente a única opção. Aqui está porque o kernal pode (teoricamente) fazer isso melhor do que qualquer aplicativo de nível de usuário:
Dito isso, posix AIO tem uma interface bastante estranha, por exemplo:
Quanto à aplicação do mundo real usando posix AIO, você poderia dar uma olhada em lighttpd (lighty), que também postou uma medição de desempenho ao introduzir o suporte.
A maioria das plataformas posix suporta posix AIO agora (Linux, BSD, Solaris, AIX, tru64). O Windows oferece suporte por meio de E / S de arquivo sobreposto. Meu entendimento é que apenas Solaris, Windows e Linux realmente suportam assíncrono. arquivo de E / S até o driver, enquanto os outros sistemas operacionais emulam o assíncrono. E / S com threads de kernel. Linux sendo a exceção, sua implementação posix AIO em glibc emula operações assíncronas com threads de nível de usuário, enquanto sua interface de E / S assíncrona nativa (io_submit () etc.) é verdadeiramente assíncrona até o driver, assumindo que o driver suporte isso .
Acredito que seja bastante comum entre os sistemas operacionais não suportar posix AIO para qualquer fd, mas restringi-lo a arquivos regulares.
fonte
Um desenvolvedor libtorrent fornece um relatório sobre isso: http://blog.libtorrent.org/2012/10/asynchronous-disk-io/
fonte
Existe aio_write - implementado em glibc; a primeira chamada da função aio_read ou aio_write gera uma série de threads de modo de usuário, aio_write ou aio_read post solicitações para essa thread, a thread faz pread / pwrite e quando termina a resposta é postada de volta para a thread de chamada bloqueada.
Também é 'real' aio - suportado pelo nível do kernel (precisa do libaio para isso, veja a chamada io_submit http://linux.die.net/man/2/io_submit ); também precisa de O_DIRECT para isso (também pode não ser suportado por todos os sistemas de arquivos, mas os principais suportam)
Veja aqui:
http://lse.sourceforge.net/io/aio.html
http://linux.die.net/man/2/io_submit
Diferença entre POSIX AIO e libaio no Linux?
fonte
aio_write
são abordadas acima, em stackoverflow.com/a/5307557/13564