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

(rysunek)


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

  1. Pliki zrodlowe Linuxa:


Autor: Andrzej Dorf