Next:Proces
czyszczący schowekUp:Poprawa
wydajności systemu NFSPrevious:Struktura
schowka
Implementacja obsługi schowka
w przestrzeni jądra
Do jądra systemu dołożyłem moduł11
obsługujący schowek dyskowy. Komunikuje się on tylko z modułem NFS i procesem
oczyszczającym schowek. Umiejscowiene modułu schowka w przestrzeniu jądra
obrazuje rysunek 8.
|
Rysunek: Umiejscowienie modułu schowka w
przestrzeni jądra
Obsługa plików NFS w standardowym systemie Linux wymaga wywołania funkcji
z kolejnych trzech poziomów systemu operacyjnego. Funkcja read
jest najpierw obsługiwana w wirtualnej przestrzeni plików (VFS). Stąd wywoływane
są funkcje poziomu NFS, który z kolei korzysta z poziomu obsługującego
protokół RPC. Ostatecznie, przy wykorzystaniu RPC, następuje komunikacja
z serwerem, w wyniku której, system operacyjny otrzymuje żądane bloki danych.
Aby obsłużyć żądanie wykorzystując schowek, musi zostać przerwana komunikacja
między warstwami NFS i RPC. Przerwana zostaje systemowa funkcja nfs_readpage
po to by spróbować obsłużyć ją wykorzystując schowek. W momencie przerywania
funkcji nfs_readpage jesteśmy w jednym z trzech stanów:
-
plik, którego strony żąda nfs_readpage jest aktualny i można go
odczytać ze schowka;
-
plik, którego strony żąda nfs_readpage jest nieaktulany. W takim
przypadku kopia pliku w schowku jest oznaczona jako nieauktalna i schowek
nie zrealizuje żądania12
;
-
plik nie znajduje się w schowku.
Zastosowanie schowka nie spowoduje więc odwołania do nieaktualnych danych.
W przypadku nieznalezienia danych w lokalnym schowku, do serwera zostaje
wysłane żądanie przesłania danych do klienta. Aby otrzymane dane umieścić
w schowku, znów zostaje przerwana komunikacja między warstwą RPC a NFS.
Dane od serwera mogą być otrzymane synrchronicznie lub asynchronicznie.
W pierwszym przypadku trzeba przerwać wykonywanie funkcji nfs_readpage_sync,
w drugim funkcję
nfs_readpage_result, po to by umieścić w schowku
świeżo odczytaną stronę danych. Plik cacheInfo określa miękki
i twardy limit schowka. Jeżeli próba umieszczenie nowej strony w schowku
spowoduje:
-
przekroczenie miękkiego limitu, to jądro budzi proces cacheCleaner
i umieszcza stronę w schowku,
-
przekroczenie twardego limitu, to jądro budzi process cacheCleaner,
ale nie umieszcza nowej strony w schowku.
Po dołożeniu nowej strony do schowka, jądro zwiększa pozycję w pliku cacheInfo
określającą ilość danych w schowku.
Rysunek 10 przedstawia sekwencje operacji wykonanych po wywołaniu funkcji
read.
|
Rysunek: Sekwencja operacji wykonana po
wywołaniu funkcji read
Niewielkiej modyfikacji ulegają struktury jądra. Do i-węzła opisującego
zdalny pliku systemu NFS, dodano wskaźnik wskazujący na strukture file
pliku znajdującego się w schowku. Dzięki temu mając i-węzeł zdalnego pliku
szybko dostajemy się do odpowiadającego mu pliku w schowku. Do struktury
super_block
systemu NFS dodano trzy pozycje: nazwę katalogu określającego położenie
schowka, wskaźnik do struktury file pliku cacheInfo i
wskaźnik do structury
file pliku nfsCacheFull. Powyższe
modyfikacje są zgodne ze standardem systmu Linux, gdyż zmieniają te części
struktór, z których korzystają tylko i wyłącznie funkcje systemu NFS.
Next:Proces
czyszczący schowekUp:Poprawa
wydajności systemu NFSPrevious:Struktura
schowka
root
2000-08-18