buf head (10)





5.2.1 Naglowki buforow






Do spisu tresci tematu 5

5.2.1 Naglowki buforow






Spis tresci


Wprowadzenie do buforow.

Co jest w tym naglowku?

Bibliografia

Pytania i odpowiedzi





Wprowadzenie do buforow

Bufory sa to struktury w pamieci jadra reprezentujace wybrane bloki
z urzadzen blokowych (przyjmijmy,
ze mowimy tu tylko o dyskach). Maja one usprawnic operacje wejscia/wyjscia.
Wszystkie te operacje dzialaja wlasnie na buforach i nie musza oznaczac
odwolan do dysku (system sam decyduje kiedy dokonac odczytu i zapisu na
dysk). Podstawowym zalozeniem jest, ze dowolny blok z dysku jest odwzorowany
w co najwyzej jeden bufor.

Schemat (nader uproszczony) reakcji jadra na zadanie odczytu.





Schemat reakcji jadra za zadanie zapisu.


Podkreslam, ze chodzi tu tylko o zaznaczenie, ze bufor trzeba bedzie kiedys
zapisac.

Jakie to ma zalety:


uzytkownik nie musi sie przejmowac tym, ze rzeczywiste operacje na
dysku sa operacjami blokowymi (moze odwolywac sie do dowolnego bajta na
dysku a system tlumaczy to na odwolanie do pewnego bajta w buforze)

niemozliwe jest wyslanie przez kilku uzytkownikow sprzecznych zadan
do dysku (na przyklad zapis dwoch roznych wartosci w to samo miejsce) -
tylko system odwoluje sie do dysku.

przyspieszenie operacji wejscia/wyjscia - niektore odwolania do dysku
moga zostac wyeliminowane


A wady?


Niestety brak wplywu uzytkownika na operacje dyskowe i opoznianie ich
oznacza wieksza podatnosc na awarie - wlasciwie nigdy nie mamy pewnosci
(chyba ze wymusimy to specjalnymi funkcjami systemowymi), ze nasze dane
zostaly zapisane. A prad moga wylaczyc...


Bufor sklada sie z dwoch czesci: tablicy zawierajacej dane z dysku
i naglowka identyfikujacego bufor. Naglowek bufora jest struktura typu
buffer_head.






Co jest w tym naglowku?

Przede wszystkim informacja, czy reprezentuje on jakis blok i jesli
tak, to jaki. Sluza do tego pola b_dev i b_blocknr. Jesli pole b_dev zawiera
stala B_FREE, to bufor jest wolny. W przeciwnym przypadku b_dev zawiera
numer systemu pliku, do jakiego nalezy reprezentowany blok, a b_blocknr
polozenie logiczne tego bloku w jego systemie plikow. Oprocz tego sa jeszcze
pola b_rdev i b_rsector z informacja o fizycznej lokalizacji (fizyczny
numer urzadzenia na ktorym sie znajduje i lokalizacja na nim), ale w interesujacych
nas algorytmach nie sa uzywane.

To, ze bufor reprezentuje jakis blok, nie oznacza jeszcze, ze zawiera
dane z niego. Istotna jest jeszcze informacja o stanie bufora. Najwazniejszym
polem opisujacym stany jest b_state. Zawiera ono informacje o kombinacji
miedzy innymi nastepujacych stanow (kazdy moze byc wlaczony lub wylaczony):


bufor zawiera aktualne dane z dysku (bit BH_Uptodate)

zawartosc bufora trzeba zapisac na dysk (bit BH_Dirty)

trwa wlasnie operacja wejscia/wyjscia na buforze (bit BH_Lock)

trzeba zwolnic bufor natychmiast po operacji wejscia/wyjscia (bit BH_FreeOnIO)
- na przyklad gdy chodzi o blok na dyskietce.


Definicje
stanow w pliku include/linux/fs.h

Na opis stanu bufora skladaja sie jeszcze informacje o:


liczbie procesow korzystajacych z bufora (pole b_count)

czasie, kiedy nalezy zapisac bufor na dysk (pole b_flushtime) - zero
gdy nie potrzeba

czasie ostatniego dostepu do bufora (pole b_lru_time)

rozmiarze bufora (pole b_size) - gdyz Linux dopuszcza bufory roznych
rozmiarow. Dopuszczalnych jest piec rozmiarow, ktore sa przechowywane w
tablicy bufferindex_size.
Zatem kazdy rozmiar mozna identyfikowac poprzez indeks w tej tablicy
lub przez jego wartosc (tutaj w ten sposob). Konwersji wartosci na indeks
dokonuje makro BUFSIZE_INDEX.


W naglowku znajduja sie jeszcze dowiazania do struktur, w ktorych
sa przechowywane bufory - do dwoch kolejek dwukierunkowych (pola b_next,
b_prev, b_next_free i b_prev_free) oraz do kolejki jednokierunkowej buforow
na stronie pamieci (b_this_page). Informacje o nich jak i o polu b_list
znajduja sie w opisie struktury puli
buforow. Oprocz tego z kazdym buforem zwiazana jest kolejka procesow
oczekujacych na zwolnienie go (pole b_wait).

Definicja
struktury buffer_head w pliku include/linux/fs.h


Bibliografia




Pliki zrodlowe Linuxa:


include/linux/fs.h
(definicje typu buffer_head i stanow bufora)

fs/buffer.c
(tablice i makra zwiazane z obsluga roznych rozmiarow buforow)







Pytania i odpowiedzi

1. Jakimi funkcjami mozna wymusic zapis buforow na dysk?

Funkcjami sync_dev(nr_urzadzenia) i fsync_dev(nr_urzadzenia), ktore
powoduja zapisanie wszystkich buforow, superblokow i i-wezlow zwiazanych
z danym urzadzeniem. Funkcja fsync_dev() czeka az te zapisy sie skoncza
a sync_dev nie (tylko inicjuje). Obie te funkcje zdefiniowane sa w pliku
fs/buffer.c

2. W definicji typu buffer_head jest wiecej pol i wiecej mozliwych
stanow b_state niz tu opisane.

Zgadza sie. Przyjalem zalozenie (reszta zespolu chyba tez), ze temat
5.2 (Podreczna pamiec buforowa) dotyczy wysokopoziomowych algorytmow pamieci
buforowej a nie wszystkich algorytmow dzialajacych na buforach. Nie interesuje
sie wiec zbytnio starzeniem sie (ang. aging) buforow (dla przyzwoitosci
wspomnialem cos przy temacie 5.2.2),
realizacja zapisu na dysk czy czekania procesu na zwolnienie bufora. A
wiec nie opisywalem zwiazanych z tym informacji w naglowku.




Autor: Tadeusz Kopec








Wyszukiwarka

Podobne podstrony:
buf head (2)
fun buf (10)
10 3 Pipe Head Loss
WSM 10 52 pl(1)
VA US Top 40 Singles Chart 2015 10 10 Debuts Top 100
10 35

więcej podobnych podstron