Powrót do spisu treści tematu
Opis działania funkcji bread()
Spis treści
Wstęp
Algorytm
Implementacja
Opis
Funkcje pomocnicze
Bibliografia
1. Wstęp
Funkcja bread służy do uzyskania żądanego bloku danych.Algorytm funkcji
bread() w skrócie polega na sprawdzeniu, czy żądany blok jest w puli buforów;
jeśli go nie ma to zostaje sprowadzony z dysku.
2. Algorytm
Parametry wejściowe: numer żądanego bloku w systemie plików.
Zwracana wartość: bufor zawierający dane lub NULL w przypadku niepowodzenia
.
za pomocą algorytmu getblk() dostarcz bufor
i zapamiętaj go w zmiennej tymczasowej bh
sprawdź, czy bufor zawiera aktualne dane (funkcja buffer_uptudate()):
jeśli tak to zwróć ten bufor
zainicjuj czytanie z dysku (funkcja ll_rw_block())
zaśnij do zakonńczenia operacji we-wy (funkcja wait_on_buffer())
sprawdź czy odczytany bufor zawiera aktualne dane (buffer_uptodate)
jeśli tak to zwróć ten bufor zwolnij bufor (funkcja brelse()
) i zwróć NULL
3. Implementacja
Kod źródłowy funkcji znajduje się w pliku fs/buffer.c
Kod źródłowy opatrzony komentarzami można znaleźć tutaj
Nagłówek funkcji ma postać: struct buffer_head * bread(kdev_t dev, int
block, int size)
Parametry funkcji:
dev - numer systemu plików (typu kdev_t),
block - numer bloku (typu int )
size - rozmiar bufora (typu int) natomiast zwracana wartość będąca
wskaźnikiem do nagłówka żądanego bufora jest typu struct buffer_head*.
4.Opis
Funkcja jest wywoływana w momencie zapotrzebowania na blok dyskowy.
Pierwszym krokiem jest wywołanie algorytmu getblk()
do odszukania bloku w puli buforów. Algorytm zwraca wskaźnik do nagłówka
żądanego bufora w przypadku znalezienia go w puli buforów lub wskaźnik
do nagłówka nowego bufora w przypadku niepowodzenia. Zmienna bh jest zmienną
pomocniczą w której przechowujemy nagłowek bufora. Jej typem jest struct
buffer_head *. W przypadku niepowodzenia getblk(), co raczej nie powinno
się zdarzyć, zwracany jest NULL. (W funkcji getblk() nie ma explicite powrotu
z NULL jako zwracaną wartością.) Należy teraz zbadać, czy zwrócony przez
getblk() wskaźnik do nagłowka bufora dotyczy bufora z aktualnymi danymi,
czy też nowego bufora (w zależności od skutków poszukiwania). Dokonuje
tego funkcja buffer_uptodate(). Jeśli
dane są aktualne bufor zwracamy. W przeciwnym przypadku inicjujemy odczyt
żądanego bloku z dysku wywołując niskopoziomową funkcję ll_rw_block().
Wywołanie ma postać: ll_rw_block(READ, 1, &bh);. Po zinicjowaniu podprogramu
obsługi dysku funkcja bread() zasypia w oczekiwaniu na zdarzenie zakończenie
wejścia-wyjścia, wywołując funkcję wait_on_buffer().
Po przebudzeniu konieczne jest sprawdzenie, czy odczytane dane są aktualne.
Zabezpiecza to przed błędem operacji dyskowych. Jeśli wszystko się powiodło
zwracamy to zwracamy bufor. W przeciwnym przypadku zwalniamy bufor (oznaczony
przez getblk() jako używany) funkcją brelse()
i zwracamy NULL.
5. Funkcje pomocnicze
Funkcja buffer_uptodate() sprawdza bit BH_Uptodate w polu b_state nagłówka
bufora.
static inline int buffer_uptodate(struct buffer_head * bh)
{ return test_bit(BH_Uptodate, &bh->b_state); }
Funkcja wait_on_buffer() powoduje zatrzymanie funkcji aż do zakończenia
operacji odczytu. Działanie tej funkcji polega na dodaniu procesu do kolejki
procesów oczekujących na ten bufor, zwiększeniu licznika procesów oczekujących.
Następnie następuje oczekiwanie na odblokowanie bufora (czyli zakończenie
odczytu). Procesy oczekujące są budzone w odpowiedniej kolejności, i następuje
usuwanie ich z kolejki oczekujęcych.
Funkcja ll_rw_block jest zadeklarowna jako extern w pliku fc.h. Jest
to funkcja niskopoziomowa inicjująca odczyt lub zapis bloków dyskowych.
void ll_rw_block(int rw, int nr, struct buffer_head * bh[]);
6. Bibliografia
bread.c - plik ze skomentowanymi
źródłami funkcji
fc.h - plik nagłówkowy (zawiera m. in. deklarację funkcji ll_rw_block())
fs/buffer.c - plik zawierający kod żródłowy funkcji stosowanych w buforowaniu
M.J.Bach - "Budowa systemu operacyjnego Unix"
Opracował: Jarosław Wawszczak
Wyszukiwarka
Podobne podstrony:
Bread Crust Zucchini Quichebread puddingLocarb Cinnamon BreadInside Is Like Bread For Life John Tarrant (Zen, Buddhism, Koan)Box Bread 2bread PL finalMimi s Cafe« Carrot Raisin BreadProgresso« Italian Style Bread CrumbsBread Box chlebakFriendship BreadOutback Steakhouse« Honey Wheat Bushman Bread«Gregory Feeley Fancy BreadCarrot Cake Honey BreadKFC« Southern Spoon Breadwięcej podobnych podstron