Propozycja zadania do wykonania w ramach laboratorium systemów operacyjnych:
Zdalna baza danych - implementacja podręcznej puli buforów.
1. Wstęp
W aplikacjach sieciowych dużą rolę pełnią bazy danych. Ze względu na rozmiary, dane znajdują się w jednej kopii i każde odwołanie do nich powoduje narzut czasowy i dodatkowy ruch w sieci. Aby zwiększyć wydajność systemów bazodanowych implementuje się buforowanie. Sztandarowym przykładem zastosowania buforowania jest podręczna pula buforów wykorzystywana w podsystemach wejścia- wyjścia, w szczególności buforowanie odwołań do dysku.
2. Treść zadania
Zadanie polega na stworzeniu programów klienta i serwera komunikujących się za pomocą sieci. Ponieważ zakładamy, że procesy będą się intensywnie komunikować, konieczne jest usprawnienie przepływu danych za pomocą buforowania. Jest jeden główny zdalny serwer dostarczający dane z bazy, i po jednym serwerze lokalnym na każdej stacji roboczej na której chcemy mieć dostęp do danych. Klienci przekazują żądania danych z bazy lokalnemu serwerowi który posiada pewną pulę buforów. Lokalny serwer dostarcza informacje pobierając je z puli buforów lub od serwera głównego.
3. Szczegóły implementacji
Należy zapoznać się z konstrukcją podręcznej puli buforów w systemie Linux. Dobrym źródłem informacji jest książka Bacha. Buforowanie wymagane w zadaniu będzie oczywiście uproszczone.
Serwer lokalny będzie posiadał pewien obszar pamięci który będzie wykorzystywany na bufory. Potrzebne będą cztery podstawowe struktury danych: tablica haszująca buforów z danymi, oraz kolejka LRU buforów wolnych, kolejka klientów oczekujących na bufor będący w stanie oczekiwania na dane od serwera i nagłówek bufora. Możliwe jest zaimplementowanie trzeciej kolejki - wolnych buforów, według uznania (wybór pomiędzy Unixem a Linuxem). Lokalny serwer może obsługiwać wielu klientów jednocześnie, ale nie jest potrzebne tworzenie nowych procesów. Ponieważ chcemy minimalizować ruch w sieci, lokalny serwer powinien wykrywać sytuacje, gdy dwóch klientów żąda tych samych danych. Komunikacja pomiędzy procesami może być oparta np. na protokole TCP a nawet sensowne wydaje się użycie RPC. Operacja żądania danych wykonywana przez klienta jest blokująca. Należy napisać funkcję dla klienta dbread(int nr_rekordu,char* buf) która zwróci pod adresem buf zawartość rekordu o numerze nr_rekordu z bazy danych.
Serwer zdalny ma dostęp do bazy danych podzielonej na rekordy jednakowej wielkości. Obsługuje zlecenia serwerów lokalnych.
4. Testy
Zadanie wymaga również wykonania testów wydajności dla różnych wielkości podręcznej puli buforów. W tym celu należy napisać przykładowego klienta który poda statystykę wydajności.
Jarosław Wawszczak