Co wydaje mi do zrozumienia:Różnica między POSIX AIO i libaio w systemie Linux?
POSIX AIO
API są prototypy w <aio.h>
i połączyć swój program z librt (-lrt), natomiast libaio
API w <libaio.h>
i Twój program jest związany z libaio (-laio).
Czego nie można dowiedzieć się:
1.Does jądro obsługiwać zarówno tych metod inaczej?
2.Czy potrzebna jest flaga O_DIRECT
do korzystania z którejkolwiek z nich?
Jak wspomniano w this post, libaio działa dobrze bez O_DIRECT
podczas korzystania libaio
.Okay, ale zrozumiałe:
Według System Linux Programowanie R.Love za książkę, Linux obsługuje aio (które zakładam jest POSIX AIO) na zwykłych plikach tylko, jeśli otwarty z O_DIRECT
. Ale mały program, który napisałem (przy użyciu aio.h, połączony z -lrt), który wywołuje aio_write
na pliku otwartym bez flagi O_DIRECT
działa bez problemów.
Dzięki za odpowiedź.Tak więc dla POSIX AIO, O_DIRECT jest * nie * obowiązkowe, ale dla Kerenel AIO jest to (aby upewnić się, że nie wystąpi żadna zmiana)? Wydaje się to sprzeczne z tym, co jest wspomniane w książce. W kodzie jądra VFS ma te aio_read/write funkcje, które są wywoływane (?) przez aio_read/write wywołania systemowe (które jest POXIS AIO, a nie AIO jądra). – itisravi
Nie ma aio_ * syscalls (http://linux.die.net/man/2/syscalls). Funkcje aio_ *, które widzisz w vfs, są prawdopodobnie częścią jądra aio. funkcje * poziomu użytkownika * aio_ * nie mapują 1: 1 na wywołania systemowe. – Arvid
@Arvid Czy mógłbyś wyjaśnić, w jakich okolicznościach blokuje się funkcja io_submit()? (wspomniałeś kiedyś, że może zablokować dysk). – ARH