BREAD (2)










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 Quiche
bread pudding
Locarb Cinnamon Bread
Inside Is Like Bread For Life John Tarrant (Zen, Buddhism, Koan)
Box Bread 2
bread PL final
Mimi s Cafe« Carrot Raisin Bread
Progresso« Italian Style Bread Crumbs
Bread Box chlebak
Friendship Bread
Outback Steakhouse« Honey Wheat Bushman Bread«
Gregory Feeley Fancy Bread
Carrot Cake Honey Bread
KFC« Southern Spoon Bread

więcej podobnych podstron