2015-07-03 13 views
6

Próbuję dowiedzieć się, czy mmap "ing pliku, a następnie przy użyciu madvise() lub posix_madvise() z MADV_WILLNEED/POSIX_MADV_WILLNEED faktycznie wyzwala asynchroniczne I/O tła do odczytu z wyprzedzeniem. Numer man pages for madvise nie określa, czy tak jest - faktyczne zachowanie madvise pozostaje w większości niejasne, aby umożliwić elastyczność implementacji.Czy mmap + madvise jest formą asynchronicznego wejścia/wyjścia?

Ale czy aktualna główna implementacja POSIX (np. Linux) faktycznie wykonuje operacje wejścia/wyjścia pliku asynchronicznego po wywołaniu madvise() z MADV_WILLNEED? Nie mogę uzyskać żadnych wiarygodnych informacji na ten temat. This question sugeruje, że tak, przynajmniej na Linuksie, nawet jeśli nie jest idealny, ponieważ nie ma mechanizmu zwrotnego.

This book excerpt twierdzi, że posix_fadvise z POSIX_FADV_WILLNEED zrobi asynchronicznego odczytu z wyprzedzeniem, ale nie wspomina, czy madvise() robi asynchroniczny czytać dalej.

Co więcej, wydaje się, że cała koncepcja "we-wy" z wyprzedzeniem nie ma żadnego sensu, chyba że jest asynchroniczna. Jeśli był synchroniczny, po prostu tworzy blok aplikacji użytkownika do odczytu z wyprzedzeniem, zamiast później, kiedy faktycznie czyta plik, co nie wydaje się być szczególnie wydajną optymalizacją.

Czy zatem madvise() z MADV_WILLNEED faktycznie wykonuje asynchroniczne odczytanie z wyprzedzeniem na dowolnej platformie głównego nurtu (np. Linux)?

+0

W odpowiedzi na pytanie zadane w tytule, nie, nie wydaje mi się uzasadnione, aby scharakteryzować 'mmap()' + 'madvise()' jako formę asynchronicznych operacji we/wy, ponieważ jądro nie jest * zobowiązywał się * do zrobienia czegokolwiek w odpowiedzi na 'madvise()' wywołanie określające 'MADV_WILLNEED' (w przeciwieństwie do sytuacji, gdy poradą jest' MADV_DONTNEED'). Jeśli chodzi o to, czy jakikolwiek system faktycznie wykona asynchroniczny oddźwięk w jakichkolwiek okolicznościach, jestem skłonny przypuszczać, że niektórzy będą, ale nie mogę podać żadnych szczegółów. –

+0

Notatka z nitpickery: Nieblokujące funkcje synchroniczne nie blokują i nie są asynchroniczne, ale są zracjonalizowane, aby rozwiązać ten sam rodzaj problemów, co funkcje asynchroniczne. – Sebivor

Odpowiedz

0

Ogólnie, należy założyć, że funkcje m * nie wykonają asynchronicznego odczytywania.

0

Z Linuksem zawsze możesz sprawdzić kod źródłowy.

Zobacz fadvise.c:

case POSIX_FADV_WILLNEED: 
    ... 
    force_page_cache_readahead(mapping, f.file, start_index, 
        nrpages); 
    break; 

Więc posix_fadvise rozmowy force_page_cache_readahead wykonać readahead.

Teraz spójrzmy na madvise.c:

static long madvise_willneed(...) 
{ 
    ... 
    force_page_cache_readahead(file->f_mapping, file, start, end-start); 
    return 0; 
} 

Więc MADV_WILLNEED i POSIX_FADV_WILLNEED są równoważne pod Linuksem.

Czy można to nazwać asynchronicznym wejściem/wyjściem? Nie sądzę. Asynchroniczne IO zwykle oznacza, że ​​istnieje pewne powiadomienie, które pozwala na pobieranie danych. Doradztwo to tylko porada: nie tylko nie wiesz, kiedy dane są gotowe do odczytania, ale jeśli spóźnisz się, dane mogą już zostać wyrzucone.

Powiązane problemy