Czytanie z wyprzedzeniem

 

Nie jest realizowane na poziomie buforów, tak jak to było w starszych jądrach (2.2).

Dla wszystkich systemów plików, które mogą używać pamięci podręcznej stron (page cache) jest ono zaimplementowane poprzez dostarczenie standardowej funkcji czytania pliku - generic_file_read (mm/filemap.c).
(A więc czytać z wyprzedzeniem można tylko plik.)

Funkcja ta jest wykorzystywana przez prawie wszystkie systemy plików - zazwyczaj jest to po prostu ich funkcja czytania pliku (file->file_operations->read() np. w ext2, ext3, reiserfs, jfs, ~fat, minix, ~nfs! etc.).

Czytanie pliku nie odbywa się bezpośrednio poprzez bufory, ale poprzez pamięć podręczną stron (alokuje, wyszukuje, czyta i zapisuje się strony - chociaż czytanie stron wykorzystuje zazwyczaj bread'a).

Poza tym czytanie z wyprzedzeniem jest bardziej sparametryzowane - np. można okreslić maksymalną ilość czytanych sektorów dla każdego urządzenia (read_ahead[dev]).

Funkcja czytania pliku wygląda mniej więcej tak:

Zawsze czyta się od następnej, po do tej pory przeczytanych stronach lub czyta się tylko strony bieżącego żądania (czasem +1).

Jeśli kolejny odczyt z pliku nie mieści się w oknie przeczytanych naprzód stron, to przy kolejnym odczycie z wyprzedzeniem odczytana zostanie tylko jedna strona. Przy każdym odczycie podwaja się ilość czytanych stron, aż do maksimum określonego dla urządzenia.

Jeśli kolejne odczyty pliku trafiają w okna stron przeczytanych z wyprzedzeniem to znaczy, że jest on czytany wystarczająco sekwencyjnie i wtedy rzeczywiście czyta się coraz więcej stron naprzód.

Strony przed bieżącą pozycją odczytu zostają porzucone (zdezaktywowane - nie są wyrzucane z pamięci, tylko przenoszone na odpowiednią listę).

Taka heurystyka ma zapobiec czytaniu z wyprzedzeniem plików, które nie są czytane sekwencyjnie.

Czytanie z wyprzedeniem będzie pewnie przeniesione jeszcze gdzie indziej - będzie metodą struktury vma, tak aby stosować podobną technikę przy mmap'owaniu pliku (według komentarza w kodzie...).

Są też inne standardowe funkcje - wykorzystywane przez wiele systemów plików - np. generic_file_write, generic_file_mmap etc..

 

 


wersja jądra: 2.4.7
autor: Wojciech Ruszczewski

 

Mechanizm buforowania