fun_buf

Lemur zaprasza

Do
spisu tresci tematu 5




5.2.4 Czytanie i pisanie blokow dyskowych





Spis tresci




Wprowadzenie

Funkcje i ich implementacje : bread() , brelse()
, sync_buffer()

Bibliografia











Wprowadzenie





Opisane ponizej funkcje to dalsza czesc funkcji obslugujacych podreczna
pamiec buforowa








Funkcje i ich implementacje





Funkcja
bread ()

-czyta blok dyskowy do bufora

DEFINICJA: struct buffer_head * bread( kdev dev ,int block , int size )
WYNIK : wskaznik na strukture buffer_head bufora do ktorego
czytalismy
NULL w przypadku bledu


W kolejnosci od lewej argumenty oznaczaja :numer dysku , numer bloku
(na ich podstawie znajdowany jest bufor) , rozmiar bufora

Struktura buffer_head jest opisana w rozdziale 5.2.1

Implementacja funkcji :

{
/*probujemy dostac bufor */
if(!(bufor=getblk(dev ,block ,size)))
return (NULL)
if(czy bufor zawiera aktualne dane )
return(bh)
czytaj blok dyskowy na bufor
/* sprawdz czy wszystko sie powiodlo (czekaj na bufor , sprawdz
czy zawiera aktualne dane) */
if (bufor zawiera aktualne dane)
retur (bufor)
wpp zwolnij bufor /* algorytm brelse */ i return (NULL)
}

Funkcja breada
()

-czytaj bloki dyskowe z wyprzedzeniem

DEFINICJA : struct buffer_head * breada (kdev dev
int block
int size
unsigned int pos
unsigned int filesize)
WYNIK : analogicznie do bread()

Pierwsze trzy argumenty sa analogiczne do bread() , na podstawie dwoch
ostatnich wyliczne sa numery blokow buforow ktore bedziemy czytac z wyprzedzeniem


Implementacja funkcji:

{
sprawdz porawnosc argumentow
if(!(bufor=getblk ( dev , block ,size)))
return (NULL)
if (bufor zawiera aktualne dane)
return (bufer )
wpp czutaj blok dyskowy
/* wyliczamy bloki czytane z wyprzedzeniem , maksykmalnie moze byc
ich NBUF zadeklarowane na 16*/
index=BUFSIZE_INDEX (bufor ->b_size)
blocks=( filesize - pos) >> (9 + index)
staramy sie dostac te bufory wywolujac funkcje getblk dla kolejnych
numerow blokow
zmieniajacych sie od block do block + blocks
wkladamy do tablicy pomocniczej bhlist bufory ktore nie posiadaja
aktualnych danych
czytamy te bufory , a nastepnie zwalniamy
/*sprawdz czy czytanie przebieglo prawidlowodlo pierwszego bufora*/
wait_on_buffer(pierwszy bufor)
if (zawiera aktualne dane )
return (bufor)
wpp zwolnij go i return (NULL)
}

Funkcja brelse
()

-Procedura ta zwalnia bufor wskazywany
przez argument

DEFINICJA : void brelse (struct buffer_head * buf)

Implementacja funkcji:

{
/*czekaj na bufor */
wait_on_buffer (buf)
/* ustaw czas kiedy ten bufor powinien byc zapisany */
set_writetime (buf , 0 )
/*uprzadkuj pola naglowka bufora , funkcja opisana ponizej */
refile_buffer (buf )
zmniejsz licznik odwolan do bufora
}

Funkcja pomocnicza refile_buffer()

DEFINICJA: void refile_buffer (struck buffer_head * buf )

Implementacja funkcji :

{
int dis /*zmienna pomocnicza */
if(buffer_dirty(buf))
dis=BUF_DIRTY
wpp if (ilosc uzytkownikow strony na ktorej jest zawrtosc bufora
jest wieksza od 1 || buffer_protected(buff))
dis=BUF_SHARED
wpp if (buffer_locked (buf ))
dis+BUF_LOCKED
wppp if (buf ->b_list == BUF_SHARED )
dis=UNSHARED
wpp dis=CLEAN
if(zmienna dis nie rowna sie polu buf ->b_list) {
if(dis =BUF_DIRTY || dis=BUF_UNSHARED)
/* ustaw czas ostatniego uzytkowania */
buf->b_lru_time=jiffies
if(dis =BUF_LOCKED || roznica miedzy czasem kiedy ten bufor powinien
byc zapisany /*buf->b_flushtime */ , a czasem ostatniego uzytkowania
jest <= od bdt_prm.b_un.age_super)
dis=BUF_LOCKED1
/* usuwamy z kolejek dany bufor */
remove_from_queues (buf )
buf->b_list=dis
/*wstawiamy do odpowiednich kolejek */
insert_into_queues (buf )
}
}

Pola b_list w naglowku bufora opisane jest w rozdziale 5.2.1

Funkcja sync_buffer
()

-Zapisuje bufory na dysk

DEFINICJA : static int sync_buffer (kdev dev , int wait )
WYNIK: przekazuje kod bledu

Przegladamy liste lru w poszukiwaniu DIRTY buforow o danym
numerze urzadzenia dyskowego

Jezeli argument wait != 0 to w poszukiwaniu tym nie czekamy na bufory
zablokowane

Jezeli cos zostalo zapisane to powtarzamy przejscie po kolejce lru
tym razem czekajac tylko na dokonczenie zapisu buforow

Powrot z funkcji nastepuje gdy wszystkie DIRTY bufory zostana zapisane










Bibliografia




Zrodla Linuxa :


fs/buffer.c
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • teen-mushing.xlx.pl
  • Wątki
    Powered by wordpress | Theme: simpletex | © Lemur zaprasza