Network File System


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