Sprawozdanie z Programowania wsp¢ˆbie¾nego doc


SPRAWOZDANIE Z ZADANIA ZALICZENIOWEGO Z LABORATORIUM PROGRAMOWANIA WSPÓŁBIEŻNEGO

TEMAT:

PĘTLA AUTOBUSOWA WAT”

PRACĘ WYKONAŁ

ZAŁOŻENIA:

Problem polega na symulacji jazdy autobusów w pobliżu pętli autobusowej Stare Bemowo. Zadaniem jest takie kierowanie ruchem, aby nie dochodziło do zderzeń i najeżdżania na siebie autobusów.

Autobusy wymagają synchronizacji w trzech punktach:

-skrzyżowanie Kaliskiego z wjazdem na pętle,

-skrzyżowanie Radiowej z Ebro i wyjazdem z pętli,

-pętli samej w sobie.

Ze względu na przejrzystość prezentacji dokonano modyfikacji kształtu ulic otaczających pętle, w szczególności zaś zrównano ze sobą wyjazd z pętli i ulicę Ebro (skrzyżowanie ze światłami), co nie miało zasadniczego wpływu na zachowanie autobusów. Kwestie rozpatrywano dla pięciu linii autobusowych:

-Kaliskiego-Radiowa (np. linia 105),

-Radiowa-Kaliskiego (np. linia 310),

-Kaliskiego ze zjazdem na pętle (np. linia 109),

-Radiowa ze zjazdem na pętle (np. linia 523),

-linia nocna (601).

Ze względu na i tak dużą złożoność obliczeniową pominięto zagwarantowanie bezpieczeństwa autobusów poza miejscami synchronizacji, ograniczając się jedynie do uniemożliwienia całkowitego pokrywania się (wyprzedzania) autobusów (są tam skrzyżowania i podwójna ciągła linia).

W rozwiązaniu z semaforami przyjęto, że każde skrzyżowanie jest podzielone na cztery sekcje (od 1 do 4 licząc wierszami od lewej), dodatkowo na skrzyżowaniu Kaliskiego dołożono semafor ograniczający możliwość skrętu w lewo autobusom nadjeżdżającym od strony skrzyżowania z Radiową. Pętla jest chroniona semaforami wjazdu i wyjazdu.

W drugim rozwiązaniu każde skrzyżowanie podzielono na dwa pasy: prawy i lewy. Każdy z tych pasów jest zadaniem udostępniającym wejścia autobusom nadjeżdżającym z obu stron. W zależności od pasa wyróżniamy:

-wejście będące prostym przejazdem przez skrzyżowanie,

-wejście będące skrętem na skrzyżowaniu,

-wejście umożliwiające przecięcie danego pasa.

Do synchronizacji wykorzystywane są także dwa zadania:

-światła - symulujące sygnalizację świetlną na skrzyżowaniu Radiowa-Ebro,

-doba - symulująca zmianę pory dnia, co ogranicza poruszanie się autobusów zwykłych autobusu linii nocnej.

WYKAZ ZASOBÓW WSPÓŁDZIELONYCH:

W rozwiązaniu z semaforami wyróżnia się:

1. Ekran, co wynika z treści założeń zadania.

2. Cztery pola na skrzyżowaniu ulicy Kaliskiego z wjazdem na pętle.

3. Cztery pola na skrzyżowaniu ulicy Radiowej z wyjazdem z pętli.

4. Pętla, a dokładniej zadeklarowana na początku ilość postojów na niej (od jednego do czterech ze względu na wielkość ekranu) oraz wyjazd z i wjazd na nią.

5. Poszczególne pola ulic Kaliskiego i Radiowej.

W rozwiązaniu na spotkaniach wyróżnia się:

1. Ekran, co wynika z treści założeń zadania.

2. Dwa pasy na skrzyżowaniu ulicy Kaliskiego z wjazdem na pętle.

3. Dwa pasy na skrzyżowaniu ulicy Radiowej z wyjazdem z pętli.

4. Pętla, a dokładniej zadeklarowana na początku ilość postojów na niej (od jednego do czterech ze względu na wielkość ekranu) oraz wyjazd z i wjazd na nią.

5. Poszczególne pola ulic Kaliskiego i Radiowej.

WYKAZ SEKCJI KRYTYCZNYCH:

  1. Wypisywanie na ekran pozycji lub czyszczenie starej pozycji na ekranie w polu nie objętym synchronizacją.

  2. W wypadku rozwiązania na semaforach: wypisanie się na dowolnym polu należącym do dowolnego skrzyżowania.

  3. W wypadku rozwiązania na spotkaniach: przejazd(wypisanie się na kolejnych polach) jednego z zadeklarowanych pasów.

  4. Wypisanie się na dowolnym z pól pętli lub na wjeździe na lub wyjeździe z niej.

WYKAZ OBIEKTÓW SYNCHRONIZACJI:

W rozwiązaniu z semaforami

1. Osiem semaforów binarnych chroniących poszczególne pola obu skrzyżowań.

2. Jeden semafor chroniący wjazd na pętle.

3. Semafory chroniące wyjazd z pętli.

4. Zadania symulujące zmianę świateł i pór dnia.

W rozwiązaniu na spotkaniach

1. Cztery spotkania chroniące poszczególne pasy ruchu na skrzyżowaniach.

2. Zmienne chroniące wjazd i zjazd z pętli wykorzystywane przez w/w spotkania.

3. Zadania symulujące zmianę świateł i pór dnia.

WYKAZ PROCESÓW SEKWENCYJNYCH:

  1. Procesy odpowiadające poszczególnym linią autobusowym należące do czterech typów będących trasami ich przejazdu:

-Kaliskiego-Radiowa,

-Radiowa-Kaliskiego,

-Kaliskiego ze zjazdem na pętle,

-Radiowa ze zjazdem na pętle,

-linia nocna.

2. Proces odpowiadający za zmianę pór dnia.

3. Proces odpowiedzialny za zmianę świateł na skrzyżowaniu Radiowa-Ebro.

4. W rozwiązaniu na spotkaniach dodatkowo występują procesy odpowiedzialne za

synchronizację poszczególnych pasów na skrzyżowaniach.

STANY PROCESÓW SEKWENCYJNYCH:

  1. Autobusy mogą znajdować się w następujących stanach:

-oczekiwanie na wpuszczenie na dane pole dojazdu do lub odjazdu od obiektu synchronizacji,

-wypisywania lub czyszczenia swojej nazwy,

-oczekiwania na wpuszczenie na dane skrzyżowanie (lub jego pole),

-przejazdu przez skrzyżowanie,

-dla autobusów skręcających na pętle:

-oczekiwanie na wjazd na pętle,

-pobyt na pętli,

-oczekiwanie na zwolnienie się wyjazdu z pętli,

-oczekiwania na porę dnia, w której dany autobus jeździ.

  1. Światła mogą znajdować się w stanach:

- sygnalizacji światła zielonego dla Radiowej,

- sygnalizacji światła zielonego dla Ebro.

  1. Doba może, zasadniczo, znajdować się tylko w stanie oczekiwania na zakończenie odpowiedniej pory dnia i sygnalizacji tej zmiany.

  2. W rozwiązaniu na spotkaniach zadania symulujące pasy są w nieskończonej pętli oczekiwania na autobusy deklarujące chęć przejazdu przez dane skrzyżowanie.

LISTING PROGRAMU:

Semafory:

with Sem83;

use Sem83;

with Winconsoleex;

use Winconsoleex;

with Procpom;

use Procpom;

procedure Watsem is

Swiat : Integer := 6;

Dzien : Boolean := True;

Miejsca_Na_Petli : Integer := 4;

Skretnapetle : Binary_Semaphore := Init (1);

Wyjazd : Binary_Semaphore := Init (0);

Wolny_Wyjazd : Binary_Semaphore := Init (1);

Wjazd : Semaphore := Init (Miejsca_Na_Petli);

Rysuj : Boolean := True;

Dlugosc_Dnia : Integer := 5000;

Dlugosc_Nocy : Integer := 5000;

N : Integer := 0;

Prawykal : array (1 .. 6) of Integer := (others => 1);

Lewykal : array (1 .. 6) of Integer := (others => 1);

Prawyrad : array (1 .. 6) of Integer := (others => 1);

Lewyrad : array (1 .. 6) of Integer := (others => 1);

Radkal : array (0 .. 37) of Integer := (others => 1);

Kalrad : array (0 .. 31) of Integer := (others => 1);

Skrzyzkal1,

Skrzyzkal2,

Skrzyzkal3,

Skrzyzkal4 : Binary_Semaphore := Init (1);

Skrzyzrad1,

Skrzyzrad2,

Skrzyzrad3,

Skrzyzrad4 : Binary_Semaphore := Init (1);

task Doba;

task type Autobus_Kaliskiegopetla(Nr,Skp, Okp: Integer);

task type Autobus_Radiowapetla(Nr, Srp, Orp: Integer);

task type Autobus_Kaliskiegoradiowa(Nr, Skr, Okr: Integer);

task type Autobus_Radiowakaliskiego(Nr, Srk, Ork: Integer);

task type Autobus_Nocny(Nr, On: Integer);

task Swiatla;

task body Doba is

Dlugoscdnia,

Dlugoscnocy : Duration;

begin

Dlugoscdnia:=Duration(Float(Dlugosc_Dnia)/100.0);

Dlugoscnocy:=Duration(Float(Dlugosc_Nocy)/100.0);

loop

if Dzien=True then

delay Dlugoscdnia;

Dzien:=False;

else

delay Dlugoscnocy;

Dzien:=True;

end if;

end loop;

end Doba;

task body Swiatla is

L : Integer := 0;

begin

loop

exit when Rysuj=False;

end loop;

loop

Swiatla1;

Skrzyzrad1:=Init(0);

Skrzyzrad4:=Init(0);

while L<Swiat loop

Signal(Wyjazd);

delay 0.5;

L:=L+1;

end loop;

L:=0;

Swiatla2;

Wyjazd:=Init(0);

while L<Swiat loop

Signal(Skrzyzrad1);

Signal(Skrzyzrad4);

delay 0.5;

L:=L+1;

end loop;

L:=0;

end loop;

end Swiatla;

procedure Napetli (

Nra : Integer ) is

K : Integer;

begin

K:=N;

Pisz(Nra,12+3*N,35);

N:=(N+1) mod Miejsca_Na_Petli;

delay 2.0;

Wait(Wolny_Wyjazd);

Wait(Wyjazd);

Signal(Wjazd);

Czysc(12+3*K,35);

end Napetli;

procedure Kaliskiegolewy (

Nra : Integer ) is

begin

for Z in 2..6 loop

loop

if Lewykal(Z)=1 then

exit;

end if;

end loop;

Czysc((17+Z),21);

Pisz(Nra,(18+Z),21);

Lewykal(Z-1):=1;

delay 0.2;

end loop;

Czysc(24,21);

Lewykal(6):=1;

end Kaliskiegolewy;

procedure Radiowalewy (

Nra : Integer ) is

begin

for Z in 2..6 loop

loop

if Lewyrad(Z)=1 then

Lewyrad(Z):=0;

exit;

end if;

end loop;

Czysc((17+Z),46);

Pisz(Nra,(18+Z),46);

Lewyrad(Z-1):=1;

delay 0.2;

end loop;

Czysc(24,46);

Lewyrad(6):=1;

end Radiowalewy;

procedure Radiowaprawy (

Nra : Integer ) is

begin

loop

if Prawyrad(1)=1 then

Prawyrad(1):=0;

exit;

end if;

end loop;

Pisz(Nra,24,49);

delay 0.2;

for Z in 2..6 loop

loop

if Prawyrad(Z)=1 then

Prawyrad(Z):=0;

exit;

end if;

end loop;

Czysc((26-Z),49);

Pisz(Nra,(25-Z),49);

Prawyrad(Z-1):=1;

delay 0.2;

end loop;

end Radiowaprawy;

procedure Kaliskiegoprawy (

Nra : Integer ) is

begin

loop

if Prawykal(1)=1 then

Prawykal(1):=0;

exit;

end if;

end loop;

Pisz(Nra,24,24);

delay 0.2;

for Z in 2..6 loop

loop

if Prawykal(Z)=1 then

Prawykal(Z):=0;

exit;

end if;

end loop;

Czysc((26-Z),24);

Pisz(Nra,(25-Z),24);

Prawykal(Z-1):=1;

delay 0.2;

end loop;

end Kaliskiegoprawy;

procedure Radiowakaliskiego (

Nra : Integer ) is

begin

loop

if Radkal(1)=1 then

Radkal(1):=0;

exit;

end if;

end loop;

Czysc(16,49);

Pisz(Nra,15,49);

Radkal(0):=1;

delay 0.2;

for I in 2..5 loop

loop

if Radkal(I)=1 then

Radkal(I):=0;

exit;

end if;

end loop;

Czysc(17-I,49);

Pisz(Nra,16-I,49);

Radkal(I-1):=1;

delay 0.2;

end loop;

for I in 1..8 loop

loop

if Radkal(5+I)=1 then

Radkal(5+I):=0;

exit;

end if;

end loop;

Czysc(12-I,50-I);

Pisz(Nra,11-I,49-I);

Radkal(I+4):=1;

delay 0.2;

end loop;

for I in 1..11 loop

loop

if Radkal(13+I)=1 then

Radkal(13+I):=0;

exit;

end if;

end loop;

Czysc(3,42-I);

Pisz(Nra,3,41-I);

Radkal(I+12):=1;

delay 0.2;

end loop;

for I in 1..9 loop

loop

if Radkal(24+I)=1 then

Radkal(24+I):=0;

exit;

end if;

end loop;

Czysc(2+I,31-I);

Pisz(Nra,3+I,30-I);

Radkal(I+23):=1;

delay 0.2;

end loop;

for I in 1..4 loop

loop

if Radkal(33+I)=1 then

Radkal(33+I):=0;

exit;

end if;

end loop;

Czysc(11+I,21);

Pisz(Nra,12+I,21);

Radkal(I+32):=1;

delay 0.2;

end loop;

end Radiowakaliskiego;

procedure Kaliskiegoradiowa (

Nra : Integer ) is

begin

loop

if Kalrad(1)=1 then

Kalrad(1):=0;

exit;

end if;

end loop;

Czysc(16,24);

Pisz(Nra,15,24);

Kalrad(0):=1;

delay 0.2;

for I in 2..4 loop

loop

if Kalrad(I)=1 then

Kalrad(I):=0;

exit;

end if;

end loop;

Czysc(17-I,24);

Pisz(Nra,16-I,24);

Kalrad(I-1):=1;

delay 0.2;

end loop;

for I in 1..8 loop

loop

if Kalrad(4+I)=1 then

Kalrad(4+I):=0;

exit;

end if;

end loop;

Czysc(13-I,23+I);

Pisz(Nra,12-I,24+I);

Kalrad(I+3):=1;

delay 0.2;

end loop;

for I in 1..7 loop

loop

if Kalrad(12+I)=1 then

Kalrad(12+I):=0;

exit;

end if;

end loop;

Czysc(4,31+I);

Pisz(Nra,4,32+I);

Kalrad(I+11):=1;

delay 0.2;

end loop;

for I in 1..7 loop

loop

if Kalrad(19+I)=1 then

Kalrad(19+I):=0;

exit;

end if;

end loop;

Czysc(3+I,38+I);

Pisz(Nra,4+I,39+I);

Kalrad(I+18):=1;

delay 0.2;

end loop;

for I in 1..5 loop

loop

if Kalrad(26+I)=1 then

Kalrad(26+I):=0;

exit;

end if;

end loop;

Czysc(10+I,46);

Pisz(Nra,11+I,46);

Kalrad(I+25):=1;

delay 0.2;

end loop;

end Kaliskiegoradiowa;

--------------------------------------------AUTOBUS_NOCNY------------------------------------------------------------------

task body Autobus_Nocny is

K : Integer := 0;

Dn : Duration;

begin

loop

exit when Rysuj=False;

end loop;

Dn:=Duration(Float(On)/100.0);

loop

while Dzien=False loop

Radiowaprawy(Nr);

Wait(Skrzyzrad4);

Czysc(19,49);

Pisz(Nr,18,49);

Prawyrad(6):=1;

delay 0.2;

Wait(Skrzyzrad2);

Czysc(18,49);

Pisz(Nr,17,49);

Signal(Skrzyzrad4);

delay 0.2;

loop

if Radkal(0)=1 then

Radkal(0):=0;

exit;

end if;

end loop;

Czysc(17,49);

Pisz(Nr,16,49);

Signal(Skrzyzrad2);

delay 0.2;

Radiowakaliskiego(Nr);

Wait(Skrzyzkal1);

Czysc(16,21);

Pisz(Nr,17,21);

Radkal(37):=1;

delay 0.2;

Wait(Skrzyzkal3);

Czysc(17,21);

Pisz(Nr,18,21);

Signal(Skrzyzkal1);

delay 0.2;

loop

if Lewykal(1)=1 then

Lewykal(1):=0;

exit;

end if;

end loop;

Czysc(18,21);

Pisz(Nr,19,21);

Signal(Skrzyzkal3);

delay 0.2;

Kaliskiegolewy(Nr);

delay Dn;

Kaliskiegoprawy(Nr);

Skretnapetle:=Init(0);

Wait(Skrzyzkal4);

Czysc(19,24);

Pisz(Nr,18,24);

Prawykal(6):=1;

delay 0.2;

Wait(Skrzyzkal2);

Czysc(18,24);

Pisz(Nr,17,24);

Signal(Skrzyzkal4);

delay 0.2;

loop

if Kalrad(0)=1 then

Kalrad(0):=0;

exit;

end if;

end loop;

Czysc(17,24);

Pisz(Nr,16,24);

Signal(Skrzyzkal2);

delay 0.2;

Kaliskiegoradiowa(Nr);

Wait(Skrzyzrad1);

Czysc(16,46);

Pisz(Nr,17,46);

Kalrad(31):=1;

delay 0.2;

Wait(Skrzyzrad3);

Czysc(17,46);

Pisz(Nr,18,46);

Signal(Skrzyzkal1);

Signal(Skretnapetle);

delay 0.2;

loop

if Lewyrad(1)=1 then

Lewyrad(1):=0;

exit;

end if;

end loop;

Czysc(18,46);

Pisz(Nr,19,46);

Signal(Skrzyzrad3);

delay 0.2;

Radiowalewy(Nr);

delay Dn;

end loop;

end loop;

end Autobus_Nocny;

------------------------------------------------KALISKIEGO-PETLA----------------------------------------------------

task body Autobus_Kaliskiegopetla is

Dkp : Duration;

Ckp : Duration;

begin

loop

exit when Rysuj=False;

end loop;

Ckp:=Duration(Float(Okp)/100.0);

Dkp:=Duration(Float(Skp)/100.0);

delay Dkp;

loop

while Dzien=True loop

Kaliskiegoprawy(Nr);

Skretnapetle:=Init(0);

Wait(Skrzyzkal4);

Czysc(19,24);

Pisz(Nr,18,25);

Prawykal(6):=1;

delay 0.2;

Czysc(18,25);

Pisz(Nr,18,26);

delay 0.2;

Czysc(18,26);

Pisz(Nr,18,27);

delay 0.2;

Czysc(18,27);

Signal(Skrzyzkal4);

Signal(Skretnapetle);

Napetli(Nr);

Pisz(Nr,17,43);

delay 0.2;

Skrzyzrad2:=Init(0);

for Z in 43..48 loop

Czysc(17,Z);

Pisz(Nr,17,Z+1);

delay 0.2;

end loop;

Signal(Wolny_Wyjazd);

loop

if Radkal(0)=1 then

Radkal(0):=0;

exit;

end if;

end loop;

Czysc(17,49);

Pisz(Nr,16,49);

Signal(Skrzyzrad2);

delay 0.2;

Radiowakaliskiego(Nr);

Wait(Skrzyzkal1);

Czysc(16,21);

Pisz(Nr,17,21);

Radkal(37):=1;

delay 0.2;

Wait(Skrzyzkal3);

Czysc(17,21);

Pisz(Nr,18,21);

Signal(Skrzyzkal1);

delay 0.2;

loop

if Lewykal(1)=1 then

Lewykal(1):=0;

exit;

end if;

end loop;

Czysc(18,21);

Pisz(Nr,19,21);

Signal(Skrzyzkal3);

delay 0.2;

Kaliskiegolewy(Nr);

delay Ckp;

end loop;

end loop;

end Autobus_Kaliskiegopetla;

-----------------------------------------------------RADIOWA-PETLA-----------------------------------------------------

task body Autobus_Radiowapetla is

Drp : Duration;

Crp : Duration;

begin

loop

exit when Rysuj=False;

end loop;

Drp:=Duration(Float(Srp)/100.0);

Crp:=Duration(Float(Srp)/100.0);

delay Drp;

loop

while Dzien=True loop

Radiowaprawy(Nr);

Wait(Skrzyzrad4);

Czysc(19,49);

Pisz(Nr,18,49);

Prawyrad(6):=1;

delay 0.2;

Wait(Skrzyzrad2);

Czysc(18,49);

Pisz(Nr,17,49);

Signal(Skrzyzrad4);

delay 0.2;

loop

if Radkal(0)=1 then

Radkal(0):=0;

exit;

end if;

end loop;

Czysc(17,49);

Pisz(Nr,16,49);

Signal(Skrzyzrad2);

delay 0.2;

Radiowakaliskiego(Nr);

Wait(Skrzyzkal1);

Wait(Skrzyzkal3);

Czysc(16,21);

Pisz(Nr,17,21);

Radkal(37):=1;

delay 0.2;

Wait(Skretnapetle);

Skrzyzkal4:=Init(0);

Czysc(17,21);

Pisz(Nr,18,22);

Signal(Skrzyzkal1);

delay 0.2;

Wait(Wjazd);

for T in 22..26 loop

Czysc(18,T);

Pisz(Nr,18,T+1);

delay 0.2;

end loop;

Czysc(18,27);

Signal(Skrzyzkal3);

Signal(Skrzyzkal4);

Signal(Skretnapetle);

Napetli(Nr);

Pisz(Nr,18,43);

delay 0.2;

Wait(Skrzyzrad3);

Czysc(18,43);

Pisz(Nr,18,44);

delay 0.2;

Czysc(18,44);

Pisz(Nr,18,45);

delay 0.2;

Czysc(18,45);

Pisz(Nr,18,46);

delay 0.2;

Signal(Wolny_Wyjazd);

loop

if Lewyrad(1)=1 then

Lewyrad(1):=0;

exit;

end if;

end loop;

Czysc(18,46);

Pisz(Nr,19,46);

Signal(Skrzyzrad3);

delay 0.2;

Radiowalewy(Nr);

delay Crp;

end loop;

end loop;

end Autobus_Radiowapetla;

----------------------------------------------------------------KALISKIEGO-RADIOWA-------------------------------------------

task body Autobus_Kaliskiegoradiowa is

Dkr : Duration;

Ckr : Duration;

begin

loop

exit when Rysuj=False;

end loop;

Dkr:=Duration(Float(Skr)/100.0);

Ckr:=Duration(Float(Okr)/100.0);

delay Dkr;

loop

while Dzien=True loop

Kaliskiegoprawy(Nr);

Skretnapetle:=Init(0);

Wait(Skrzyzkal4);

Czysc(19,24);

Pisz(Nr,18,24);

Prawykal(6):=1;

delay 0.2;

Wait(Skrzyzkal2);

Czysc(18,24);

Pisz(Nr,17,24);

Signal(Skrzyzkal4);

Signal(Skretnapetle);

delay 0.2;

loop

if Kalrad(0)=1 then

Kalrad(0):=0;

exit;

end if;

end loop;

Czysc(17,24);

Pisz(Nr,16,24);

Signal(Skrzyzkal2);

delay 0.2;

Kaliskiegoradiowa(Nr);

Wait(Skrzyzrad1);

Czysc(16,46);

Pisz(Nr,17,46);

Kalrad(31):=1;

delay 0.2;

Wait(Skrzyzrad3);

Czysc(17,46);

Pisz(Nr,18,46);

Signal(Skrzyzrad1);

delay 0.2;

loop

if Lewyrad(1)=1 then

Lewyrad(1):=0;

exit;

end if;

end loop;

Czysc(18,46);

Pisz(Nr,19,46);

Signal(Skrzyzrad3);

delay 0.2;

Radiowalewy(Nr);

delay Ckr;

end loop;

end loop;

end Autobus_Kaliskiegoradiowa;

----------------------------------------------RADIOWA-KALISKIEGO------------------------------------------------------

task body Autobus_Radiowakaliskiego is

Drk : Duration;

Crk : Duration;

begin

loop

exit when Rysuj=False;

end loop;

Drk:=Duration(Float(Srk)/100.0);

delay Drk;

Crk:=Duration(Float(Ork)/100.0);

loop

while Dzien=True loop

Radiowaprawy(Nr);

Wait(Skrzyzrad4);

Czysc(19,49);

Pisz(Nr,18,49);

Prawyrad(6):=1;

delay 0.2;

Wait(Skrzyzrad2);

Czysc(18,49);

Pisz(Nr,17,49);

Signal(Skrzyzrad4);

delay 0.2;

loop

if Radkal(0)=1 then

Radkal(0):=0;

exit;

end if;

end loop;

Czysc(17,49);

Pisz(Nr,16,49);

Signal(Skrzyzrad2);

delay 0.2;

Radiowakaliskiego(Nr);

Wait(Skrzyzkal1);

Czysc(16,21);

Pisz(Nr,17,21);

Radkal(37):=1;

delay 0.2;

Wait(Skrzyzkal3);

Czysc(17,21);

Pisz(Nr,18,21);

Signal(Skrzyzkal1);

delay 0.2;

loop

if Lewykal(1)=1 then

Lewykal(1):=0;

exit;

end if;

end loop;

Czysc(18,21);

Pisz(Nr,19,21);

Signal(Skrzyzkal3);

delay 0.2;

Kaliskiegolewy(Nr);

delay Crk;

end loop;

end loop;

end Autobus_Radiowakaliskiego;

Aut : Autobus_Radiowakaliskiego (105, 150, 200);

Aut2 : Autobus_Kaliskiegoradiowa (105, 50, 200);

Aut3 : Autobus_Radiowapetla (523, 345, 233);

Aut4 : Autobus_Kaliskiegopetla (109, 200, 433);

Aut5 : Autobus_Radiowakaliskiego (310, 90, 200);

Aut6 : Autobus_Kaliskiegoradiowa (310, 240, 200);

Aut7 : Autobus_Nocny (601, 130);

Aut8 : Autobus_Kaliskiegopetla (109, 200, 433);

Aut9 : Autobus_Kaliskiegopetla (109, 200, 433);

Aut10 : Autobus_Radiowapetla (523, 345, 233);

Aut11 : Autobus_Radiowapetla (523, 345, 233);

Aut12 : Autobus_Radiowapetla (523, 345, 233);

Aut13 : Autobus_Kaliskiegopetla (109, 200, 433);

begin

Cursoroff;

Ulice(Miejsca_Na_Petli);

Rysuj:=False;

end Watsem;

Spotkania:

with Winconsoleex;

use Winconsoleex;

with Procpom;

use Procpom;

procedure WATspot is

Poziom : Boolean := False;

Pion : Boolean := False;

Dzien : Boolean := True;

Wolny_Wyjazd : Boolean := True;

Rysuj : Boolean := True;

Miejsca_Na_Petli : Integer := 3;

Wolne_Miejsca : Integer := Miejsca_Na_Petli;

Swiatlo : Integer := 600;

Dlugosc_Dnia : Integer := 5000;

Dlugosc_Nocy : Integer := 5000;

N : Integer := 0;

Prawykal : array (1 .. 6) of Integer := (others => 1);

Lewykal : array (1 .. 6) of Integer := (others => 1);

Prawyrad : array (1 .. 6) of Integer := (others => 1);

Lewyrad : array (1 .. 6) of Integer := (others => 1);

Radkal : array (0 .. 37) of Integer := (others => 1);

Kalrad : array (0 .. 31) of Integer := (others => 1);

task Doba;

task type Autobus_Kaliskiegopetla(Nr,Skp, Okp: Integer);

task type Autobus_Radiowapetla(Nr, Srp, Orp: Integer);

task type Autobus_Kaliskiegoradiowa(Nr, Skr, Okr: Integer);

task type Autobus_Radiowakaliskiego(Nr, Srk, Ork: Integer);

task type Autobus_Nocny(Nr, On: Integer);

task Swiatla;

task Kaliskiego_Lewy is

entry Odjazd (

Nr : Integer );

entry Skret (

Nr : Integer );

end Kaliskiego_Lewy;

task Kaliskiego_Prawy is

entry Przejazd (

Nr : Integer );

entry Skret (

Nr : Integer );

entry Przeciecie (

Nr : Integer );

end Kaliskiego_Prawy;

task Radiowa_Lewy is

entry Przejazd (

Nr : Integer );

entry Skret_Gora (

Nr : Integer );

entry Skret_Dol (

Nr : Integer );

end Radiowa_Lewy;

task Radiowa_Prawy is

entry Przejazd (

Nr : Integer );

entry Przeciecie (

Nr : Integer );

end Radiowa_Prawy;

------------------------------------------------------------KALISKIEGO LEWY-----------------------------------------

task body Kaliskiego_Lewy is

begin

loop

select

accept Odjazd (

Nr : Integer ) do

Czysc(16,21);

Pisz(Nr,17,21);

Radkal(37):=1;

delay 0.2;

Czysc(17,21);

Pisz(Nr,18,21);

delay 0.2;

loop

if Lewykal(1)=1 then

Lewykal(1):=0;

exit;

end if;

end loop;

Czysc(18,21);

Pisz(Nr,19,21);

delay 0.2;

end Odjazd;

or

accept Skret (

Nr : Integer ) do

Czysc(16,21);

Pisz(Nr,17,21);

Radkal(37):=1;

delay 0.2;

Kaliskiego_Prawy.Przeciecie(Nr);

end Skret;

or

delay 0.1;

end select;

end loop;

end Kaliskiego_Lewy;

-------------------------------------------KALISKIEGO PRAWY-------------------------------------------

task body Kaliskiego_Prawy is

begin

loop

select

accept Przejazd (

Nr : Integer ) do

Czysc(19,24);

Pisz(Nr,18,24);

Prawykal(6):=1;

delay 0.2;

Czysc(18,24);

Pisz(Nr,17,24);

delay 0.2;

loop

if Kalrad(0)=1 then

Kalrad(0):=0;

exit;

end if;

end loop;

Czysc(17,24);

Pisz(Nr,16,24);

delay 0.2;

end Przejazd;

or

when Wolne_Miejsca>0 =>

accept Skret (

Nr : Integer ) do

Czysc(19,24);

Pisz(Nr,18,25);

Prawykal(6):=1;

delay 0.2;

Czysc(18,25);

Pisz(Nr,18,26);

delay 0.2;

Czysc(18,26);

Pisz(Nr,18,27);

delay 0.2;

Czysc(18,27);

Wolne_Miejsca:=Wolne_Miejsca-1;

end Skret;

or

when Wolne_Miejsca>0 =>

accept Przeciecie (

Nr : Integer ) do

Czysc(17,21);

Pisz(Nr,18,22);

delay 0.2;

for T in 22..26 loop

Czysc(18,T);

Pisz(Nr,18,T+1);

delay 0.2;

end loop;

Czysc(18,27);

Wolne_Miejsca:=Wolne_Miejsca-1;

end Przeciecie;

or

delay 0.1;

end select;

end loop;

end Kaliskiego_Prawy;

-----------------------------------------------------RADIOWA LEWY--------------------------------------------------------

task body Radiowa_Lewy is

begin

loop

select

when Poziom=True =>

accept Skret_Gora (

Nr : Integer ) do

Czysc(18,42);

Pisz(Nr,17,43);

delay 0.2;

for Z in 43..45 loop

Czysc(17,Z);

Pisz(Nr,17,Z+1);

delay 0.2;

end loop;

Wolne_Miejsca:=Wolne_Miejsca+1;

Wolny_Wyjazd:=True;

Radiowa_Prawy.Przeciecie(Nr);

end Skret_Gora;

or

when Poziom=True =>

accept Skret_Dol (

Nr : Integer ) do

Czysc(18,42);

Pisz(Nr,18,43);

delay 0.2;

Czysc(18,43);

Pisz(Nr,18,44);

delay 0.2;

Czysc(18,44);

Pisz(Nr,18,45);

delay 0.2;

Czysc(18,45);

Pisz(Nr,18,46);

delay 0.2;

loop

if Lewyrad(1)=1 then

Lewyrad(1):=0;

exit;

end if;

end loop;

Czysc(18,46);

Pisz(Nr,19,46);

delay 0.2;

Wolne_Miejsca:=Wolne_Miejsca+1;

Wolny_Wyjazd:=True;

end Skret_Dol;

or

when Pion=True =>

accept Przejazd (

Nr : Integer ) do

Czysc(16,46);

Pisz(Nr,17,46);

Kalrad(31):=1;

delay 0.2;

Czysc(17,46);

Pisz(Nr,18,46);

delay 0.2;

loop

if Lewyrad(1)=1 then

Lewyrad(1):=0;

exit;

end if;

end loop;

Czysc(18,46);

Pisz(Nr,19,46);

delay 0.2;

end Przejazd;

or

delay 0.1;

end select;

end loop;

end Radiowa_Lewy;

-------------------------------------------RADIOWA PRAWY----------------------------------------------------------------

task body Radiowa_Prawy is

begin

loop

select

accept Przeciecie (

Nr : Integer ) do

Czysc(17,46);

for Z in 46..48 loop

Czysc(17,Z);

Pisz(Nr,17,Z+1);

delay 0.2;

end loop;

loop

if Radkal(0)=1 then

Radkal(0):=0;

exit;

end if;

end loop;

Czysc(17,49);

Pisz(Nr,16,49);

delay 0.2;

end Przeciecie;

or

when Pion=True =>

accept Przejazd (

Nr : Integer ) do

Czysc(19,49);

Pisz(Nr,18,49);

Prawyrad(6):=1;

delay 0.2;

Czysc(18,49);

Pisz(Nr,17,49);

delay 0.2;

loop

if Radkal(0)=1 then

Radkal(0):=0;

exit;

end if;

end loop;

Czysc(17,49);

Pisz(Nr,16,49);

delay 0.2;

end Przejazd;

or

delay 0.1;

end select;

end loop;

end Radiowa_Prawy;

task body Doba is

Dlugoscdnia,

Dlugoscnocy : Duration;

begin

Dlugoscdnia:=Duration(Float(Dlugosc_Dnia)/100.0);

Dlugoscnocy:=Duration(Float(Dlugosc_Nocy)/100.0);

loop

if Dzien=True then

delay Dlugoscdnia;

Dzien:=False;

else

delay Dlugoscnocy;

Dzien:=True;

end if;

end loop;

end Doba;

task body Swiatla is

Czas_Swiatla : Duration;

begin

Czas_Swiatla:=Duration(Float(Swiatlo)/100.0);

loop

exit when Rysuj=False;

end loop;

loop

swiatla1;

Pion:=False;

poziom:=true;

delay Czas_Swiatla;

swiatla2;

Poziom:=False;

Pion:=True;

delay Czas_Swiatla;

end loop;

end Swiatla;

procedure Napetli (

Nra : Integer ) is

K : Integer;

begin

K:=N;

Pisz(Nra,12+3*N,35);

N:=(N+1) mod Miejsca_Na_Petli;

delay 2.0;

loop

if Wolny_Wyjazd=True then

wolny_wyjazd:=false;

exit;

end if;

end loop;

Czysc(12+3*K,35);

Pisz(Nra,18,42);

end Napetli;

procedure Kaliskiegolewy (

Nra : Integer ) is

begin

for Z in 2..6 loop

loop

if Lewykal(Z)=1 then

exit;

end if;

end loop;

Czysc((17+Z),21);

Pisz(Nra,(18+Z),21);

Lewykal(Z-1):=1;

delay 0.2;

end loop;

Czysc(24,21);

Lewykal(6):=1;

end Kaliskiegolewy;

procedure Radiowalewy (

Nra : Integer ) is

begin

for Z in 2..6 loop

loop

if Lewyrad(Z)=1 then

Lewyrad(Z):=0;

exit;

end if;

end loop;

Czysc((17+Z),46);

Pisz(Nra,(18+Z),46);

Lewyrad(Z-1):=1;

delay 0.2;

end loop;

Czysc(24,46);

Lewyrad(6):=1;

end Radiowalewy;

procedure Radiowaprawy (

Nra : Integer ) is

begin

loop

if Prawyrad(1)=1 then

Prawyrad(1):=0;

exit;

end if;

end loop;

Pisz(Nra,24,49);

delay 0.2;

for Z in 2..6 loop

loop

if Prawyrad(Z)=1 then

Prawyrad(Z):=0;

exit;

end if;

end loop;

Czysc((26-Z),49);

Pisz(Nra,(25-Z),49);

Prawyrad(Z-1):=1;

delay 0.2;

end loop;

end Radiowaprawy;

procedure Kaliskiegoprawy (

Nra : Integer ) is

begin

loop

if Prawykal(1)=1 then

Prawykal(1):=0;

exit;

end if;

end loop;

Pisz(Nra,24,24);

delay 0.2;

for Z in 2..6 loop

loop

if Prawykal(Z)=1 then

Prawykal(Z):=0;

exit;

end if;

end loop;

Czysc((26-Z),24);

Pisz(Nra,(25-Z),24);

Prawykal(Z-1):=1;

delay 0.2;

end loop;

end Kaliskiegoprawy;

procedure Radiowakaliskiego (

Nra : Integer ) is

begin

loop

if Radkal(1)=1 then

Radkal(1):=0;

exit;

end if;

end loop;

Czysc(16,49);

Pisz(Nra,15,49);

Radkal(0):=1;

delay 0.2;

for I in 2..5 loop

loop

if Radkal(I)=1 then

Radkal(I):=0;

exit;

end if;

end loop;

Czysc(17-I,49);

Pisz(Nra,16-I,49);

Radkal(I-1):=1;

delay 0.2;

end loop;

for I in 1..8 loop

loop

if Radkal(5+I)=1 then

Radkal(5+I):=0;

exit;

end if;

end loop;

Czysc(12-I,50-I);

Pisz(Nra,11-I,49-I);

Radkal(I+4):=1;

delay 0.2;

end loop;

for I in 1..11 loop

loop

if Radkal(13+I)=1 then

Radkal(13+I):=0;

exit;

end if;

end loop;

Czysc(3,42-I);

Pisz(Nra,3,41-I);

Radkal(I+12):=1;

delay 0.2;

end loop;

for I in 1..9 loop

loop

if Radkal(24+I)=1 then

Radkal(24+I):=0;

exit;

end if;

end loop;

Czysc(2+I,31-I);

Pisz(Nra,3+I,30-I);

Radkal(I+23):=1;

delay 0.2;

end loop;

for I in 1..4 loop

loop

if Radkal(33+I)=1 then

Radkal(33+I):=0;

exit;

end if;

end loop;

Czysc(11+I,21);

Pisz(Nra,12+I,21);

Radkal(I+32):=1;

delay 0.2;

end loop;

end Radiowakaliskiego;

procedure Kaliskiegoradiowa (

Nra : Integer ) is

begin

loop

if Kalrad(1)=1 then

Kalrad(1):=0;

exit;

end if;

end loop;

Czysc(16,24);

Pisz(Nra,15,24);

Kalrad(0):=1;

delay 0.2;

for I in 2..4 loop

loop

if Kalrad(I)=1 then

Kalrad(I):=0;

exit;

end if;

end loop;

Czysc(17-I,24);

Pisz(Nra,16-I,24);

Kalrad(I-1):=1;

delay 0.2;

end loop;

for I in 1..8 loop

loop

if Kalrad(4+I)=1 then

Kalrad(4+I):=0;

exit;

end if;

end loop;

Czysc(13-I,23+I);

Pisz(Nra,12-I,24+I);

Kalrad(I+3):=1;

delay 0.2;

end loop;

for I in 1..7 loop

loop

if Kalrad(12+I)=1 then

Kalrad(12+I):=0;

exit;

end if;

end loop;

Czysc(4,31+I);

Pisz(Nra,4,32+I);

Kalrad(I+11):=1;

delay 0.2;

end loop;

for I in 1..7 loop

loop

if Kalrad(19+I)=1 then

Kalrad(19+I):=0;

exit;

end if;

end loop;

Czysc(3+I,38+I);

Pisz(Nra,4+I,39+I);

Kalrad(I+18):=1;

delay 0.2;

end loop;

for I in 1..5 loop

loop

if Kalrad(26+I)=1 then

Kalrad(26+I):=0;

exit;

end if;

end loop;

Czysc(10+I,46);

Pisz(Nra,11+I,46);

Kalrad(I+25):=1;

delay 0.2;

end loop;

end Kaliskiegoradiowa;

--------------------------------------------AUTOBUS_NOCNY------------------------------------------------------------------

task body Autobus_Nocny is

K : Integer := 0;

Dn : Duration;

begin

loop

exit when Rysuj=False;

end loop;

Dn:=Duration(Float(On)/100.0);

loop

while Dzien=False loop

Radiowaprawy(Nr);

Radiowa_Prawy.Przejazd(Nr);

Radiowakaliskiego(Nr);

Kaliskiego_Lewy.Odjazd(Nr);

Kaliskiegolewy(Nr);

delay Dn;

Kaliskiegoprawy(Nr);

Kaliskiego_Prawy.Przejazd(Nr);

Kaliskiegoradiowa(Nr);

Radiowa_Lewy.Przejazd(Nr);

Radiowalewy(Nr);

delay Dn;

end loop;

end loop;

end Autobus_Nocny;

------------------------------------------------KALISKIEGO-PETLA----------------------------------------------------

task body Autobus_Kaliskiegopetla is

Dkp : Duration;

Ckp : Duration;

begin

loop

exit when Rysuj=False;

end loop;

Ckp:=Duration(Float(Okp)/100.0);

Dkp:=Duration(Float(Skp)/100.0);

delay Dkp;

loop

while Dzien=True loop

Kaliskiegoprawy(Nr);

Kaliskiego_Prawy.Skret(Nr);

Napetli(Nr);

Radiowa_Lewy.Skret_Gora(Nr);

Radiowakaliskiego(Nr);

Kaliskiego_Lewy.Odjazd(Nr);

Kaliskiegolewy(Nr);

delay Ckp;

end loop;

end loop;

end Autobus_Kaliskiegopetla;

-----------------------------------------------------RADIOWA-PETLA-----------------------------------------------------

task body Autobus_Radiowapetla is

Drp : Duration;

Crp : Duration;

begin

loop

exit when Rysuj=False;

end loop;

Drp:=Duration(Float(Srp)/100.0);

Crp:=Duration(Float(Srp)/100.0);

delay Drp;

loop

while Dzien=True loop

Radiowaprawy(Nr);

Radiowa_Prawy.Przejazd(Nr);

Radiowakaliskiego(Nr);

Kaliskiego_Lewy.Skret(Nr);

Napetli(Nr);

Radiowa_Lewy.Skret_Dol(Nr);

Radiowalewy(Nr);

delay Crp;

end loop;

end loop;

end Autobus_Radiowapetla;

----------------------------------------------------------------KALISKIEGO-RADIOWA-------------------------------------------

task body Autobus_Kaliskiegoradiowa is

Dkr : Duration;

Ckr : Duration;

begin

loop

exit when Rysuj=False;

end loop;

Dkr:=Duration(Float(Skr)/100.0);

Ckr:=Duration(Float(Okr)/100.0);

delay Dkr;

loop

while Dzien=True loop

Kaliskiegoprawy(Nr);

Kaliskiego_Prawy.Przejazd(Nr);

Kaliskiegoradiowa(Nr);

Radiowa_Lewy.Przejazd(Nr);

Radiowalewy(Nr);

delay Ckr;

end loop;

end loop;

end Autobus_Kaliskiegoradiowa;

----------------------------------------------RADIOWA-KALISKIEGO------------------------------------------------------

task body Autobus_Radiowakaliskiego is

Drk : Duration;

Crk : Duration;

begin

loop

exit when Rysuj=False;

end loop;

Drk:=Duration(Float(Srk)/100.0);

delay Drk;

Crk:=Duration(Float(Ork)/100.0);

loop

while Dzien=True loop

Radiowaprawy(Nr);

Radiowa_Prawy.Przejazd(Nr);

Radiowakaliskiego(Nr);

Kaliskiego_Lewy.Odjazd(Nr);

Kaliskiegolewy(Nr);

delay Crk;

end loop;

end loop;

end Autobus_Radiowakaliskiego;

Aut : Autobus_Radiowakaliskiego (105, 150, 200);

Aut2 : Autobus_Kaliskiegoradiowa (105, 50, 200);

Aut3 : Autobus_Radiowapetla (523, 345, 233);

Aut4 : Autobus_Kaliskiegopetla (109, 200, 433);

Aut5 : Autobus_Radiowakaliskiego (310, 90, 200);

Aut6 : Autobus_Kaliskiegoradiowa (310, 240, 200);

Aut7 : Autobus_Nocny (601, 130);

begin

Cursoroff;

Ulice(Miejsca_Na_Petli);

Rysuj:=False;

end WATspot;

Procpom:

with Text_Io; use Text_Io;

with Ada.Text_Io; use Ada.Text_Io;

with Ada.Integer_Text_Io; use Ada.Integer_Text_Io;

with Winconsoleex; use Winconsoleex;

with Sem83;

use Sem83;

package body Procpom is

Nrk: Integer :=21;

Nrw: Integer :=2;

I: Integer:=0;

ekran: binary_semaphore:=init(1);

procedure Ulice(N: in Integer) is

begin

Text(White);

Movecursor(Nrw,Nrk);

Put("_____________ _______________");

Nrw:=Nrw+3;

Movecursor(Nrw,Nrk);

Put("______ ______ ________");

Nrw:=Nrw+1;

Nrk:=26;

while Nrk>20 loop

Movecursor(Nrw,Nrk);

Put("/ /");

Nrw:=Nrw+1;

Nrk:=Nrk-1;

end loop;

Nrk:=40;

Nrw:=6;

while Nrw<12 loop

Movecursor(Nrw,Nrk);

Put("\ \");

Nrw:=Nrw+1;

Nrk:=Nrk+1;

end loop;

Nrk:=20;

while Nrw<16 loop

Movecursor(Nrw,Nrk);

Put("| | | | | |");

Nrw:=Nrw+1;

end loop;

Movecursor(Nrw,Nrk);

Put("| ----- ----- ---");

Nrw:=Nrw+1;

Movecursor(Nrw,Nrk);

Put("|");

Nrw:=Nrw+1;

Movecursor(Nrw,Nrk);

Put("|");

Nrw:=Nrw+1;

Movecursor(Nrw,Nrk);

Put("| ----- ----- ---");

Nrw:=Nrw+1;

while Nrw<25 loop

Movecursor(Nrw,Nrk);

Put("| | | | | |");

Nrw:=Nrw+1;

end loop;

Nrk:=32;

Nrw:=11;

while Nrw>6 loop

Movecursor(Nrw,Nrk);

Put("/");

Nrw:=Nrw-1;

Nrk:=Nrk+1;

end loop;

Nrk:=41;

Nrw:=11;

while Nrw>6 loop

Movecursor(Nrw,Nrk);

Put("\");

Nrw:=Nrw-1;

Nrk:=Nrk-1;

end loop;

Nrw:=24;

Nrk:=32;

Movecursor(Nrw,Nrk);

Put("---------");

Nrk:=34;

Nrw:=12;

while I<N loop

Movecursor(Nrw,Nrk);

Put("| |");

Nrw:=Nrw+1;

Movecursor(Nrw,Nrk);

Put("\___/");

Nrw:=Nrw+2;

I:=I+1;

end loop;

end Ulice;

procedure Pisz(nr, X, Y: Integer) is

begin

wait(ekran);

movecursor(x,y);

Put(Nr,3);

signal(ekran);

end Pisz;

procedure czysc(X, Y: Integer) is

begin

Wait(ekran);

movecursor(x,y);

Put(" ");

Signal(ekran);

end czysc;

procedure swiatla1 is

begin

wait(ekran);

Movecursor(15,44);

Text(Red);

Put("@");

Movecursor(20,53);

Text(Red);

Put("@");

Movecursor(15,53);

Text(Green);

Put("@");

Movecursor(20,44);

Text(Green);

Put("@");

Text(White);

signal(ekran);

end swiatla1;

procedure swiatla2 is

begin

wait(ekran);

Movecursor(15,44);

Text(Green);

Put("@");

Movecursor(20,53);

Text(Green);

Put("@");

Movecursor(15,53);

Text(Red);

Put("@");

Movecursor(20,44);

Text(Red);

Put("@");

Text(White);

signal(ekran);

end swiatla2;

end Procpom;

ANALIZA POPRAWNOŚCI PROGRAMU:

  1. Program spełnia własność żywotności ze względu na wzajemne wykluczanie. Każda próba wypisania swojej pozycji lub jej wymazania wymaga, aby dany proces skorzystał z funkcji zadeklarowanej w pakiecie „Procpom”. Jak widać obie te funkcję są obłożone semaforem binarnym uniemożliwiającym dwóm różnym procesom jednoczesne jej wykorzystanie (wait na początku, signal po zakończeniu wypisywania).

  2. Program w wersji na spotkaniach spełnia własność żywotności:

- nie występują zakleszczenia dzięki temu, że żaden proces nie wymaga jednocześnie dwóch zasobów,

-istnieje możliwość głodzenia procesu chcącego skręcić po przejeździe ulicą Radiową na pętle, a co za tym idzie kolejnych procesów chcących skorzystać z lewego pasa skrzyżowania na Kaliskiego. Jest to jednak skutek obowiązujących w Polsce przepisów ruchu drogowego, przez co nie można traktować tego jako wady programu. Przy sensownej ilości procesów (procesów taką jest realna ilość autobusów jeżdżąc po tych trasach) zagłodzenie nie występuje.

-nie występują także blokady i mimo długotrwałego działania program nie zatrzymuje się.

  1. Program w wersji na semaforach w przeciwieństwie do wersji na spotkaniach nie zawsze spełnia własność żywotności.

-z podobnych przyczyn jak w w/w rozwiązaniu występują tymczasowe głodzenia,

-tylko jeden proces wymaga dostępu do wielu zasobów na raz (autobus skręcający na pętle po przejeździe ulicą radiową). Żaden inny proces nie konkuruje z nim jednak o więcej niż jeden zasób i nawet, jeśli zajmie potrzebny mu zasób przed nim, to zwolni go po chwili, co da możliwość zajęcia go przez problematyczny proces,

-w rozwiązaniu tym występuje problem, jeśli chodzi o blokady. Przy słabszej konfiguracji sprzętowej, z niewyjaśnionych przyczyn, program zatrzymuje się po wykonaniu pewnej ilości kroków. Na komputerach „mocniejszych” problem ten nie występuje.



Wyszukiwarka

Podobne podstrony:
~$rawozdanie z Programowania wsp¢ˆbie¾nego doc
sprawozdanie programowanie lab3
sprawozdanie programowanie lab1
sprawozdanie programowanie lab20 fin
8 zalacznik 5 sprawozdawczosc w programach EUWT i EISiP
ufo i program atomowy, DOC
sprawozdanie programowanie lab4 fin
program I III doc
Program NSDAP, DOC
sprawozdanie programoweanie lab7 fin2
Program trojkat.DOC, (2) EE-DI
sprawozdanie programowanie lab2
sprawozdanie programowanie lab5 fin
Sprawozdanie z pomiaru wsp strat
sprawozdanie programowanie lab11 fin
sprawozdanie programowanie lab3 fin2
B Program pozytywistyczny doc
sprawozdanie programowanie lab9 fin2
sprawozdanie programowanie lab4

więcej podobnych podstron