ZADANIE PROJEKTOWE
Treść zadania:
Zaprojektuj i zaprogramuj strukturę, która będzie przechowywać w systemie
informację o liczbie procesów uruchomionych przez każdego działającego
w systemie użytkownika. Struktura ta ma być tworzona i modyfikowana dynamicznie
podczas działania systemu w chwili powoływania do życia nowego procesu,
jego śmierci oraz zakończonej sukcesem próby zmiany identyfikatora użytkownika
danego procesu.
Stworzonej struktury użyj do zmodyfikowania algorytmu funkcji fork,
a dokładniej jego części odpowiadającej za sprawdzenie, czy użytkownik
tworzący proces nie przekroczył nałożonych nań ograniczeń na liczbę uruchomionych
procesów. Zastosowanie dobrze zaprojektowanej struktury powinno skrócić
średni czas sprawdzenia tego warunku.
Po odpowiednim zmodyfikowaniu kodu źródłowego sprawdź przy pomocy testów,
czy nowy sposób zliczania procesów użytkownika daje takie same wyniki jak
oryginalny algorytm. Pamiętaj, że przekroczenie limitu na liczbę procesów
użytkownika jest niedopuszczalne.
Niedozwolone jest przechowywanie informacji o użytkownikach nieobecnych
w systemie. Należy za to pamiętać, że liczba użytkowników mogących korzystać
z systemu - posiadających konta - jest (teoretycznie) nieograniczona.
Z czym warto się zapoznać przed rozpoczęciem pracy:
-
kernel/fork.c algorytm funkcji fork,
ze szczególnym uwzględnieniem treści funkcji find_empty_process,
zawierającej kod sprawdzający warunek na liczbę uruchomionych procesów
- ten właśnie kod należy zmodyfikować tak, by wykorzystywał zaprojektowaną
strukturę;
-
kernel/exit.c kod algorytmu funkcji exit, bez zmiany
którego nie uda się właciwie przechowywać informacji o liczbie procesów
użytkownika;
-
kernel/sys.c kod algorytmu funkcji setuid
i setreuid, zmieniających identyfikator użytkownika uruchomionego
procesu; funkcja setuid wykorzystywana jest m. in.
przez proces login;
-
rozdział 7.6 z książki Mauricea J. Bacha "Budowa systemu operacyjnego
UNIX" dotyczący identyfikatora użytkownika procesu.
Radzę również zajrzeć do pliku include/sched.h z definicjami najważniejszych
struktur systemowych i makr odpowiedzialnych za zarządzanie procesami.
Testy struktury mogą, na przykład, polegać na zapisie odpowiednich
wartości do pliku kontrolnego podczas każdego wykonania funkcji fork,
w chwili sprawdzenia ograniczenia (funkcja find_empty_process
w fork.c) - sprawdź, jak system radzi sobie z podobnymi zapisami
w przypadku rejestracji parametrów używanych do rozliczania użytkownikow
z zużytych zasobów.
Maciej Ogrodniczuk
26 stycznia 1998 r.