Do spisu tresci tematu 5
5.3.3 Struktura zwyklego pliku
Uzytkownik widzi plik jako ciagly strumien bajtow o okreslonej dlugosci.
Gdyby plik na dysku mial rowniez strukture ciagla, tzn. zajmowal nastepujace
po sobie bloki, dostep do wszystkich bajtow pliku bylby bardzo prosty:
w i-wezle wystarczyloby pamietac adres poczatku pliku i jego dlugosc.
Jednak system operacyjny musi uwzglednic mozliwosc dynamicznych zmian
rozmiaru pliku. Wspomniana wyzej strtegia nie pozwala na taka elastycznosc
systemu plikow lub powoduje duza fragmentacje wolnego miejsca na dysku,
jest wiec niedopuszczalna. Jadro pozwala na rozproszenie blokow pliku
na dysku. Ten sposob przydzialu miejsca na dysku komplikuje zadanie
lokalizacji danych. Utrzymywanie liniowej listy blokow skladajacych sie
na plik byloby zlym rozwiazaniem - nalezaloby narzucic duze ograniczenie na
rozmiar pliku badz dopuszczac i-wezly o zmiennej wielkosci. Rowniez obsluga
liniowej listy blokow bylaby bardzo nieefektywna.
W Linuxie (i ogolnie w Unixie) przyjeto nastepujace rozwiazanie.
W i-wezle przechowuje sie niewielka tablice(kilkanascie pozycji) numerow
blokow skladajacych sie na plik. Istota pomyslu jest wyroznienie czterech
typow adresow przechowywanych w tej tablicy:
- bezposredni
- jest to adres bloku z danymi
- pojedynczy posredni
- jest to adres bloku, ktory zawiera liste adresow bezposrednich
- podwojny posredni
- jest to adres bloku, ktory zawiera liste adresow blokow pojedynczych
posrednich
- potrojny posredni
- jest to adres bloku, ktory zawiera liste adresow blokow podwojnych
posrednich
Mozliwe byloby stosowanie blokow poczwornych posrednich, it.d., ale
powyzsza struktura w praktyce wystarcza (pozwala zaadresowac ponad 16GB).
Niektore numery blokow moga byc rowne zero. Oznacza to, ze
na pewnej przestrzeni pliku nie zostalo nic zapisane (sytuacja taka
jest mozliwa dzieki funkcji lseek).
W systemie plikow ext2 tablica z adresami w i-wezle ma nazwe:
i_block
- (w przypadku struktury i-wezla na dysku)
i_data
- (w przypadku struktury i-wezla w pamieci)
Tablica ta ma (w systemie ext2) rozmiar rowny 15. Jest w niej 12 pozycji
z adresami blokow bezposrednich i po jednej pozycji dla bloku pojedynczego,
podwojnego i potrojnego posredniego.
W pliku include/linux/ext2_fs.h
zdefinowane sa odpowiednie stale:
#define EXT2_NDIR_BLOCKS 12
#define EXT2_IND_BLOCK EXT2_NDIR_BLOCKS
#define EXT2_DIND_BLOCK (EXT2_IND_BLOCK + 1)
#define EXT2_TIND_BLOCK (EXT2_DIND_BLOCK + 1)
#define EXT2_N_BLOCKS (EXT2_TIND_BLOCK + 1)
Bibliografia
- Pliki zrodlowe Linuxa:
Autor: Andrzej Dorf