buf head (2)


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 (10)
Beach Head Desert War info
NORSE WOMANS LINEN HEAD DRESS
Microactuator for Precise Head Positioning
head

więcej podobnych podstron