GETBLK


1. Zastosowanie

    Wejście:

    Wyjście:


    Zadaniem funkcji getblk() jest "dostarczenie" bufora, który będzie odpowiadał za podany blok dyskowy. Funkcja zapewnia, że w pamięci buforowej znajdzie się dokładnie jeden taki bufor. Wynikiem działania jest wskaźnik do nagłówka bufora.

    Funkcja ta wywoływana jest przez procedury wyższego rzędu służące do obsługi plików. Ponieważ dostęp do pamięci dyskowej jest wyłącznie poprzez pamięć buforową, getblk() wywoływana jest zarówno przy odczycie jak i zapisie dyskowym.

    Działanie getblk() ogranicza się wyłącznie do umieszczenia odpowiedniego bufora w puli buforów, nie zapewnia ona jego zgodności z zawartością dysku - musi się o to zatroszczyć już procedura wywołująca getblk(), o ile zajdzie taka potrzeba.


2. Schemat działania

    Po wywołaniu getblk() mogą zajść dwie sytuacje - w zależności od tego, czy odpowiedni bufor znajduje się już w puli buforów. Bufor, który jest w puli buforów, może być niedostępny - np. wtedy, gdy właśnie następuje odczyt z dysku do tego bufora. W takiej sytuacji w momencie zakończenia odczytu procedura obsługi przerwania zwolni blokadę bufora. Jeśli bufor jest niedostępny, proces musi na niego zaczekać.

    Uproszczony schemat działania getblk() wygląda więc tak:



    Przydzielenie nowego bufora jest procesem dość skomplikowanym. Odpowiedzialna za to jest funkcja refill_freelist.

    Podręczna pamięć buforowa zwalnia bufory zgodnie z algorytmem LRU (least recently used). Jeśli funkcja getblk() znajdzie w puli buforów odpowiedni bufor i będzie on miał zawartość zgodną z zawartością dysku, to zostanie on przesunięty na koniec kolejki LRU. Wynika to z tego, że bufor ten jest w tym momencie ostatnim, jaki powinien być zapisany na dysk.

    Poniższy schemat uwzględnia już wszystkie warianty wywołania getblk():

Kod źródłowy



autor: Tomasz Bogusławski