Systemy Operacyjne

Zadanie



Zmiana mechanizmu wyboru segmentów w algorymie wymiany ramek pamięci dzielonej (procedury shm_swap).

Wstęp

Jeśli w systemie brakuje pamięci, lub gdy ilość wolnej pamięci spada poniżej pewnej wartości, wtedy system operacyjny próbuje zwolnić jakąś ramkę, uruchamiając procedurę try_to_free_page. Próbuje ona co pewien czas wymienić ramkę pamięci dzielonej, wywołując procedurę shm_swap. Algorytm tam zastosowany próbuje zwalniać ramki po kolei z różnych segmentów nie bacząc na ilość dołączonych procesów, ani na wielkość danego segmentu. Jeśli procedura wymiany ramki się powiedzie, wtedy przy następnym wywołaniu próbuje się zwolnić następną ramkę tego samego segmentu, w przeciwnym razie przechodzi się do następnego segmentu.

Można domniemywać, że ramki należące do segmentów wykorzystywanych przez wiele procesów będą wkrótce potrzebne i być może bardziej optymalnie byłoby wymienić ramki innych segmentów. Warto rozważyć pomysł przeszukiwania tablicy segmentów pamięci dzielonej w poszukiwaniu takich, do których jest dołączonych najmniej procesów, a dopiero jeśli wymiana ramki z tego segmentu się nie powiedzie (bo na przykład wszystkie zostały już wymienione) próbować cyklicznie inne identyfikatory.

Zadanie (wersja prostsza)

Dokonaj zmiany w procedurze shm_swap (plik shm.c) realizującej powyższy pomysł. Pierwszym krokiem w tej procedurze powinno być przeszukanie tablicy deskryptorów segmentów (shm_segs) w poszukiwaniu takiego, który ma najmniejszą wartość pola shm_nattch. Zwróć uwagę, że wytypowany segment musi spełniać warunek

! ( shm_segs[swap_id]->shm_perm.mode & SHM_LOCKED )

Nie usuwaj pętli przeszukującej cyklicznie tablicę deskryptorów segmentów, może ona być potrzebna, gdy nie uda się zwolnić żadnej ramki z wytypowanego segmentu.

Wersja nieco trudniejsza

Jeśli nie udało się zwolnić ramki z wytypowanego segmentu, zamiast przejść do segmentu o następnym identyfikatorze, można spróbować typować następny segment do którego jest mało dowiązań. Przy realizacji tego algorytmu zwróć uwagę na prawidłowe zachowanie programu, gdy nie uda się wytypować żadnego segmentu. Zadbaj o efektywność algorytmów (mogą być wywoływane bardzo często! ). W tej wersji zadania będziesz być może musiał dokonać zmian również w innych procedurach z pliku shm.c.

Eksperyment

Napisz program, który dołącza się do segmentu pamięci dzielonej o podanym identyfikatorze i w pętli zapisuje ją całą określoną wartością. Utwórz dwa segmenty pamięci dzielonej tego samego rozmiaru, których całkowity rozmiar jest porównywalny z ilością dostępnej pamięci. Uruchom kilka instancji napisanego przez siebie programu, z których większość dołącza się do jednego z utworzonych segmentów. Zbadaj czas trwania eksperymentu.
Powtórz eksperyment ze zmienionym jądrem. Zwróć uwagę na zachowanie tych samych warunków podczas przeprowadzania doświadczenia, tzn. przeprowadź go na tym samym komputerze, przed każdym z pomiarów uruchamiając go od nowa i logując się tylko na jednej sesji (aby zapewnić podobną ilość dostępnej pamięci). Możesz spróbować zwiększyć spodziewany efekt zmieniając pętlę w procedurze try_to_free_page (plik vmscan.c), tak by wywoływała tylko procedurę shm_swap(wystarczy zadbać by zmienna state miała stale wartość 1).

Wyniki

Jeśli zmiana wpłynęła pozytywnie na zachowanie systemu, to możesz spróbować zbadać, czy również w bardziej realistycznych warunkach nowe jądro działa lepiej niż stare. Jeśli nie, lub jeśli już w czasie eksperymentu zauważysz pogorszenie sprawności systemu, to zastanów się dlaczego tak się dzieje. Zastanów się nad wadami nowego algorytmu i zaproponuj jakiś sposób ich usunięcia.


Autor: Marek Rafałowicz