Po otrzymaniu komunikatu
od procesu pojazdu, proces wizualizacji dla zmiennej
z1
równej znakowi:
Po otrzymaniu komunikatu, dla zmiennej z1 równej znakowi:
Po otrzymaniu
komunikatu od procesu zarządcy lub procesu pojazdu, proces wizualizacji dla
zmiennej z2
równej znakowi:
Litery
S oraz C
symulują pola świateł dla pojazdów:
S : pole jest na krawędzi jezdni, tło
czerwone lub zielone,
C : tło czerwone (mrugające) lub czarne.
UWAGA!
Proces ten nie pamięta poprzednio
wykonanych operacji! W przypadku wykonania dowolnej błędnej operacji
kończy działanie!
2.
Proces przechowujący zasoby systemu
Tylko ten proces ma dostęp do klawiatury (pozostałe procesy mają zablokowany).
Odebranie przez ten proces sygnału CTRL-Z powoduje zakończenie pracy pozostałych
procesów systemu w następujący sposób: proces zasobów informuje procesy
klienckie o zakończeniu pracy, ostatni z klientów informuje proces wizualizacji
(ponieważ proces zasobów systemu nie komunikuje się z procesem wizualizacji).
Proces zasobów odpowiada na zapytania dotyczące zajętości jednego odcinka drogi.
Odpowiedź jest pozytywna, jeśli ten odcinek drogi jest wolny. Podobne
odpytywanie następuje dla stanu świateł.
Proces ten przechowuje również stan licznika klientów (pojazdów) obecnych na
przejeździe kolejowym (LS) oraz stan liczników zgłoszeń pojazdów (pojazdy
zgłaszają się przed skrzyżowaniem).
Struktura odbieranego komunikatu: numer_polecenia dana
typu char
Struktura wysyłanego komunikatu: potwierdzenie,
dana1, dana2, dana3 typu char
Potwierdzenie przyjmuje wartości:
0 : gdy odpowiedź jest pozytywna,
1 : gdy informujemy klienta o zakończeniu pracy,
wtedy dana1 przyjmuje wartość równą
0,
gdy dana1 przyjmuje inną
wartość, proces klienta informuje proces wizualizacji o zakończeniu pracy
i sam również kończy pracę.
w programie zdefiniowane są
następujące funkcje: awaria(),
obsuga_sygnalu(), main().
Schemat oprogramowania sygnałów:
w procesie serwera zasobów:
- przechwytujemy sygnał CTRL-Z, czyli SIGSTOP (ang. signal interrupt),
- jako obsługę sygnału wykonujecie Państwo co tam trzeba, i koniecznie
rozsyłacie sygnał do pozostałych procesów.
void
obsuga_sygnalu()
{
...
kill (0, SIGURG);
...
}
void main ()
{
...
signal (SIGINT,
obsuga_sygnalu() );
...
}
W pozostałych procesach:
- obsługujemy otrzymany z procesu serwera zasobów sygnał:
void procedura_obsługi_sygnału
()
{
...
...
}
void main ()
{
...
signal (SIGURG, procedura_obsługi_sygnału );
...
}
powrót
3.
Proces klienta: zarządca przejazdu kolejowego i
świateł - dróżnik
Proces dróżnika po uruchomieniu aktualizuje stan zadania zgodnie z zadanymi
warunkami (z kierunkami jazdy opisanymi w nawiasach przy wjazdach, nawiasy
kwadratowe oznaczają drogi z pierwszeństwem przejazdu.
Proces ten w zadanych odstępach czasu odczytuje z serwera zasobów stan zgłoszeń
pojazdów i na ich podstawie odpowiednio steruje szlabanem i światłami.
W trakcie przełączania szlabanu nie analizujemy stanu zgłoszeń od pojazdów.
Proces dróżnika po zmianie świateł na "zielone", po uzyskaniu potwierdzenia
wjazdu pojazdu w strefę skrzyżówania, wraca do analizy zgłoszeń.
Obok 'opuszczonego' szlabanu ma 'mrugać' światło czerwone (dwa cykle z czerwonym
tłem, dwa cykle z czarnym).
Szlabany mają się zmieniać jednocześnie z pojazdami opuszczającymi skrzyżowanie.
W programie zarządcy zdefiniowane są następujące funkcje:
awaria_wizji(),
awaria_zasobów(), koniec(), main().
powrót
4.
Proces klienta: samochód/pociąg/barka
Przykładowy sposób wywołania procesu klienta, plik
wykonywalny o nazwie ppp:
....$
ppp p1
p2
p3
p4
&
....$
ppp
A
30 1 2 &
gdzie poszczególne parametry oznaczają:
parametr
p1: znak ASCII z przedziału 'A'..'Z', który
będzie nazwą procesu klienta (wyświetlaną na ekranie przez odpowiedni proces),
parametr
p2: czas
opóźnienia startu procesu COP, równy wartości z
przedziału [0..40] razy 1 sekunda, do generowania czasu nalezy wykorzystać
funkcje systemowe,
parametr
p3:
wjazd, z
którego zaczyna się proces klienta. Wjazdów mamy
3, są ponumerowane. Parametr ten przyjmuje wartość [1..3],
parametr
p4: czas jazdy pojazdu (po
"kratce", funkcja opozn() ), parametr ten przyjmuje wartość z przedziału [1..30] razy
DT, czas DT=0.25 sek wygenerować programowo.
Samochody mają dwa znaki
ASCII, zaś pociągi trzy znaki ASCII.
Pojazdy zgłaszają
& - oznacza, że dany proces będzie wywoływany "w tle".
Po uruchomieniu, proces pojazdu wykonuje następujące czynności:
- wykonuje
funkcję sleep() o wartości COP,
- wybiera drogę,
- wysyła komunikat
o zwiększeniu odpowiedniego licznika procesów oczekujących na
wizualizację na
odpowiednim wjeździe
(wjazd) do procesu
wizualizacji (liczba ta jest wyświetlana na odpowiednim wjeździe, numer
wjazdu to parametr p2),
- wysyła zapytanie o pierwszy odcinek drogi do serwera zasobów,
- wysyła komunikat o zmniejszeniu odpowiedniego licznika pojazdów oczekujących i
wyświetleniu znaku ASCII na ekranie (pojazd wyjeżdża),
- funkcja opozn(),
- ...
- wysyła komunikat o wyświetleniu 2-ch znaków ASCII do
serwera wizji,
- wysyła komunikat o zwolnieniu odcinka drogi do serwera zasobów,
- funkcja opozn(),
- ...
- wysyła komunikat o zwiększeniu licznika zgłoszeń przy skrzyżowaniu do serwera
zasobów,
- ...
- wysyła komunikat o wyświetleniu 2-ch znaków ASCII do serwera wizji,
- wysyła komunikat o zwolnieniu odcinka drogi do serwera zasobów,
- funkcja opozn(),
- wysyła komunikat z zapytaniem o stan światła do serwera zasobów,
- wysyła komunikat o zmniejszeniu licznika zgłoszeń i jednocześnie o zwiększeniu
licznika zajętości skrzyżowania do serwera zasobów,
- wysyła komunikat z zapytaniem o odcinek drogi do serwera zasobów,
- wysyła komunikat o wyświetleniu 2-ch znaków ASCII do serwera wizji,
-- po przejechaniu całej planszy - pojazd kończy działanie
powrót