Zmiana mechanizmu wyboru segmentów w algorymie wymiany ramek pamięci
dzielonej (procedury shm_swap).
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.
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.
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.
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).
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.