2012-01-07 7 views
41

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.

Odpowiedz

51

W systemie Linux dwie implementacje AIO są zasadniczo różne.

POSIX AIO to implementacja na poziomie użytkownika, która wykonuje normalne blokowanie we/wy w wielu wątkach, dając w ten sposób wrażenie, że wejścia/wyjścia są asynchroniczne. Głównym powodem tego jest, że:

  1. współpracuje z dowolnym systemem plików
  2. to działa (zasadniczo) na dowolnym systemie operacyjnym (należy pamiętać, że GNU libc jest przenośny)
  3. działa na plikach z buforowanie włączony (czyli nie zestaw flag O_DIRECT)

główną wadą jest to, że głębokość kolejki (czyli liczba zaległych operacji można mieć w praktyce) jest ograniczona przez liczbę wątków chcesz mieć, co również oznacza, że ​​powolna operacja na jednym dysku może zablokować działanie operacji na inny dysk. Wpływa także na to, które We/Wy (lub ile) jest postrzegane przez jądro i program planujący dyski.

Jądro AIO (tj. Io_submit() et.al.) obsługuje jądro dla asynchronicznych operacji we/wy, w których żądania io są faktycznie umieszczane w kolejce w jądrze, posortowane według dowolnego programu planującego dyski, prawdopodobnie niektóre z są one przekazywane (w nieco optymalnej kolejności, jak można by się spodziewać) do rzeczywistego dysku jako operacje asynchroniczne (przy użyciu TCQ lub NCQ). Głównym ograniczeniem tego podejścia jest to, że nie wszystkie systemy plików działają tak dobrze lub w ogóle z asynchronicznymi operacjami wejścia/wyjścia (i mogą się z powrotem do semantyki blokującej), pliki muszą być otwierane za pomocą O_DIRECT, które zawiera wiele innych ograniczeń Żądania we/wy. Jeśli nie uda ci się otworzyć plików za pomocą O_DIRECT, może to nadal działać, ponieważ otrzymujesz właściwe dane, ale prawdopodobnie nie jest to wykonywane asynchronicznie, ale powraca do blokowania semantyki.

Należy również pamiętać, że io_submit() może faktycznie zablokować dysk w pewnych okolicznościach.

+0

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

+1

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

+1

@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

Powiązane problemy