Do tematu: Zarządzanie procesami
Zadanie polega na zaprogramowaniu funkcji systemowych i programu umożliwiającego śledzenie algorytmu szeregowania procesów w jądrze systemu Linux.
W systemie Linux za szeregowanie procesów jest odpowiedzialna funkcja schedule(). Algorytm tam wykonywany nie jest dokładnym odwzorowaniem algorytmu opisanego w książce M.J. Bacha "Budowa systemu operacyjnego UNIX", dlatego też proponuję wykonanie pracy umożliwiającej prześledzenie następujących rzeczy:
Napisanie tego zadania umożliwi porównanie działania standardowego algorytmu szeregowania procesów z algorytmem zaproponowanym w zadaniu: zadanie_02.html
Zadanie składa się z dwóch części: wykonania funkcji zbierającej informacje o szeregowanych procesach oraz z napisania programu umożliwiającego prześledzenie przebiegu algorytmu szeregowania. Ze względu na ogromny narzut związany z śledzeniem szeregowania procesów na bieżąco, proponuję aby proces śledzenia przebiegał dwuetapowo:
Etap 1: śledzenie szeregowania procesów i zapisanie wyników do plików systemowych
Etap 2: analiza wyników śledzenia i wykonanie statystyk
Funkcja służąca do śledzenia powinna być następującej postaci:
inline void watch(task_struct *prev,task_struct *next);
parametry:
Funkcja watch() powinna na podstawie wiadomości o procesie uzyskującym i procesie tracącym procesor, wykonać zestawienie następujących informacji dla każdego procesu:
counter- czas pozostały procesowi do podjęcia próby wywłaszczenia
priority- priorytet procesu
policy- metoda szeregowania procesu
state- stan w jakim znajduje się proces (ważne w przypadku procesu tracącego procesor)
A także informacji jiffies (czasu zegara systemowego)
Wszystkie informacje można umieszczać w jednym z plików systemowych (message lub syslog) za pomocą funkcji printk(). Powinny one być łatwe do rozpoznania przez program wykonujący analizę i dobrze spakowane ze względu na dużą częstość zapisów szeregowanych procesach.
Można także rozważyć utworzenie specjalnego bufora na przechowywane informacje o stałej 1-2 Mb wielkości i pozostawienie tam informacji.
Funkcja watch() powinna zacząć śledzenie w momencie, w którym trafi do niej proces wywołany z pliku o nazwie watch_start i zakończyć gdy się pojawi proces watch_stop. Rozpoznanie procesu powinno następować na podstawie badania parametru comm struktury task_struct.
Funkcja watch() powinna być umieszczona w pliku watch.h taka implementacja, umożliwi łatwe jej zastosowanie w różnych algorytmach szeregowania procesów.
Funkcja watch() może być zastosowana w standardowym algorytmie szeregowania procesów jądra 2.0.32 tuż przed zestawem funkcji dokonujących przełączenia kontekstów. Będzie także możliwe umieszczenie jej na końcu funkcji szeregowania, realizowanej w ramach zadania: zadanie_02.
Wykonanie programu dokonującego analizy wyników szeregowania procesów.
Program taki powinien udostępniać następujące wyniki:
Rozwiązanie zadania powinno zawierać testy, analizę działania szeregowania procesów w jądrze linux. Warto zwrócić uwagę na przebieg szeregowania równorzędnych procesów, procesów uprzywilejowanych przez nadanie innego priorytetu oraz analizę procesów zasypiających w oczekiwaniu na przerwanie i takich, które wykonują działanie ciągłe.
Autor:
Michał Tabor