Table of Contents
Systemy operacyjne można podzielić ze względu na liczbę obsługiwanych zadań jednocześnie:
obsługują jedno zadanie jednocześnie
obsługują wiele zadań jednocześnie
Obecnie dominują systemy wielozadaniowe.
Komputery można podzielić ze względu na architekturę:
zbudowane są z jednego procesora i jednej pamięci
zbudowane są z kilku procesorów i jednej wspólnej pamięci
Zadanie jest pracą (zbiorem instrukcji), którą ma wykonać procesor. W systemie wielozadaniowym, każde zadanie może być w stanie:
gotowe (RUNNABLE)
wykonywane (RUNNING)
a także (opcjonalnie) w pewnych dodatkowych:
nowe
zatrzymane
zakończone
Wymagania architektury systemu wielozadaniowego:
zadania mają wrażenie, że jedynie one korzystają z procesora (nie powinny wiedzieć o innych zadaniach)
zadania wykonywane są efektywnie, pomimo że wykonujemy wiele zadań jednocześnie (mały dodatkowy koszt)
Z wymagań architektury systemu wielozadaniowego wynika, że zadania są takie same jak w systemie jednozadaniowym. Można się zastanawiać jak w takim razie dochodzi do przełączania między zadaniami.
Dokonywane jest to w przerwaniach, a dokładnie w przerwaniach od zegara.
Załóżmy że w systemie wielozadaniowym przetwarzane jest pewne zadanie A, w pewnym momencie następuje przerwanie od zegara, i w efekcie obsługi tego przerwania następuje zmiana aktualnego zadania na zadanie B. Po kilku przerwaniach zegarowych procedura obsługi przerwania wybierze ponownie zadanie A i będzie ono dalej przetwarzane.
Dla każdego zadania, należy przechowywać pewien jego stan, tak, aby zadanie mogło być pozbawione procesora i potem znowu wznowione:
adres w pamięci następnego rozkazu (instruction pointer)
adres w pamięci wierzchołka stosu (stack pointer)
flagi
pozostałe rejestry
W systemie może być wiele różnych typów przerwań.
Każde typ przerwania ma swój numer.
Procesor po wykonaniu każdej instrukcji, sprawdza czy jest jakieś przerwanie, i jeśli jest to obsługuje je.
Procesor może wyłączyć (włączyć) obsługę przerwań w dowolnej chwili.
W pamięci umieszcza się tablica przerwań, która określa jak każde przerwanie jest obsługiwane (w komórce tablicy odpowiadającej numerowi przerwania znajduje się adres jego procedury obsługi). W trakcie uruchamiania, system operacyjny tworzy tę tablicę, i podaje procesorowi jej adres.
kod w C: if (zmienna=0) { BLOCK } OTHER_BLOCK kod w Assemblerze (odpowiada kodowi maszynowemu): cmp 0,(adres_pamieci_zmiennej) jne after_block_label BLOCK after_block_label: OTHER_BLOCK
Procesor wykonuje instrukcje cmp, i rezultat tego porównania umieszcza w rejestrze FLAGS. Instrukcja JNE sprawdza rejestr FLAGS i podejmuje odpowiednią akcję na podstawie tego rejestru.
Procesor sprawadza czy zostało dostarczone mu przerwanie po wykonaniu każdej instrukcji, i obsługuje je natychmiast. W związku z tym przerwanie może przyjść i być obsługiwane w trakcie instrukcji if - pomiędzy cmp i jne.
Procesor wykonując zadanie ma ustawione:
ip
sp
flags
...registers
Gdy przychodzi przerwanie, i zaczyna być obsługiwane:
push flags
push ip
load ip from idt (tablica opisująca przerwania)
Procedura obsługi przerwania musi zadbać, aby po zakończeniu wartości wszyskich rejestrów były takie jak przed wywołaniem.
Procedura obsługi przerwania kończy się wykonując instrukcję iret, która to wykonuje:
pop ip
pop flags
W ten sposób najpierw wykonywało się zadanie, potem przyszło przerwanie i w ramach przygotowania do obsługi na stosie tego zadania zostały odłożeone kluczowe wartości (ip i flags), potem została wywołana procedura obsługi przerwania i ona zakończyła się instrukcją iret (przywracającą flags i ip).
Rejestr flags, zawiera flagę, która pozwala wyłączyć obsługę przerwań. Gdy flaga przerwań jest ustawiona wtedy procesor obsługuje przerwania. Gdy flaga przerwań nie jest ustawiona wtedy procesor nie obsługuje przerwań.
Pojedyncza instrukcja pozwala zmienić aktualne zadanie.
W pamięci znajdują się zachowane stany przetwarzanych zadań.
Gdy procesor chce przełączyć się na kolejne zadanie, wystarczy, że wywoła specjalną instrukcję: ljmp operacja_przelaczenia_zadania adres_opisu_zadania.
Ta instrukcja zachowa stan obecnego zadania w miejscu z którego zostało ono załadowane, i załaduje nowe zadanie ze wskazanego adresu.
Rozważmy dwa zadania: zadanie 1 i zadanie 2.
Załóżmy, że wykonuje się zadanie 1. Rozpatrzmy jak odbywa się przełączanie zadań.
1.Zadanie 1 wykonuje sie: stos (zadanie 1): | ??? | | ??? | 2.Przychodzi przerwanie od zegara: stos (zadanie 1): | ??? | | ??? | | flags | (flagi w zadaniu 1) | ip | (nastepna instrukcja w zadanie 1|) ip zostaje ustawione na pierwsza instrukcje procedury obslugi przerwania od zegara w rejestrze flags (przerwania zostaja zablokowane). Tym samym zamiast zadania 1, wykonywana jest obsługa przerwania. 3.Procedure obslugi przerwania przelacza sie do zadania 2 i zachowuje stan zadania 1 (jest to stan obslugi przerwania, bo zamiast zadania 1, wykonuje sie obsluga przerwania, ale w tym stanie (na stosie) jest zapisane, ze gdy skonczy sie obsluga przerwania, to sterowanie powroci do zadanie 1): ljmp operacja_przelaczenia_zadania adres_opisu_zadania_2 4.Wykonuje sie zadanie 2 stos (zadanie 2): | ??? | | ??? | Przerwania nie sa zablokowane, pomimo, ze w procedurze obslugi przerwania przerwania nie zostaly jeszcze odblokowane (rejestr flags jest to rejestr zadania 2 a nie zadania 1 (w procedurze obsługi przerwania) ). 5.Przychodzi przerwanie od zegara stos (zadanie 2): | ??? | | ??? | | flags | (flagi w zadaniu 2) | ip | (nastepna instrukcja w zadanie 2) 6.Procedura obslugi przerwania przelacza sie do zadanie 1 i zachowuje stan zadania 2: ljmp operacja_przelaczenia_zadania adres_opisu_zadania_1 7.Wykonuje sie zadanie 1 (aktualnie w tym zadaniu wykonywana jest procedura obslugi przerwania) stos (zadanie 1): | ??? | | ??? | | flags | (flagi w zadaniu 1) | ip | (nastepna instrukcja w zadanie 1) Procedura obslugi przerwania (ip wskazuje na nastepna instrukce po ljmp operacja_przelaczenia_zadania adres_opisu_zadania_2) W obsludze procedury przerwania wykonana zostaje instrukcja iret (powrot z obslugi przerwania): - laduje ip (dla zadania 1) - laduje flagi ze stosu (przerwania zostaja odblokowane) Teraz zadanie 1 wykonuje sie dalej (nie ma zadnych efektow obsluzonego przerwania - izolacja zadania). stos (zadanie 1): | ??? | | ??? |