Do tematu: Zarządzanie procesami

Zadanie 16 - Zarządzanie procesami

Zadanie:

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

Szczegóły implementacyjne:

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

Etap 1:

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.

Etap 2:

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