Do spisu tresci tematu 5

5.2.1 Naglowki buforow




Spis tresci


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 odczytu]

Schemat reakcji jadra za zadanie zapisu.

[Schemat zapisu]

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

Jakie to ma zalety:

A wady?

  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):

Definicje stanow w pliku include/linux/fs.h

Na opis stanu bufora skladaja sie jeszcze informacje o:

   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

  1. Pliki zrodlowe Linuxa:


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