Przykład
ilustrujący działanie pamięci podręcznej dla i-węzłów.
W systemie Linux istnieją dwa rodzaje pamięci podręcznej
związane z i-węzłami.
Pierwszy (directory cache) służy do powiązania nazw w katalogach z
numerami i-węzłów im odpowiadającymi , drugi (inode cache) utrzymuje w
pamięci ostatnio używane i-węzły aby przyspieszyć przyszłe odwołania do
nich .
-
Implementacja pamięci podręcznej dla katalogów znajduje się w pliku fs/dcache.c
.
Numery i-węzłów dla zawartości katalogów o nazwach krótszych niż 15
znaków są umieszczone w tablicy mieszającej.
-
Pamięć podręczna dla i-węzłów nie jest w żaden szczególny sposób zaimplementowana.
Jej istnienie wynika z faktu opóźniania zapisu danych z i-węzła na dysk
i usuwania i-węzła z tablicy mieszającej aktywnych i-węzłów do czasu, gdy
zacznie brakować nowych . Sczegóły w pliku fs/inode.c
.
Aby docenić znaczenie tego rodzaju pamięci podręczych wystarczy usunąć
je z jądra (wymaga to drobnych modyfikacji wyżej wymienionych plików) i
zobaczyć, co się będzie działo.
W zasadzie nie potrzeba wykonywać żadnych specjalnych testów, żeby
doświadczyć zauważalnego opóźnienia operacji dostępu do plików i
katalogów. Wystarczy uważnie wsłuchiwać się w pracę dysku.
Jako wymowny przykład niech służy poniższa tabelka, w której zamieszczono
czasy kompilacji jądra (2.0.32 z podstawowymi możliwościami) na normalnym
i zmodyfikowanym systemie, na komputerze P166 48MB RAM, dla dysków
o różnych parametrach :
Dysk (tryb pracy)
|
system oryginalny
|
system po modyfikacji
|
PIO 4 /256kB cache
|
7 min. 12 sek.
|
19 min. 23 sek.
|
PIO 3 /120kB cache
|
7 min. 12 sek.
|
29 min. 12 sek.
|
Jak widać bardzo niewinna modyfikacja powoduje bardzo znaczne (3 - 4
krotne) spowolnienie dzialania, a przecież eksperyment ten nie korzystał
zbyt intensywnie z faktu przechowywania (lub nie) i-węzłów w pamięci
na przyszły użytek.
Zadanie
-
Usunąć pamięć podręczną dla katalogów, modyfikując plik fs/dcache.c
.
UWAGA: Nie chodzi o usuwanie struktur danych itp. , a
jedynie wprowadzenie zmian, które spowodują , że system nie będzie z nich
korzystał (we właściwy sposób).
-
Usunąć pamięć podręczną dla i-węzłów modyfikując plik fs/inode.c
.
Dokładniej: należy spowodować, by jądro nie utrzymywało informacji
o i-węzłach, których nikt aktualnie nie używa.
Wskazówka: Zapoznać się dokładnie z funkcjami : iput(),
__iget(),
get_empty_inode(),
clear_inode().
OSTRZEŻENIE: Dobrze się zastanów, zanim przejdziesz do punktu
3.
-
Zrekompilować tak powstałe jądro i obserwować zmiany.
Bartłomiej Starosta