CROOK-5 - Procesy
Proces jest podstawowym obiektem zarządzanym przez system operacyjny. Każdy proces (z wyjątkiem jednego, pierwotnego, który jest przodkiem wszystkich innych) może być utworzony tylko przez inny proces. W momencie tworzenia powstaje relacja przodek-potomek decydująca o wzajemnym oddziaływaniu procesów. Tworzenie procesu polega na inicjalizacji w systemie wektora stanu procesu zawierającego dane o właściwościach procesu i jego stanie.
Stany procesów
Proces po utworzeniu znajduje się w stanie zatrzymania i może zostać uaktywniony przez swojego przodka. W stanie aktywnym może być aktualnie wykonywany lub czekać na procesor. Proces może zostać zawieszony przy czekaniu na zakończenie wykonywania operacji wejścia-wyjścia, czekaniu na zwolnienie jednego z zasobów przydzielanych przez system lub w wyniku wykonania ekstrakodu typu "czekaj". Proces aktywny lub zawieszony może zostać zatrzymany w wyniku spowodowania alarmu lub przez swojego przodka. Przodek może odpowiednim ekstrakodem ponownie uaktywnić lub usunąć proces.
Zasada koordynacji (szeregowania) procesów
Każdy proces ma przypisany priorytet, który jest liczbą całkowitą z zakresu 0-127, przy czym liczba 0 oznacza priorytet najwyższy. W systemie istnieje lista procesów aktywnych, na której umieszczane są procesy gotowe do wykonania. Proces przechodzący w stan aktywny umieszczany jest na liście według priorytetu, jako pierwszy wśród procesów o jednakowym priorytecie. Aktualnie wykonywanym jest zawsze proces pierwszy na liście. W wypadku zawieszenia lub zatrzymania procesu jest on usuwany z listy. Na końcu listy znajduje się zawsze systemowy proces "tracenia czasu", który wykonywany jest wtedy, gdy na liście nie ma innych procesów.
Atrybuty procesów
Z każdym procesem związana jest sześciobitowa liczba określająca atrybuty procesu. W czasie tworzenia procesu (ekstrakod DEFP) jest ona ustawiana tak samo jak w procesie przodku. Przeniesienia ciała procesu do osobnego bloku pamięci (ekstrakody CPRF i JUMP) powoduje ustawienie wartości atrybutów na takie, jakie są zapisane w etykiecie zbioru zawierającego nowe ciało procesu. Kolejne (od najstarszego) bity atrybutów oznaczają:
- bit 0 =1 - oznacza program nie przygotowany do sprzętowego rozszerzenia przestrzeni adresowej do 64K;
- bity 1,2 - dwa bity zawierające informację dla programu XOSL o sposobie przesyłania parametrów do procesu przy jego uruchomieniu;
- bit 3 =1 - oznacza moduł wynikowy PASCALa.
- bit 4 =1 - oznacza proces rezydujący - proces zajmujący pamięć od chwili przeniesienia do osobnego bloku pamięci do usunięcia i nie posiadający zbioru specjalnego (procesy o tym atrybucie są automatycznie usuwane przez program XOSL po zakończeniu pracy i po każdym alarmie);
- bit 5 =1 - oznacza proces uprawniony do wykonywania wszystkich zastrzeżonych operacji.
Proces pierwotny INI
W chwili inicjalizacji systemu oprócz procesu "tracenia czasu" tworzony jest proces pierwotny INI. Jest to proces o najwyższym priorytecie, wykonujący się w użytkowym bloku pamięci operacyjnej, którego zadaniem jest odebranie zgłoszenia użytkownika i uruchomienie odpowiedniego programu komunikacji użytkownika z systemem. Może to być standardowy program interpretacji zleceń systemowych XOSL lub inny program ustalony przez użytkownika.
Alarmy zgłaszane przez procesy
Alarmami nazywamy tu wszystkie zdarzenia uniemożliwiające dalsze wykonywanie procesu. Mogą być one spowodowane błędem w programie, niewłaściwym działaniem urządzeń, odwołaniem do nieistniejącego zbioru itp. Po spowodowaniu alarmu proces zostaje zatrzymany, alarm zostaje wpisany na listę alarmów przodka a przodek uaktywniony jeśli był zatrzymany. Proces posiadający potomków powinien po uaktywnienu sprawdzać stan swojej listy alarmów. Służy do tego ekstrakod TERR który pobiera identyfikator procesu pierwszego na liście alarmów i usuwa ten proces z listy. Mechanizm listy alarmów używany jest także do przesyłania sygnałów do przodka. Przewidziano do tego celu grupę ekstrakodów, których wykonanie powoduje alarm z przekazaniem jako numeru alarmu numeru ekstrakodu. Znaczenie poszczególnych numerów jest lokalne dla danego poziomu przodek-potomek. Każdy proces może zadeklarować własną obsługę alarmów, przekazując ekstrakodem adres tablicy w której zostanie umieszczona zawartość licznika rozkazów i numer alarmu. Po sprawdzeniu numeru alarmu proces może zrezygnować z jego dalszej obsługi i przekazać alarm przodkowi, tak jakby nie była deklarowana własna obsługa.
Ekstrakody systemu operacyjnego
System operacyjny CROOK-5 udostępnia programom użytkowym około 70 funkcji systemowych. Funkcje te mogą być wywoływane przez programy użytkowe za pomocą ekstrakodów. W systemie CROOK-5 można wyróżnić 6 grup ekstrakodów:
- ekstrakody zarządzania procesami. W grupie tej znajdują się ekstrakody pozwalające zarówno na tworzenie i sterowanie pracą procesów potomnych jak i wykonywanie pewnych operacji pomocniczych dotyczących procesu wywołującego ekstrakod.
- ekstakody semaforowe. Cztery ekstrakody realizujące typowe operacje semaforowe: semafor całkowitoliczbowy (dla procesów działających we wspólnym bloku pamięci), oraz semafor binarny (dla procesów używających wspólnego strumienia).
- ekstrakody współpracy z podsystemem zbiorów. W tej grupie znajdują się ekstrakody tworzenia i usuwania zbiorów i strumieni, ustalania parametrów zbiorów, ustalania skorowidza bieżącego, dołączania i odłączania talerzy dyskowych, oraz kilka ekstrakodów pomocniczych.
- ekstrakody WE/WY sekwencyjnego (znkowego).
- ekstrakody swobodnego dostępu do zbiorów dyskowych.
- ekstrakody umożliwiające działanie na urządzeniach takich jak: PI, CAMAC, taśma magnetyczna.
Istnieje grupa ekstrakodów (o numerach od 0340 do 0377) obsługiwanych przez system w sposób szczególny. Wywołanie ekstrakodu z tej grupy powoduje alarm systemowy przekazywany do przodka niezależnie od deklaracji własnej obsługi alarmów. Są one przeznaczone do komunikacji procesu z procesem przodkiem (przykładem są tu ekstrakody pomocnicze programu XOSL).
Parametry są przekazywane do ekstrakodów przez rejestr uniwersalny R4. Parametrem może być:
- liczba lub identyfikator umieszczony w tym rejestrze;
- adres pola parametrów.
Wyjątkiem są tutaj ekstrakody SIGN i WAIS dla których dodatkowym parametrem jest liczba umieszczona w programie za wywołaniem ekstrakodu.
Dane wyjściowe z ekstrakodu są przekazywane poprzez poszczególne słowa pola parametrów, lub przez rejestr uniwersalny R4, a dla ekstrakodów wejścia sekwencyjnego dodatkowo przez bit C rejestru R0. Wyjątkiem są ekstrakody INAM i INUM, gdzie dane wyjściowe są przekazywane przez rejestry R1, R2 i R3, oraz bity C i V rejestru R0.
Ekstrakody zarządzania procesami
Pole parametrów PROC
- 0 - słowo błędów, jeżeli początkowa zawartość jest różna od zera to wystąpienie błędu powoduje alarm, w przeciwnym przypadku program realizuje się dalej, a w słowo błędów wpisany zostaje numer alarmu (rozdz. I.5);
- 1 - identyfikator procesu potomnego - lokalny dla procesu wywołującego ekstrakod;
- 2 - zawartość IC procesu potomnego;
- 3 - zawartość R0 procesu potomnego;
- 4 - przy ekstrakodzie DEFP priorytet definiowanego procesu, względem procesu wykonującego ekstrakod, przy pobieraniu rejestrów zawartość słowa stanu procesu, przy ładowaniu rejestrów ignorowane;
- 5-11 - zawartości rejestrów R1:-R7 procesu potomnego.
Ekstrakody zarządzania procesami potomnymi
Parametrem ekstrakodów tej grupy jest przekazywany w R4 adres opisanego w punkcie III.1.7.1. pola parametrów PROC. Jego dwa pierwsze słowa określają identyfikator procesu którego operacja dotyczy, oraz sposób reakcji w przypadku wystąpienia błedu w trakcie wykonywania ekstrakodu. Muszą być one ustawione przy wejściu do ekstrakodu. Pozostałe słowa określają stan procesu oraz zawartości IC i rejestrów. Muszą być one ustawiane przy wejściu do ekstrakodów DEFP i SREG.
- DEFP - definiuj proces potomny i załaduj jego rejestry (każdy proces może tworzyć własną rodzinę procesów potomnych).
- DELP - usuń proces wraz z wszystkimi jego potomkami.
- SREG - załaduj IC i rejestry procesu potomnego.
- TREG - pobierz zawartości IC i rejestrów procesu potomnego. W wyniku wykonania ekstrakodu do odpowiednich słów pola parametrów zostaną wpisane przez system: słowo stanu procesu oraz zawartości IC i rejestrów.
- RUNP - uaktywnij proces potomny.
- HANG - zatrzymaj proces potomny.
Ekstrakody pomocnicze
- TERR - pobierz do R4 identyfikator procesu potomnego pierwszego na liście alarmów (wartość -1 oznacza, że lista alarmów jest pusta).
- STOP - zatrzymaj własny proces (zatrzymaj siebie) do chwili ponownego uruchomienia ekstrakodem RUNP przez przodka lub spowodowania alarmu przez potomka. Jeżeli zawarty w R4 argument jest różny od zera, dodatkowym zdarzeniem uruchamiającym proces jest upłynięcie wskazanej argumentem liczby kwantów czasu (po 100 milisekund).
- WAIT - zawieś własny proces na określoną zawartością R4 liczbę kwantów czasu.
- CHPI - zmień własny piorytet o zawartość R4 (tylko dla procesów posiadających odpowiednie uprawnienie).
- RELD - zwolnij urządzenia znakowe zajmowane przez proces.
- OES - deklaracja własnej obsługi alarmów; R4 jest adresem pola, w którym zerowe słowo zawiera adres procedury obsługi a kolejne dwa słowa przeznaczone są na przechowanie zawartości IC i numeru alarmu (własną obsługę alarmów można wyłączyć wykonując ekstrakod z rejestrem R4=-1). Deklaracja własnej obsługi jest wyłączana przez system po przesłaniu IC i numeru alarmu do pola opisu alarmu. Jeżeli proces zamierza nadal sam obsługiwać swoje alarmy musi ponownie wykonać ekstrakod OES.
- ERR - rezygnacja z własnej obsługi alarmu którego opis znajduje się w polu zadeklarowanym ekstrakodem OES (przekazanie obsługi przodkowi). Przed wykonaniem ekstrakodu ERR należy ekstrakodem OES "przypomnieć" systemowi adres pola opisu alarmu.
- DATE - umieść pod adresem podanym w R4 trzy słowa określające rok, miesiąc, dzień.
- TIME - umieść pod adresem podanym w R4 trzy słowa określające godzinę, minutę, sekundę.
Ekstrakody semaforowe
W ekstrakodach semaforowych R4 zawiera adres słowa którego zawartość jest wartością semafora, a słowo za ekstrakodem zawiera liczbę o jaką będzie zmieniona wartość semafora.
- WAIS - odejmij wskazaną liczbę od wartości semafora. Jeżeli wartość semafora pozostanie dodatnia lub równa zero kontynuuj proces; w przeciwnym przypadku pozostaw pierwotną wartość semafora bez zmian i zawieś proces do chwili uzyskania przez semafor odpowiedniej wartości (w wyniku wykonania ekstrakodu SIGN przez inny proces).
- SIGN - zwiększ wartość semafora o podaną liczbę i ewentualnie uaktywnij czekające procesy (lub jeden z nich).
Niezależnie od ekstrakodów WAIS oraz SIGN system umożliwia wykonywanie operacji na semaforach binarnych związanych z każdym strumieniem. W chwili tworzenia strumienia (dowolnym z ekstrakodów ASG, CASG lub NASG) definiowany jest semafor którego wstępną wartością jest 1. Argumentem ekstrakodów jest podawany w R4 adres pola opisującego strumień (analizowane są dwa pierwsze słowa tego pola).
- TAKS - jeśli wartość semafora strumienia wynosi jeden, zmień ją na zero. W przeciwnym razie: jeśli zawartość słowa błędów pola opisu strumienia jest zero, zmień ją na 10 (wskazanie zajętości); jeżeli zawartość słowa błędów jest różna od zera zawieś proces do chwili uzyskania przez semafor wartości jeden.
- RELS - jeśli proces wykonał uprzednio ekstrakod TAKS, ustal wartość semafora strumienia na jeden i ewentualnie uaktywnij jeden z czekających na ten semafor procesów.
UWAGA: Ekstrakody TAKS i RELS mogą być w systemie nieznane. Procedury je realizujące dołączane są do systemu zależnie od ustawienia odpowiedniego bitu w tablicy konfiguracji.
Ekstrakod pobierania informacji o procesie
Ekstrakod PINF pobiera informację o własnym procesie i wypełnia następująco pole parametrów:
- 0 - numer generacji systemu;
- 1 - starszy byte zawiera rozmiar dostępnej pamięci operacyjnej (w jednostkach po 4K), młodszy zaś kod uprawnień użytkownika;
- 2 - priorytet procesu;
- 3 - długość zbioru specjalnego (w sektorach);
- 4 - adres startowy (adres ładowania);
- 5 - rozmiar zajmowanej pamięci operacyjnej w słowach;
- 6 - kod uprawnień i atrybuty procesu;
- 7 - nazwa obszaru;
- 8-9 - nazwa użytkownika;
- 10-11 - nazwa programu (procesu).
Zajmowanie własnej pamięci przez proces
Każdy proces po utworzeniu i uruchomieniu wykonuje się w bloku pamięci wspólnym ze swoim przodkiem. Procesy, mające działać w oddzielnym bloku pamięci mogą ekstrakodem CPRF przygotować się do zajęcia pamięci i wczytania ze zbioru nowego ciała procesu, a następnie ekstrakodem JUMP załadować ciało procesu i przenieść sterowanie do własnego bloku pamięci. Oba ekstrakody muszą być wywoływane bezpośrednio jeden po drugim, a proces który ich używa nie może mieć procesów potomnych.
- CPRF - utwórz zbiór specjalny i przygotuj parametry transmisji ciała procesu do pamięci. Argumentem jest podawany w R4 adres pola parametrów działania na zbiorach (III.3.2.1). Występujący tam tytuł zbioru (musi to być zbiór dyskowy) wskazuje na zbiór z którego zostanie załadowane ciało procesu.
- JUMP - przenieś sterowanie do osobnego bloku pamięci. Argumentem jest podawany w R4 adres pola parametrów zarządzania procesami (III.1.7.1.). W wyniku wykonania ekstrakodu zostaje załadowane ciało procesu, a proces zostaje wznowiony z IC i rejestrami załadowanymi tak, jak w zadanym polu parametrów. Ujemna wartość czwartego słowa pola parametrów (słowo stanu) uznacza polecenie wykonania alarmu 0100 po załadowaniu ciała procesu.
Źródło: SYSTEM OPERACYJNY CROOK-5 dla minikomputera MERA-400 (wersja 7), Zbigniew Czerniak, Marek Nikodemski, Gdańsk 1988