Przykładowa implementacja
Pamięć podręczna klienta
Pamięć podręczną klienta stosuje się w celu zmniejszenia liczby żądań
dla serwera. Moduł klienta cache'uje wyniki najważniejszych operacji, czyli
read, write, getattr, lookup oraz
readdir. Wykonywane przez klienta operacje pisania nie powodują
natychmiastowego uaktualnienia kopii plików przechowywanych w pamięciach
podręcznych innych klientów, co prowadzi do problemu niespójności tych
pamięci. Aby zminimalizować takie niespójności, do oznaczenia ważności bloków
w pamięciach podręcznych stosuje się przy każdym ich użyciu metodę opartą
na znacznikach czasu. Ładując do pamięci podręcznej blok z pliku, klient
zapamiętuje w niej także stempel czasowy wskazujący czas ostatniej modyfikacji
tego pliku na serwerze. Kontrola ważności wszystkich bloków z pamięci
podręcznej odbywa się poprzez żądanie podania przez serwer czasu ostatniej
modyfikacji i porównanie go z zapamiętaną wartością stempla. Jeśli ten czas
jest nowszy, to wszystkie dane z pamięci podręcznej zostaną unieważnione
i przy następnych żądaniach muszą być sprowadzone z serwera.
Kontrola ważności odbywa się przy każdym otwarciu pliku oraz żądaniu
sprowadzenia bloku z serwera. Po sprawdzeniu ważności zakłada się, że bloki
przechowywane w pamięci podręcznej są ważne przez pewien (ustalony podczas
montowania) czas. Sensowne wartości to 3 sekundy dla plików i 30
-- dla katalogów.
Trochę inaczej są obsługiwane operacje pisania. Zapisywaną w cache'u stronę
oznacza się jako zmienioną (z ang. dirty) i kieruje asynchronicznie
do wysłania do serwera. Wysyłanie takich stron do serwera odbywa się
podczas zamykania pliku lub gdy klient wywoła operację sync.
Realizacja czytania z wyprzedzeniem oraz opóźnionego zapisywania odbywa
się poprzez użycie pewnych asynchronicznych operacji. W implementacjach
klienta NFS działających w środowisku Linuksowym osiąga się to dzięki
wykorzystaniu tzw. biodemonów (z ang.
block input-output daemon).
Biodemon jest powiadamiany po każdym żądaniu czytania i przesyła do serwera
żądanie transmisji do pamięci podręcznej klienta następnego bloku
-- czytanie z wyprzedzeniem. W przypadku pisania biodemon wysyła blok
do serwera po każdym zapełnieniu go przez proces działający na maszynie
klienta. Ciekawostką jest, że bloki katalogów są przesyłane po każdej
modyfikacji.
Konrad Iwanicki, 2002