SOI szeregowane procesów.odt

(26 KB) Pobierz

Tomasz Jakubczyk

 

Szeregowanie procesów zwykłych i obliczeniowych

 

1.                Ogólne omówienie koncepcji.

 

              Najpierw potrzeba jakoś odróżnić od siebie procesy zwykłe i obliczeniowe. W proc dodam pole typ_procesu do którego będzie przypisywana jedna z dwóch predefiniowanych stałych. Domyślnie proces będzie typu zwykłego.

              Następnie potrzebne będą dwie osobne kolejki dla procesów zwykłych i obliczeniowych. Czas będzie przydzielany procesom z początków kolejek, na przemian dwa kwanty czasu dla procesów zwykłych (prawdopodobnie najczęściej będą to dwa różne procesy zwykłe) i jeden kwant podwójny dla procesów obliczeniowych (jeden proces dostaje dwa kwanty). Jeśli nie będzie żadnego gotowego procesu w kolejce, której kolej właśnie nadeszła, to druga kolejka zostanie obsłużona.

W celu ustalenia, który rodzaj procesu użytkownika był ostatnio dodam zmienną stan_szeregowania, która będzie mówiła jaki typ był ostatnio (najprawdopodobniej będą potrzebne cztery różne wartości).

              Zaletą wykorzystania drugiej kolejki jest oszczędność czasu na przeglądaniu całej kolejki w poszukiwaniu następnego procesu drugiego typu. Wadą takiego rozwiązania jest natomiast potencjalna konieczność dokonania większych zmian w kodzie.

 

2.                Lista niezbędnych do wykonania zmian.

a)                Zmiany w jądrze.

                            kernel/proc.h

              Dodanie pola typ_procesu w strukturze proc, zdefiniowanie odpowiednich stałych (ZWYKLY i OBLICZENIOWY) do przypisania temu polu. Dodanie wskaźników na kolejkę procesów obliczeniowych. Dodanie zmiennej stan_szeregowania (prawdopodobnie będzie widziana podobnie do kolejek procesów, tylko nie będzie kolejką) wskazującej czy ostatnio był obsłużony zwykły proces użytkownika, czy może proces obliczeniowy.

                            kernel/proc.c

              W funkcji pick_proc dopisanie algorytmu wybierania czy ma być teraz proces zwykły, czy obliczeniowy. Tutaj powinno się też zmienić stan zmiennej stan_szeregowania mówiącej, jaki typ ostatnio był.

W funkcji ready wkładanie procesu użytkownika na odpowiednią kolejkę.

W funkcji unready zdejmowanie procesów (obsługa drugiej kolejki).

W funkcji sched  patrząc na stan zmiennej mówiącej o typie ostatniego procesu przekładamy w odpowiedniej kolejce proces z początku na koniec.

                            kernel/clock.c

              W funkcji do_clocktick obsługa drugiej kolejki i uwzględnienie, że procesy obliczeniowe dostają podwójny kwant czasu. Żeby wiedzieć, czy jest pierwszy czy drugi kwant dla procesu obliczeniowego zostanie sprawdzona i zmodyfikowana zmienna  stan_szeregowania.

W funkcji clock_handler dodać obsługę drugiej kolejki i stanu_szeregowania.

 

b)               Zmiany w MM.

                            mm/table.c, main.c, proto.h

              Dodać nowe wywołanie systemowe do_nowy_obliczeniowy, utworzy ono nowy proces obliczeniowy.

c)                Zmiany w FS.

                            fs/table.c

              Analogicznie do MM.

 

d)               Zmiany w programach poziomu użytkownika i potrzebne nowe programy.

              Zostanie napisany program test_szeregowanie, który będzie tworzył nowe procesy zwykłe i obliczeniowe oraz demonstrował wyniki.

3.                Opis sposobu demonstracji wyników.

Program test_szeregowanie odpali w pętli pewną ilość procesów.

 

Do koncepcji szeregowania mogę zaproponować parę pomysłów demonstracji wyników:

                     Wywoływane procesy wypisują w pętli informację o swoim numerze i typie, a my patrzymy na te napisy, czy dobrze się przełączają. Takie rozwiązanie nie jest do końca fajne, bo wypisanie pociąga za sobą dodatkowe przerwanie, ale plusem jest to, że można to zrobić łatwo i z poziomu użytkownika.

                     Wprowadzamy dodatkową modyfikację do clock.c zapisującą do na przykład bufora cyklicznego kolejność przełączeń procesów i dodając nowe przerwanie systemowe pobierać go i wyświetlać w funkcji testującej. W tym rozwiązaniu zaletą jest większa dokładność wyników, ale wadą kolejna ingerencja w jądro.

                     Można też podejść do testów bardzie statystycznie i patrzeć w jakim czasie procesy obu typów się wykonały. Tu plusem jest prostota, a minusem to, że dopatrzenie się związku między algorytmem szeregowania, a czasami wykonania może nie być oczywiste.

Zgłoś jeśli naruszono regulamin