Ada halaman yang tersebar di seluruh web yang menjelaskan fasilitas POSIX AIO dalam jumlah detail yang bervariasi. Tak satu pun dari mereka yang sangat baru. Tidak jelas apa yang sebenarnya mereka gambarkan. Misalnya, situs web "resmi" (?) Untuk dukungan I / O asinkron kernel Linux di sini mengatakan bahwa soket tidak berfungsi, tetapi halaman manual "aio.h" di workstation Ubuntu 8.04.1 saya semuanya tampaknya menyiratkan bahwa itu bekerja untuk deskriptor file sewenang-wenang. Lalu ada proyek lain yang tampaknya bekerja di lapisan perpustakaan dengan lebih sedikit dokumentasi.
Saya ingin tahu:
- Apa tujuan POSIX AIO? Mengingat bahwa contoh implementasi yang paling jelas yang dapat saya temukan mengatakan itu tidak mendukung soket, semuanya tampak aneh bagi saya. Apakah ini hanya untuk I / O disk asinkron? Jika demikian, mengapa API hiper-umum? Jika tidak, mengapa disk I / O menjadi hal pertama yang diserang?
- Dimana ada contoh program POSIX AIO lengkap yang bisa saya lihat?
- Apakah ada yang benar-benar menggunakannya?
- Platform apa yang mendukung POSIX AIO? Bagian apa yang mereka dukung? Apakah ada yang benar-benar mendukung tersirat "Any I / O to any FD" yang
<aio.h>
tampaknya menjanjikan?
Mekanisme multiplexing lain yang tersedia untuk saya sangat bagus, tetapi pecahan informasi acak yang beredar di luar sana membuat saya penasaran.
Melakukan soket I / O secara efisien telah diselesaikan dengan kqueue, epoll, port penyelesaian IO dan sejenisnya. Melakukan asynchronous file I / O adalah semacam pendatang yang terlambat (selain dari Windows 'overlapped I / O dan solaris early support untuk posix AIO).
Jika Anda ingin melakukan soket I / O, Anda mungkin lebih baik menggunakan salah satu mekanisme di atas.
Oleh karena itu, tujuan utama AIO adalah untuk memecahkan masalah I / O disk asinkron. Ini kemungkinan besar mengapa Mac OS X hanya mendukung AIO untuk file biasa, dan bukan soket (karena kqueue melakukannya dengan jauh lebih baik).
Operasi tulis biasanya di-cache oleh kernel dan dihapus di lain waktu. Misalnya ketika kepala baca drive kebetulan melewati lokasi di mana blok itu akan ditulis.
Namun, untuk operasi baca, jika Anda ingin kernel memprioritaskan dan memesan bacaan Anda, AIO benar-benar satu-satunya pilihan. Inilah mengapa kernal dapat (secara teoritis) melakukannya lebih baik daripada aplikasi level pengguna mana pun:
Bisa dikatakan, posix AIO memiliki antarmuka yang cukup canggung, misalnya:
Sedangkan untuk aplikasi dunia nyata menggunakan posix AIO, Anda dapat melihat lighttpd (lighty), yang juga memposting pengukuran kinerja saat memperkenalkan dukungan.
Kebanyakan platform posix mendukung posix AIO sekarang (Linux, BSD, Solaris, AIX, tru64). Windows mendukungnya melalui file I / O yang tumpang tindih. Pemahaman saya adalah bahwa hanya Solaris, Windows dan Linux yang benar-benar mendukung async. file I / O sampai ke driver, sedangkan OS lain meniru async. I / O dengan utas kernel. Linux menjadi pengecualian, implementasi posix AIO-nya di glibc mengemulasi operasi asinkron dengan utas tingkat pengguna, sedangkan antarmuka I / O asinkron aslinya (io_submit () dll.) Benar-benar asinkron sampai ke driver, dengan asumsi driver mendukungnya .
Saya percaya itu cukup umum di antara OS untuk tidak mendukung posix AIO untuk fd apa pun, tetapi membatasinya ke file biasa.
sumber
Pengembang libtorrent memberikan laporan tentang ini: http://blog.libtorrent.org/2012/10/asynchronous-disk-io/
sumber
Ada aio_write - diimplementasikan di glibc; panggilan pertama dari fungsi aio_read atau aio_write memunculkan sejumlah utas mode pengguna, aio_write atau aio_read permintaan posting ke utas itu, utas melakukan pread / pwrite dan ketika selesai jawabannya dikirim kembali ke utas panggilan yang diblokir.
Ada juga aio 'nyata' - didukung oleh level kernel (perlu libaio untuk itu, lihat panggilan io_submit http://linux.die.net/man/2/io_submit ); juga membutuhkan O_DIRECT untuk itu (juga mungkin tidak didukung oleh semua sistem file, tetapi yang utama mendukungnya)
Lihat disini:
http://lse.sourceforge.net/io/aio.html
http://linux.die.net/man/2/io_submit
Perbedaan antara POSIX AIO dan libaio di Linux?
sumber
aio_write
yang tercakup di atas, di stackoverflow.com/a/5307557/13564