W sieci są porozrzucane strony, które opisują obiekty POSIX AIO z różną ilością szczegółów. Żaden z nich nie jest strasznie świeży. Nie jest jasne, co dokładnie opisują. Na przykład „oficjalna” (?) Witryna internetowa dotycząca obsługi asynchronicznych operacji we / wy jądra Linuksa mówi, że gniazda nie działają, ale strony podręcznika „aio.h” na mojej stacji roboczej Ubuntu 8.04.1 wydają się sugerować, że działa dla dowolnych deskryptorów plików. Jest też inny projekt, który wydaje się działać w warstwie bibliotecznej z jeszcze mniejszą ilością dokumentacji.
Chciałbym wiedzieć:
- Jaki jest cel POSIX AIO? Biorąc pod uwagę, że najbardziej oczywisty przykład implementacji, jaki mogę znaleźć, mówi, że nie obsługuje ona gniazd, całość wydaje mi się dziwna. Czy to tylko dla asynchronicznego dysku we / wy? Jeśli tak, dlaczego hiper-ogólny interfejs API? Jeśli nie, dlaczego operacje we / wy dysku są pierwszą zaatakowaną rzeczą?
- Gdzie są przykłady kompletnych programów POSIX AIO, na które mogę spojrzeć?
- Czy ktoś naprawdę go używa?
- Jakie platformy obsługują POSIX AIO? Jakie części tego obsługują? Czy ktoś naprawdę popiera domniemane „Każde wejście / wyjście do dowolnego FD”, które
<aio.h>
wydaje się obiecać?
Inne dostępne mi mechanizmy multipleksowania są całkiem dobre, ale przypadkowe fragmenty informacji, które tam krążą, zaciekawiły mnie.
Wydajne wykonywanie operacji wejścia / wyjścia gniazda zostało rozwiązane za pomocą kqueue, epoll, portów zakończenia IO i podobnych. Wykonywanie asynchronicznych operacji wejścia / wyjścia pliku jest czymś w rodzaju późnego zjawiska (poza nakładającymi się operacjami wejścia / wyjścia systemu Windows i wczesnym wsparciem dla Posix AIO).
Jeśli szukasz wejścia / wyjścia gniazda, prawdopodobnie lepiej będzie, jeśli użyjesz jednego z powyższych mechanizmów.
Dlatego głównym celem AIO jest rozwiązanie problemu asynchronicznych operacji wejścia / wyjścia dysku. Najprawdopodobniej dlatego Mac OS X obsługuje AIO tylko dla zwykłych plików, a nie gniazd (ponieważ kqueue i tak robi to o wiele lepiej).
Operacje zapisu są zazwyczaj buforowane przez jądro i opróżniane w późniejszym czasie. Na przykład, gdy głowica odczytująca napędu przechodzi obok lokalizacji, w której ma zostać zapisany blok.
Jednak w przypadku operacji odczytu, jeśli chcesz, aby jądro ustalało priorytety i porządkowało odczyty, AIO jest naprawdę jedyną opcją. Oto dlaczego jądro może (teoretycznie) zrobić to lepiej niż jakakolwiek aplikacja na poziomie użytkownika:
To powiedziawszy, posix AIO ma dość niezręczny interfejs, na przykład:
Jeśli chodzi o rzeczywistą aplikację korzystającą z posix AIO, możesz rzucić okiem na lighttpd (lighty), który również opublikował pomiar wydajności podczas wprowadzania wsparcia.
Większość platform posix obsługuje już posix AIO (Linux, BSD, Solaris, AIX, tru64). Windows obsługuje to poprzez nakładające się pliki I / O. Rozumiem, że tylko Solaris, Windows i Linux naprawdę obsługują async. plik I / O aż do sterownika, podczas gdy inne systemy operacyjne emulują asynchroniczne. I / O z wątkami jądra. Linux jest wyjątkiem, jego implementacja Posix AIO w glibc emuluje operacje asynchroniczne z wątkami na poziomie użytkownika, podczas gdy jego natywny asynchroniczny interfejs I / O (io_submit () itp.) Jest naprawdę asynchroniczny aż do sterownika, zakładając, że sterownik go obsługuje .
Uważam, że dość powszechne wśród systemów operacyjnych jest nieobsługiwanie POSIX AIO dla żadnego fd, ale ograniczenie tego do zwykłych plików.
źródło
Programista libtorrent udostępnia raport na ten temat: http://blog.libtorrent.org/2012/10/asynchronous-disk-io/
źródło
Istnieje aio_write - zaimplementowany w glibc; pierwsze wywołanie funkcji aio_read lub aio_write generuje liczbę wątków trybu użytkownika, żądań postów aio_write lub aio_read do tego wątku, wątek wykonuje pread / pwrite, a po zakończeniu odpowiedź jest wysyłana z powrotem do zablokowanego wątku wywołującego.
Ther jest również 'prawdziwy' Aio - obsługiwany przez poziom jądra (do tego potrzebny jest libaio, zobacz wywołanie io_submit http://linux.die.net/man/2/io_submit ); do tego potrzebny jest również O_DIRECT (również może nie być obsługiwany przez wszystkie systemy plików, ale główne go obsługują)
Spójrz tutaj:
http://lse.sourceforge.net/io/aio.html
http://linux.die.net/man/2/io_submit
Różnica między POSIX AIO i libaio w systemie Linux?
źródło
aio_write
omówiono powyżej, na stackoverflow.com/a/5307557/13564