Programowanie współbieżne i
rozproszone
From KamikadzeWiki
k ompilacja:
gnatmake -gnat05 powitanie.adb -o powitanie
Spis treści
1 Zadania z laboratoriów
1.1 Laboratorium 1
1.1.1 Zadanie 1
1.1.1.1 Rozwiązanie 1
1.1.2 Zadanie 2
1.2 Laboratorium 2
1.2.1 Zadanie 3
1.3 Laboratorium 3
1.3.1 Zadanie 4
1.3.2 Zadanie 5
1.4 Laboratorium 4
1.4.1 Zadanie 6
1.4.2 Zadanie 7
1.5 Laboratorium 5
1.5.1 Zadanie 8
1.5.1.1 zadanie8c.adb
1.5.2 Zadanie 9
1.5.3 Zadanie 10
1.6 Laboratorium 6
1.6.1 Zadanie 11
1.6.2 Zadanie 12
1.6.2.1 Rozwiązanie 12
1.6.2.2 park ing.ads
1.6.2.3 park ing.adb
1.6.2.4 zadanie12.adb
1.7 Kolok wium 2007 i 2008
1.7.1 Grupa A
1.7.1.1 Zadanie 1
Programowanie współbieżne i rozproszone - Kamik...
http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...
1 z 38
06.01.2009 10:52
1.7.1.2 Zadanie 2
1.7.2 Grupa B
1.7.2.1 Zadanie 1
1.7.2.2 Zadanie 2
1.8 Adds On
1.8.1 Suma macierzy o wartościach zespolonych
1.8.2 Sk rzyżowanie
Zadania z laboratoriów
Laboratorium 1
Zadanie 1
Sk ompiluj i uruchom podany poniżej program.
Uruchom program w debugerze i prześledź k rok owo jego działanie.
Zmodyfik uj program tak , aby wyk orzystywał pętlę while i sprawdzał tylk o liczby
mniejsze od sqrt(n).
with Ada.Text_IO, Ada.Integer_Text_IO;
use Ada.Text_IO, Ada.Integer_Text_IO;
procedure Zadanie1 is
n, j : Integer;
begin
Put("Podaj wartość liczby n: ");
Get(n);
for i in 2 .. n - 1 loop
j := n mod i;
exit when j = 0;
end loop;
if j /= 0 then
Put(n, 0);
Put(" jest liczbą pierwszą.");
else
Put(n, 0);
Put(" nie jest liczbą pierwszą.");
end if;
end;
Rozwiązanie 1
Programowanie współbieżne i rozproszone - Kamik...
http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...
2 z 38
06.01.2009 10:52
with Ada.Text_IO, Ada.Integer_Text_IO,Ada.Numerics.Elementary_Functions;
use Ada.Text_IO, Ada.Integer_Text_IO,Ada.Numerics.Elementary_Functions;
procedure zadanie1 is
n, j, i : Integer;
begin
Put("Podaj wartość liczby n: ");
Get(n);
i:=2;
while i<=Integer(sqrt(Float(n))) loop
j := n mod i;
exit when j = 0;
i:=i+1;
end loop;
if j /= 0 then
Put(n, 0);
Put(" jest liczbą pierwszą.");
else
Put(n, 0);
Put(" nie jest liczbą pierwszą.");
end if;
end;
Zadanie 2
Napisz program wyk onujący obliczenia na wek torach (suma, różnica i iloczyn
sk alarny). W ramach programu należy zdefiniować procedury Read, Write (do
wczytywania i wypisywania wek torów) oraz funk cje przeładowujące operatory +, - i *.
Wszystk ie argumenty tych podprogramów powinny być typu:
type Vector is array (Integer range <>) of Float;
W przypadk u operatorów obliczenia mają być wyk onywane w ramach k rótszego z nich.
Niezależnie od zak resu argumentów, zak res wynik u ma być liczony od 1, na przyk ład
wynik iem dodawania (odejmowania) wek torów:
a : Vector(4 .. 6);
b : Vector(11 .. 15);
powinien być wek tor typu:
Vector(1 .. 3);
Programowanie współbieżne i rozproszone - Kamik...
http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...
3 z 38
06.01.2009 10:52
with Ada.Text_IO, Ada.Integer_Text_IO,Ada.Text_IO, Ada.Float_Text_IO,Ada.Numerics.Elementary_Functions;
use Ada.Text_IO, Ada.Integer_Text_IO,Ada.Text_IO, Ada.Float_Text_IO,Ada.Numerics.Elementary_Functions;
procedure zadanie2 is
type Vector is array (Integer range <>) of Float;
len1,len2, first1, first2, len_out : Integer;
--**************************************************--
-------------------Function sum ----------------------
function sum (v1,v2 : Vector) return Vector is
len : Integer;
begin
if (v1'length > v2'length) then
len:=v2'length;
else
len := V1'length;
end if ;
declare
tmp : Vector(1 .. len);
begin
for i in 1 .. len loop
tmp(i):=v1(v1'first+i-1)+v2(v2'first+i-1);
end loop;
return tmp;
end;
end ;
-------------------Function sum ----------------------
--**************************************************--
--**************************************************--
-------------------Function div ----------------------
function div (v1,v2 : Vector) return Vector is
len : Integer;
begin
if (v1'length > v2'length) then
len:=v2'length;
else
len := V1'length;
end if ;
declare
tmp : Vector(1 .. len);
begin
for i in 1 .. len loop
tmp(i):=v1(v1'first+i-1)-v2(v2'first+i-1);
end loop;
return tmp;
end;
end ;
-------------------Function div ----------------------
--**************************************************--
--**************************************************--
-------------------Function scalar--------------------
function scalar (v1,v2 : Vector) return Float is
len : Integer;
begin
if (v1'length > v2'length) then
len:=v2'length;
else
len := V1'length;
end if ;
declare
ret : Float;
begin
ret:=0.0;
Programowanie współbieżne i rozproszone - Kamik...
http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...
4 z 38
06.01.2009 10:52
Laboratorium 2
Zadanie 3
Napisz program będący k alk ulatorem dla ułamk ów zwyk łych. Program powinien
działać w niesk ończonej pętli, w ramach k tórej wybierany jest typ operacji, podawane
są argumenty i wyznaczany jest wynik . Program powinien sk ładać się z trzech plik ów
(2 z nich stanowią implementację pak ietu udostępniającego odpowiedni typ i operacje
na ułamk ach). Zawartość plik u fractions.ads (specyfik acja dla pak ietu Fractions)
podano poniżej:
package Fractions is
type Fraction is private;
function "-"(x : Fraction) return Fraction;
function "+"(x, y : Fraction) return Fraction;
function "-"(x, y : Fraction) return Fraction;
function "*"(x, y : Fraction) return Fraction;
function "/"(x, y : Fraction) return Fraction;
function frac(n, d : Integer) return Fraction;
function numerator(x : Fraction) return Integer;
function denominator(x : Fraction) return Integer;
private
type Fraction is record
n, d : Integer;
end record;
procedure abridge(x : in out Fraction);
procedure sign(x : in out Fraction);
end;
fraction.ads:
package Fractions is
type Fraction is private;
function "-"(x : Fraction) return Fraction;
function "+"(x, y : Fraction) return Fraction;
function "-"(x, y : Fraction) return Fraction;
function "*"(x, y : Fraction) return Fraction;
function "/"(x, y : Fraction) return Fraction;
function frac(n, d : Integer) return Fraction;
function numerator(x : Fraction) return Integer;
function denominator(x : Fraction) return Integer;
private
type Fraction is record
n, d : Integer;
end record;
procedure abridge(x : in out Fraction);
procedure sign(x : in out Fraction);
end;
Programowanie współbieżne i rozproszone - Kamik...
http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...
5 z 38
06.01.2009 10:52
fraction.adb:
Programowanie współbieżne i rozproszone - Kamik...
http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...
6 z 38
06.01.2009 10:52
package body Fractions is
function "-"(x : Fraction) return Fraction is
f: Fraction;
begin
f.n:=-x.n;
f.d:=x.d;
sign(f);
return f;
end;
function "+"(x, y : Fraction) return Fraction is
f: Fraction;
begin
f.n:=x.n*y.d+y.n*x.d;
f.d:=x.d*y.d;
sign(f);
abridge(f);
return f;
end;
function "-"(x, y : Fraction) return Fraction is
f: Fraction;
begin
f.n:=x.n*y.d-y.n*x.d;
f.d:=x.d*y.d;
sign(f);
abridge(f);
return f;
end;
function "*"(x, y : Fraction) return Fraction is
f: Fraction;
begin
f.n:=x.n*y.n;
f.d:=x.d*y.d;
sign(f);
abridge(f);
return f;
end;
function "/"(x, y : Fraction) return Fraction is
f: Fraction;
begin
f.n:=x.n*y.d;
f.d:=x.d*y.n;
sign(f);
abridge(f);
return f;
end;
function frac(n, d : Integer) return Fraction is
f: Fraction;
begin
f.n:=n;
f.d:=d;
return f;
end;
function numerator(x : Fraction) return Integer is
begin
return x.n;
end;
function denominator(x : Fraction) return Integer is
begin
return x.d;
end;
procedure abridge(x : in out Fraction) is
n, d : Integer;
begin
n := numerator(x);
d := denominator(x);
Programowanie współbieżne i rozproszone - Kamik...
http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...
7 z 38
06.01.2009 10:52
zadanie3.adb:
with Ada.Text_IO, Ada.Integer_Text_IO,Fractions;
use Ada.Text_IO, Ada.Integer_Text_IO,Fractions;
procedure zadanie3 is
n,d : Integer;
f1,f2,wynik: Fraction;
operator : Character;
begin
loop
Put_Line("Podaj rodzaj działania (- * / + [z - zmień znak] [q - wyjdź]):");
Get(operator);
exit when operator = 'q';
case operator is
when 'z' =>
Put_Line("Podaj licznik ułamka");
Get(n);
Put_Line("Podaj mianownik ułamka");
Get(d);
f1 := frac(n,d);
when others =>
Put_Line("Podaj licznik 1. ułamka");
Get(n);
Put_Line("Podaj mianownik 1. ułamka");
Get(d);
f1 := frac(n,d);
Put_Line("Podaj licznik 2. ułamka");
Get(n);
Put_Line("Podaj mianownik 2. ułamka");
Get(d);
f2 := frac(n,d);
end case;
case operator is
when '+' => wynik:=f1+f2;
when '-' => wynik:=f1-f2;
when '*' => wynik:=f1*f2;
when '/' => wynik:=f1/f2;
when 'z' => wynik:=-f1;
when others => null;
end case;
Put("wynik ["); Put(numerator(wynik)); Put("/"); Put(denominator(wynik)); Put_Line("]");
end loop;
end;
Laboratorium 3
Zadanie 4
Napisz program realizujący współbieżne sortowanie bąbelk owe. W ramach programu
należy zdefiniować typ zadaniowy Sorting, k tórego specyfik ację podano poniżej:
Programowanie współbieżne i rozproszone - Kamik...
http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...
8 z 38
06.01.2009 10:52
type Data is array (Integer range <>) of integer;
type DataPtr is access Data;
task type Sorting is
entry Sort (x : in DataPtr);
entry Finished;
end;
Wejście Sort wyk orzystywane jest do przek azania do zadania wsk aźnik a do tablicy,
k tórą należy posortować. W ramach realizacji wejścia wyk onywane jest sortowanie
tablicy. Drugie z wejść wyk orzystywane jest do sprawdzenia, czy sortowanie zostało
zak ończone. W programie wyk orzystane zostaną dwa zadania typu Sorting.
Główna procedura programu odpowiada za wczytanie danych, podział ich na dwie
części, uruchomienie współbieżnego sortowania dwóch tablic, a na k ońcu za scalenie
wynik ów i wypisanie ich na ek ran. W programie należy wyk orzystać trzy wsk aźnik i
typu DataPtr. W oparciu o pierwszy z nich dynamicznie tworzona jest tablica o
wsk azanym przez użytk ownik a rozmiarze, do k tórej wczytywane są dane. Pozostałe
dwa wsk aźnik i używane są do utworzenia dwóch tablic o długości o połowę mniejszej
(zwrócić uwagę na fak t, że tablica pierwsza może mieć nieparzystą liczbę elementów),
k tóre przek azywane są do zadań sortujących. Po zak ończeniu sortowania procedura
główna scala wynik i umieszczając je ponownie w pierwszej tablicy, a następnie
wypisuje je na ek ran.
Programowanie współbieżne i rozproszone - Kamik...
http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...
9 z 38
06.01.2009 10:52
with Ada.Text_IO, Ada.Integer_Text_IO;
use Ada.Text_IO, Ada.Integer_Text_IO;
procedure zadanie4 is
type Data is array (Integer range <>) of integer;
type DataPtr is access Data;
task type Sorting is
entry Sort (x : in DataPtr);
entry Finished;
end;
task body Sorting is
z,b : Integer;
a : DataPtr;
begin
accept Sort(x : in DataPtr) do
a := x;
end;
loop
z:=1;
for i in 1..a.All'Last-1 loop
if a(i)>a(i+1) then
b:=a(i+1);
a(i+1):=a(i);
a(i):=b;
z:=0;
end if;
end loop;
exit when z=1;
end loop;
accept Finished;
end;
s1, s2 : Sorting;
tab0, tab1, tab2 : DataPtr;
n,i_1,i_2 : Integer;
begin
Put_Line("Podaj dlugosc tablicy: ");
Get(n);
tab0 := new Data(1..n);
Put("Podaj kolejne elementy tablicy: ");
for i in 1..n loop
Get(tab0(i));
end loop;
tab1 := new Data(1..n/2);
tab2 := new Data(1..n/2+n mod 2);
tab1.All := tab0.All(1..n/2);
tab2.All := tab0.All(n/2+1..n);
s1.Sort(tab1);
s2.Sort(tab2);
s1.Finished;
s2.Finished;
i_1:=1;
i_2:=1;
while i_1<tab1'Last+1 and i_2<tab2'Last+1 loop
Put_Line("");
Programowanie współbieżne i rozproszone - Kamik...
http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...
10 z 38
06.01.2009 10:52
Zadanie 5
Napisz program będący implementacją modelu pięciu filozofów. W ramach programu
należy zdefiniować dwa typy zadaniowe: Fork i Philosopher. Specyfik acje tych typów
oraz dek laracje zmiennych podano poniżej. Wyróżnik zadania Philosopher jest
używany do ok reślenia numerów widelców, z k tórych k orzysta dany filozof.
task type Fork is
entry up;
entry down;
end;
cutlery : array(0 .. 4) of Fork;
task type Philosopher (i : integer);
f0 : Philosopher(0);
f1 : Philosopher(1);
f2 : Philosopher(2);
f3 : Philosopher(3);
f4 : Philosopher(4);
Programowanie współbieżne i rozproszone - Kamik...
http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...
11 z 38
06.01.2009 10:52
with Ada.Text_IO, Ada.Numerics.Float_Random, Ada.Calendar, Ada.Integer_Text_IO;
use Ada.Text_IO, Ada.Numerics.Float_Random, Ada.Calendar, Ada.Integer_Text_IO;
procedure zadanie5 is
procedure print(i : integer; j : integer; up_down : String) is
begin
put("Philosopher ");
put(i, 0);
put(", fork ");
put(j, 0);
put(" " & up_down);
New_Line;
end;
task type Fork is
entry up;
entry down;
end;
task body Fork is
begin
loop
accept up;
accept down;
end loop;
end;
cutlery : array(0 .. 4) of Fork;
task type Philosopher (i : integer);
task body Philosopher is
g : Generator;
begin
reset(g);
loop
delay duration(random(g) * 4.0); --myslenie
cutlery(i).up;
print(i, i, "up");
select
cutlery((i+1) mod 5).up;
print(i, (i+1) mod 5, "up");
delay duration(random(g) * 4.0); --jedzenie
cutlery(i).down;
print(i, i, "down");
cutlery((i+1) mod 5).down;
print(i, (i+1) mod 5, "down");
else
cutlery(i).down;
print(i, i, "down ************");
end select;
end loop;
end;
f0 : Philosopher(0);
f1 : Philosopher(1);
f2 : Philosopher(2);
f3 : Philosopher(3);
f4 : Philosopher(4);
begin
null;
Programowanie współbieżne i rozproszone - Kamik...
http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...
12 z 38
06.01.2009 10:52
Laboratorium 4
Zadanie 6
Zadanie 6
Napisz program implementujący problem producentów i k onsumentów. Rozważany
system sk łada się z dwóch grup zadań ok reślanych jak o producenci i k onsumenci
(należy zaimplementować dwa typy zadaniowe). Zadania k orzystają ze wspólnego
magazynu. W k ażdym cyk lu swojej pracy producent dok łada jedną jednostk ę towaru do
magazynu, a k onsument usuwa trzy jednostk i. Czas wyk onania jednego cyk lu przez
producenta i k onsumenta jest losowy. Magazyn należy zaimplementować jak o zadanie z
dwoma wejściami (wejścia wywoływane w dowolnej k olejności), k tóre umożliwiają
dodanie i usunięcie towaru z magazynu lub jak o obiek t chroniony z dwoma wejściami.
Stan magazynu zaimplementować jak o liczbę całk owitą nieujemną. Wyk onać testy z
różną liczbą producentów i k onsumentów. Rozbudować program tak , by przy realizacji
spotk ania wyświetlana była dodatk owo liczba zadań oczek ujących w k olejce do danego
wejścia.
Zmodyfik uj powyższy program wprowadzając ograniczoną pojemność magazynu.
[1] (http://student.agh.edu.pl/~beholder/lab4/prod.adb) producenci
--grzyb Czy accept w producentach i k onsumentach jest napewno potrzebny? Są to
zadania, k tóre same sobie działają, wiec wystarczyła by im pętla z delay.
Konsument moglby wygladac tak :
Programowanie współbieżne i rozproszone - Kamik...
http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...
13 z 38
06.01.2009 10:52
--Konsument
task type consumer(time: Natural) is
end;
task body consumer is
g : Generator;
workTime: Natural :=time;
begin
reset(g);
for i in 1..workTime loop
warehouse.get(3);
put("konsument zjada 3 towary");
new_line;
delay duration(random(g)*4.0);
end loop;
end;
--Program
producers: array (1..3) of prodPtr;
consumers: array (1..2) of consPtr;
begin
for i in producers'First..producers'Last loop
producers(i) := new producer(5);
end loop;
for i in consumers'First..consumers'Last loop
consumers(i) := new consumer(2);
end loop;
--tutaj juz sobie same leca
--czy potrzebna jest jeszcze petla by program sie nie zakonczyl?
end;
Jesli nie, to prosze o sprostowanie
Zadanie 7
Napisz program obliczający wartość n mod k w oparciu o pierścień k procesów
ponumerowanych od 0 do k -1. Program wysyła k olejne wartości dzielnej n do procesu
zerowego. Każdy proces zmniejsza otrzymaną liczbę o jeden i przek azuje do następnego
procesu. Proces, k tóry otrzyma zero wypisuje swój numer będący wynik iem operacji n
mod k (wraz z informacją o początk owej wartości n). Program na początk u swojego
działania pyta o wartość k i tworzy odpowiednią tablicę zadań tworzących pierścień.
Każde z tych zadań powinno mieć dwa wejścia, jedno wyk orzystywane na początk u do
ustalenia jego numeru i drugie do otrzymywania danych do obliczeń. Przek azywane
dane powinny mieć formę rek ordu z dwoma liczbami całk owitymi (początk owa i
ak tualna wartość n). W implementacji zadań wyk orzystać instruk cję select z gałęzią
terminate k ończącą pracę zadania, jeżeli w ciągu 5 sek und nie zostanie wywołane
wejście do przek azywania danych.
Programowanie współbieżne i rozproszone - Kamik...
http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...
14 z 38
06.01.2009 10:52
with Ada.Text_IO, Ada.Integer_Text_IO, Ada.Float_Text_IO, Ada.Numerics.Elementary_Functions, Ada.Numeri
use Ada.Text_IO, Ada.Integer_Text_IO, Ada.Float_Text_IO, Ada.Numerics.Elementary_Functions, Ada.Numeri
procedure zadanie7 is
type RingTask;
type PRingTask is access RingTask;
task type RingTask is
entry Init(NewIndex: Integer; NewModulo: Integer; NewNextTask: PRingTask);
entry Execute(Start: Integer; Current: Integer);
end;
task body RingTask is
Index : Integer;
Modulo : Integer;
NextTask : PRingTask;
CurrentNumber : Integer;
StartNumber : Integer;
begin
accept Init(NewIndex: Integer; NewModulo: Integer; NewNextTask: PRingTask) do
Index := NewIndex;
Modulo := NewModulo;
NextTask := NewNextTask;
end;
loop
accept Execute(Start: Integer; Current: Integer) do
CurrentNumber := Current;
StartNumber := Start;
end;
if (CurrentNumber = 0) then
Put(StartNumber);
Put(" mod ");
Put(Modulo);
Put(" = ");
Put(Index);
New_Line;
else
CurrentNumber := CurrentNumber - 1;
NextTask.Execute(StartNumber, CurrentNumber);
end if;
end loop;
end;
TaskCount: Positive;
N : Integer;
begin
Put("Podaj liczbe zadan: ");
Get(TaskCount);
declare
TaskArr: array(0..TaskCount-1) of PRingTask;
begin
for i in TaskArr'range loop
TaskArr(i) := new RingTask;
end loop;
for i in 0..TaskCount-2 loop
TaskArr(i).Init(i, TaskCount, TaskArr(i+1));
end loop;
TaskArr(TaskCount-1).Init(TaskCount - 1, TaskCount, TaskArr(0));
loop
Get(N);
TaskArr(0).Execute(N, N);
Programowanie współbieżne i rozproszone - Kamik...
http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...
15 z 38
06.01.2009 10:52
Laboratorium 5
Zadanie 8
zadanie8c.adb
Napisz program modelujący ruch wahadłowy na moście. Samochody jadące z północy i
południa muszą przejechać przez most, na k tórym dostępny jest tylk o jeden pas ruchu.
Przez most może odbywać się ruch tylk o w jednym k ierunk u. W ruchu wahadłowym
obowiązują zasady:
Samochód z południa może wjechać na most, gdy nie ma na nim samochodów
jadących z przeciwnego k ierunk u oraz gdy k olejk a samochodów stojących po
północnej stronie mostu jest pusta.
Jeżeli po północnej stronie mostu ustawiła się k olejk a samochodów, to po zjechaniu
ostatniego samochodu z mostu zmienia się k ierunek ruchu. Ostatni samochód
zjeżdżający z mostu umożliwia wjazd na most wszystk im oczek ującym samochodom
z północy.
Analogicznie zachowują się samochody jadące z północy.
Uzasadnić, że przy rozwiązaniu spełniającym powyższe wymagania możliwa jest
blok ada. Poprawić rozwiązanie eliminując blok adę. Następnie zmodyfik ować
rozwiązanie tak , aby spełnione było założenie, iż na moście mieści się co najwyżej N
samochodów. Na k oniec rozbudować rozwiązanie wprowadzając sygnalizację świetlną.
(Każda wersja rozwiązania powinna być w oddzielnym plik u.)
Programowanie współbieżne i rozproszone - Kamik...
http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...
16 z 38
06.01.2009 10:52
with Ada.Text_IO, Ada.Integer_Text_IO, Ada.Float_Text_IO, Ada.Numerics.Elementary_Functions, Ada.Numeri
use Ada.Text_IO, Ada.Integer_Text_IO, Ada.Float_Text_IO, Ada.Numerics.Elementary_Functions, Ada.Numeri
procedure zadanie8c is
protected type Bridge is
entry Enter1;
entry Enter2;
entry ExitX( CarDirection : Integer);
entry SetDirection( NewDirection : Integer );
private
OnBridge : Integer := 0;
Direction : Integer := 1;
Limit : Integer := 3;
Stop : Boolean := false;
end;
protected body Bridge is
entry SetDirection ( NewDirection : Integer ) when true is
begin
Direction := NewDirection;
Put("Kierunek na moscie zmienia sie na ");
Put(Direction, 0);
New_Line;
Stop:= OnBridge > 0;
end SetDirection;
entry Enter1
when not Stop and OnBridge < Limit and Direction = 1 is
begin
Put("Samochod z kierunku 1 wjezdza na most");
New_Line;
OnBridge:= OnBridge + 1;
Put("Samochodow na moscie: ");
Put(OnBridge);
New_Line;
end Enter1;
entry Enter2
when not Stop and OnBridge < Limit and Direction = 2 is
begin
Put("Samochod z kierunku 2 wjezdza na most");
New_Line;
OnBridge:= OnBridge + 1;
Put("Samochodow na moscie: ");
Put(OnBridge);
New_Line;
end Enter2;
entry ExitX ( CarDirection : Integer ) when true is
begin
Put("Samochod z kierunku ");
Put(CarDirection, 0);
Put(" opuszcza most");
New_Line;
OnBridge:= OnBridge - 1;
Put("Samochodow na moscie: ");
Put(OnBridge);
New_Line;
if OnBridge = 0 then
Stop:=false;
end if;
end ExitX;
end;
b : Bridge;
Programowanie współbieżne i rozproszone - Kamik...
http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...
17 z 38
06.01.2009 10:52
Zadanie 9
Programowanie współbieżne i rozproszone - Kamik...
http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...
18 z 38
06.01.2009 10:52
with Ada.Text_IO, Ada.Integer_Text_IO, Ada.Float_Text_IO, Ada.Numerics.Elementary_Functions, Ada.Numeri
use Ada.Text_IO, Ada.Integer_Text_IO, Ada.Float_Text_IO, Ada.Numerics.Elementary_Functions, Ada.Numeri
procedure zadanie9 is
protected type Book is
entry BeginRead;
entry EndRead;
entry BeginWrite;
entry EndWrite;
private
Reading : Integer := 0;
Writing : Integer := 0;
end;
protected body Book is
entry BeginRead when Writing = 0 is
begin
Reading:= Reading + 1;
Put("Rozpoczecie czytania (");
Put(Reading, 0);
Put(")");
New_Line;
end BeginRead;
entry EndRead
when Reading > 0 is
begin
Reading:= Reading - 1;
Put("Zakonczenie czytania (");
Put(Reading, 0);
Put(")");
New_Line;
end EndRead;
entry BeginWrite when Writing = 0 and Reading = 0 is
begin
Writing:= Writing + 1;
Put("Rozpoczecie zapisu (");
Put(Writing, 0);
Put(")");
New_Line;
end BeginWrite;
entry EndWrite
when Writing > 0 is
begin
Writing:= Writing - 1;
Put("Zakonczenie zapisu (");
Put(Writing, 0);
Put(")");
New_Line;
end EndWrite;
end;
b : Book;
task type Reader is
entry Init(seed : Integer);
end;
task body Reader is
g : Generator;
begin
accept Init(seed : Integer) do
Reset(g, seed);
Programowanie współbieżne i rozproszone - Kamik...
http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...
19 z 38
06.01.2009 10:52
Zadanie 10
Programowanie współbieżne i rozproszone - Kamik...
http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...
20 z 38
06.01.2009 10:52
with Ada.Text_IO, Ada.Numerics.Float_Random, Ada.Calendar, Ada.Integer_Text_IO;
use Ada.Text_IO, Ada.Numerics.Float_Random, Ada.Calendar, Ada.Integer_Text_IO;
procedure zadanie10 is
procedure print(i : integer; j : integer; up_down : String) is
begin
put("Philosopher ");
put(i, 0);
put(", fork ");
put(j, 0);
put(" " & up_down);
New_Line;
end;
protected type Fork is
entry up;
entry down;
private
state : Boolean := False; --False==down
end;
protected body Fork is
entry up when state = False is
begin
state := True;
end;
entry down when state = True is
begin
state := False;
end;
end Fork;
cutlery : array(0 .. 4) of Fork;
task type Philosopher (i : integer);
task body Philosopher is
g : Generator;
begin
reset(g);
loop
delay duration(random(g) * 4.0); --myslenie
cutlery(i).up;
print(i, i, "up");
select
cutlery((i+1) mod 5).up;
print(i, (i+1) mod 5, "up");
delay duration(random(g) * 4.0); --jedzenie
cutlery(i).down;
print(i, i, "down");
cutlery((i+1) mod 5).down;
print(i, (i+1) mod 5, "down");
else
cutlery(i).down;
print(i, i, "down ************");
end select;
end loop;
end;
f0 : Philosopher(0);
f1 : Philosopher(1);
Programowanie współbieżne i rozproszone - Kamik...
http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...
21 z 38
06.01.2009 10:52
Laboratorium 6
Zadanie 11
Napisz program sterujący sygnalizacją świetlną dla pojazdów mechanicznych na
sk rzyżowaniu w k ształcie litery T. Zak ładamy, że system wyświetla zielone światło dla
drogi podporządk owanej tylk o wtedy, gdy znajdują się na niej pojazdy. Zak ładamy, że
system jest informowany o pojawieniu się pojazdu na drodze podrzędnej, poprzez
zgłoszenie przerwania. Sterowanie sygnalizacją powinno być realizowane przez
zadanie sporadyczne (zwolnienie zadania następuje w wynik u obsługi przerwania
przez obiek t chroniony), k tóre po zwolnieniu wyświetla jeszcze zielone światło dla
drogi głównej przez 10 s, a następnie włącza zielone światło dla drogi
podporządk owanej (na 10 s - ten mały czas jest związany tylk o z symulacją
k omputerową). Zak ładamy, że jak o stan przejściowy wyświetlane jest przez 1 s światło
żółte (ewentualnie żółte i czerwone jednocześnie).
[2] (http://student.agh.edu.pl/~beholder/lab6/t.adb) main
with TBridge;
procedure t is
begin
null;
end;
[3] (http://student.agh.edu.pl/~beholder/lab6/tbridge.adb) .adb
Programowanie współbieżne i rozproszone - Kamik...
http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...
22 z 38
06.01.2009 10:52
with Ada.Text_IO;
use Ada.Text_IO;
package body TBridge is
----------------------------- LIGHT
protected body Light is
procedure ChangeState(i: integer) is
begin
state := i;
end;
end;
----------------------------- SENSOR
protected body Sensor is
procedure Signal is
begin
int := true;
end;
entry Start when int is
begin
int := false;
end;
end;
----------------------------- CONTROL
task body Control is
begin
loop
Put_Line("Czekanie na kogos z podrzednej....");
Sensor.Start;
--czekamy na zmiane
delay 9.0;
--żółte
Put_Line("Zmiana na zolte...");
l1.ChangeState(1);
l2.ChangeState(1);
delay 1.0;
--czerwone
Put_Line("Zmiana glownej na czerwone...");
l1.ChangeState(2);
l2.ChangeState(0);
delay 9.0;
--żółte
Put_Line("Zmiana na zolte...");
l1.ChangeState(1);
l2.ChangeState(1);
delay 1.0;
--zielone
Put_Line("Zmiana glownej na zielone...");
l1.ChangeState(0);
l2.ChangeState(2);
end loop;
end;
begin
l1.ChangeState(0);
l2.ChangeState(2);
end;
[4] (http://student.agh.edu.pl/~beholder/lab6/tbridge.ads) .ads
Programowanie współbieżne i rozproszone - Kamik...
http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...
23 z 38
06.01.2009 10:52
with Ada.Interrupts;
use Ada.Interrupts;
package TBridge is
protected type Light is
procedure ChangeState(i: integer);
private
state: integer; --0=zielone, 1=żółte, 2=czerwone
end;
l1, l2 : Light;
protected Sensor is
procedure Signal;
entry Start;
pragma Attach_Handler(Signal,10);
private
int: boolean := false;
end;
task Control;
end;
Zadanie 12
Napisz program sterujący bramk ą wjazdową na zamk nięty park ing. Żądanie
podniesienia rogatk i (przy wjeździe i wyjeździe) jest przek azywane jak o zgłoszenie
przerwania. Zak ładamy, że park ing ma ograniczoną pojemność i~system nie pozwala
na wjazd, gdy nie ma wolnych miejsc (ignorowane są wówczas zgłaszane przerwania -
system nie podnosi rogatk i). Przed wjazdem umieszczona jest tablica (obsługiwana
przez system), na k tórej wyświetlana jest informacja o liczbie dostępnych miejsc. Po
podniesieniu rogatk i system nie opuszcza jej do czasu, gdy nie przejedzie jeden pojazd
(informacja o zak ończeniu przejazdu również jest przek azywana przez zgłoszenie
przerwania).
Rozwiązanie 12
par k ing.ads
Programowanie współbieżne i rozproszone - Kamik...
http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...
24 z 38
06.01.2009 10:52
package parking is
protected type Gate is
procedure open;
procedure close;
function isOpened return Boolean;
private
opened : Boolean;
end;
G : Gate;
protected type Sensor is
procedure Signal_Leave;
procedure Signal_Enter;
procedure Signal_CloseGate;
entry Start(Event : out Integer);
pragma Attach_Handler(Signal_Leave, 1);
pragma Attach_Handler(Signal_Enter, 10);
pragma Attach_Handler(Signal_CloseGate, 12);
private
ToLeave : Boolean := false;
ToEnter : Boolean := false;
CloseGate : Boolean := false;
end;
sens : Sensor;
task Sterowanie;
end;
par k ing.adb
Programowanie współbieżne i rozproszone - Kamik...
http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...
25 z 38
06.01.2009 10:52
with Ada.Text_IO, Ada.Integer_Text_IO;
use Ada.Text_IO, Ada.Integer_Text_IO;
package body parking is
protected body Gate is
procedure open is
begin
Put_Line("Brama wjazdowa zostaje otwarta");
opened := true;
end;
procedure close is
begin
Put_Line("Brama wjazdowa zostaje zamknieta");
opened := false;
end;
function isOpened return Boolean is
begin
return opened;
end;
end;
protected body Sensor is
procedure Signal_Leave is
begin
Put_Line("Signal_Leave()");
ToLeave := true;
end;
procedure Signal_Enter is
begin
Put_Line("Signal_Enter()");
ToEnter := true;
end;
procedure Signal_CloseGate is
begin
Put_Line("Signal_CloseGate()");
CloseGate := true;
end;
entry Start(Event : out Integer)
when CloseGate or ToLeave or ToEnter is
begin
if (CloseGate) then
Event := 0;
CloseGate := false;
elsif (ToLeave) then
Event := 1;
ToLeave := false;
elsif (ToEnter) then
Event := 2;
ToEnter := false;
end if;
end;
end;
task body Sterowanie is
Event : Integer;
Cars : Integer := 0;
begin
loop
Put("Liczba zajetych miejsc: ");
Put(Cars, 0);
Programowanie współbieżne i rozproszone - Kamik...
http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...
26 z 38
06.01.2009 10:52
zadanie12.adb
with parking;
use parking;
procedure zadanie12 is
begin
null;
end;
Kolokwium 2007 i 2008
Grupa A
Zadanie 1
Napisz specyfik acj˛e i implementacje˛ pak ietu zawieraja˛cego definicje obiek tów
chronionych sensor i o´swietlenie oraz zadania sterowanie. Obiek t sensor reprezentuje
sensor ruchu. Obiek t ten obsługuje przerwanie, k tóre oznacza pojawienie si˛e
ruchomego przedmiotu w obserwowanym terenie. Obiek t os´wietlenie przechowuje
jedynie zmienna˛ logiczna˛ reprezentuja˛ca˛ jego stan oraz udoste˛pnia procedure ˛
ustawStan pozwalaja˛ca˛ na zmiane˛ jego stanu. Os´wietlenie jest wła˛czane i
wyła˛czane przez zadanie sterowanie. Jest to zadanie sporadyczne, zawieszone na
wej´sciu obiek tu sensor. Po jego wyzwoleniu wła˛cza os´wietlenie na 30 sek und.
sensor.ads
package sensor is
protected light is
procedure changeLight(b : boolean);
private
state : boolean := false;
end;
protected sensor is
procedure interrupt;
entry start;
pragma Attach_Handler(interrupt, 10);
private
triged : boolean := false;
end;
task controller;
end;
sensor.adb
Programowanie współbieżne i rozproszone - Kamik...
http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...
27 z 38
06.01.2009 10:52
with Ada.Text_IO;
use Ada.Text_IO;
package body Sensor is
protected body light is
procedure changeLight(b : boolean) is
begin
state:=b;
if state then
Put_Line("Oświetlenie włączone");
else
Put_Line("Oświetlenie wyłączone");
end if;
end;
end;
protected body sensor is
procedure interrupt is
begin
triged:=true;
end;
entry start when triged is
begin
triged:=false;
end;
end;
task body controller is
begin
loop
sensor.start;
light.changeLight(true);
delay(30.0);
light.changeLight(false);
end loop;
end;
end;
sensorTest.adb
with sensor;
use sensor;
procedure sensorTest is
begin
null;
end;
Zadanie 2
Napisz program znajduja˛cy minimum macierzy liczb całk owitych (wymiary W x K,
gdzie W i K sa˛ stałymi). W programie nalez˙y zdefiniowac´ typ zadaniowy i
zadek larowac´ W zadan´, z k tórych k az˙de wyznaczy minimum jednego z wierszy
macierzy. Wynik i obliczen´ poszczególnych zadan´ maja˛ zostac´ umieszczone w
jednowymiarowej tablicy minimaCza˛stk owe. Minimalna˛wartos´c´ w tej tablicy
znajduje procedura główna programu. W programie moz˙na pomina˛c´ fragment
dotycza˛cy pobierania danych do wej´sciowej macierzy.
Programowanie współbieżne i rozproszone - Kamik...
http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...
28 z 38
06.01.2009 10:52
with Ada.Text_IO, Ada.Integer_Text_IO,Ada.Float_Text_IO,Ada.Numerics.Float_Random;
use Ada.Text_IO, Ada.Integer_Text_IO,Ada.Float_Text_IO,Ada.Numerics.Float_Random;
procedure MinMatrix is
type Data is array(Integer Range<>) of Float;
type DataPtr is access Data;
task type VectorMin is
entry Min(vector : in DataPtr);
entry Finished(min : out Float);
end;
task body VectorMin is
vec : DataPtr;
m : Float;
begin
accept Min(vector : in DataPtr) do
vec:=vector;
end;
m:=vec(vec'First);
for i in vec'Range loop
if vec(i)<m then
m:=vec(i);
end if;
end loop;
accept Finished(min : out Float) do
min:=m;
end;
end;
w : constant Integer := 20;
k : constant Integer := 20;
matrix : array(1..w) of DataPtr;
gen : Generator;
minimaCzastkowe: array(1..w) of Float;
tasks : array(1..w) of VectorMin;
m: Float;
begin
reset(gen);
for i in matrix'Range loop
matrix(i):= new Data(1..k);
for j in matrix(i)'Range loop
matrix(i)(j):=Float(random(gen)) ;
end loop;
end loop;
for i in tasks'Range loop
tasks(i).Min(matrix(i));
end loop;
for i in tasks'Range loop
tasks(i).Finished(minimaCzastkowe(i));
end loop;
m:=minimaCzastkowe(1);
for i in 2 .. minimaCzastkowe'Last loop
if (m<minimaCzastkowe(i)) then
m:=minimaCzastkowe(i);
end if;
end loop;
Put(m);
end;
Grupa B
Programowanie współbieżne i rozproszone - Kamik...
http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...
29 z 38
06.01.2009 10:52
Zadanie 1
Napisz specyfik acje˛ i implementacje˛ pak ietu zawieraja˛cego definicje˛ typu
chronionego bramk a, dla programu steruj ˛ acego bramk ˛ a wjazdow ˛ a na
zamk ni˛ety park ing. ˙Za˛danie podniesienia rogatk i jest przek azywane jak o
zgłoszenie przerwania. Po podniesieniu rogatk i system nie opuszcza jej do czasu, gdy
nie przejedzie jeden pojazd (informacja o zak o´nczeniu przejazdu równie˙z jest
przek azywana przez zgłoszenie przerwania). Numery obsługiwanych przerwan´ sa˛
parametrami typu chronionego. Dodatk owo obiek t powinien zawierac´ funk cje˛
opuszczona zwracaja˛ca˛ wartos´c´ logiczna˛ zalez˙na˛ od ak tualnego stanu bramk i.
Napisz program testuja˛cy ten pak iet, w k tórym zadek larowano dwa obiek ty
bramk aWjazd i bramk aWyjazd oraz cyk liczne zadanie k ontrola, k tóre co 10 sek und
odczytuje stan obu bramek i wypisuje odpowiedni k omunik at na k onsoli.
Bramk aPa.ads
with Ada.Interrupts;
use Ada.Interrupts;
package BramkaPa is
protected type bramka(a,b : Interrupt_ID) is
procedure opusc;
procedure podnies;
procedure getState(s : out boolean);
pragma Attach_Handler(opusc,a);
pragma Attach_Handler(podnies,b);
private
state : boolean := false;
end;
end;
Bramk aPa.adb
with Ada.Interrupts;
use Ada.Interrupts;
package body BramkaPa is
protected body bramka is
procedure opusc is
begin
state:=false;
end;
procedure podnies is
begin
state:=true;
end;
procedure getState(s : out boolean) is
begin
s:=state;
end;
end;
end;
bramk aTest.adb
Programowanie współbieżne i rozproszone - Kamik...
http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...
30 z 38
06.01.2009 10:52
with Ada.Text_IO,BramkaPa;
use Ada.Text_IO,BramkaPa;
procedure bramkaTest is
type bramkaPtr is access bramka;
task show is
entry start(wja,wyj:bramkaPtr);
end;
task body show is
s : boolean;
wjazd, wyjazd : bramkaPtr;
begin
accept start(wja,wyj:bramkaPtr) do
wjazd:=wja;
wyjazd:=wyj;
end;
loop
Put("Wjazd: ");
wjazd.getState(s);
if s then
Put_Line("Podniesiona");
else
Put_Line("Opuszczona");
end if;
Put("Wyjazd: ");
wyjazd.getState(s);
if s then
Put_Line("Podniesiona");
else
Put_Line("Opuszczona");
end if;
New_Line;
delay(10.0);
end loop;
end;
bramkaWyjazd, bramkaWjazd: bramkaPtr;
begin
bramkaWyjazd := new bramka(10,12);
bramkaWjazd :=new bramka(14,16);
show.start(bramkaWjazd,bramkaWyjazd);
end;
Zadanie 2
Napisz program wyznaczaja˛cy sume˛ dwóch macierzy liczb rzeczywistych (wymiary W
x K, gdzie W i K sa˛ stałymi). W programie nalez˙y zdefiniowac´ typ zadaniowy i
zadek larowac´ K zadan´, z k tórych k az˙de sumuje jedna˛ z k olumn macierzy.
Wynik owa macierz (odpowiednio sformatowana) powinna zostac´ wys´wietlona na
ek ranie przez procedure˛ główna˛.
sumamacierzy.adb
Programowanie współbieżne i rozproszone - Kamik...
http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...
31 z 38
06.01.2009 10:52
with Ada.Text_IO,Ada.Integer_Text_IO,Ada.Float_Text_IO,Ada.Numerics.Float_Random;
use Ada.Text_IO,Ada.Integer_Text_IO,Ada.Float_Text_IO,Ada.Numerics.Float_Random;
procedure sumamacierzy is
type Data is array(Integer Range<>) of Float;
type DataPtr is access Data;
task type VectorSum is
entry Sum(vector1, vector2 : DataPtr);
entry Finished(sum : out DataPtr);
end;
task body VectorSum is
vec1,vec2,outvec : DataPtr;
begin
accept Sum(vector1, vector2 :DataPtr) do
outvec:=new Data(vector1'Range);
vec1:=vector1;
vec2:=vector2;
end;
for i in vec1'Range loop
outvec(i):=vec1(i)+vec2(i);
end loop;
accept Finished(sum : out DataPtr) do
sum:=outvec;
end;
end;
w : constant Integer := 20;
k : constant Integer := 10;
macierz1: array(1 .. w) of DataPtr;
macierz2: array(1 .. w) of DataPtr;
wynik : array(1 .. w ) of DataPtr;
gen : Generator;
sumTasks : array(1 .. w) of VectorSum;
begin
for i in macierz1'Range loop
macierz1(i):=new Data(1..k);
macierz2(i):=new Data(1..k);
for j in macierz1(i)'Range loop
macierz1(i)(j):=Float(random(gen))*10.0;
macierz2(i)(j):=Float(random(gen))*10.0;
end loop;
end loop;
for i in sumTasks'Range loop
sumTasks(i).Sum(macierz1(i), macierz2(i));
end loop;
for i in wynik'Range loop
sumTasks(i).Finished(wynik(i));
end loop;
for i in wynik'Range loop
for j in wynik(i)'Range loop
Put(wynik(i)(j),2,2);
end loop;
New_Line;
end loop;
end;
INNA WERSJA: urbanq:=> może założysz k onto na wik i?
Programowanie współbieżne i rozproszone - Kamik...
http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...
32 z 38
06.01.2009 10:52
with Ada.Text_IO,Ada.Integer_Text_IO,Ada.Float_Text_IO,Ada.Numerics.Float_Random;
use Ada.Text_IO,Ada.Integer_Text_IO,Ada.Float_Text_IO,Ada.Numerics.Float_Random;
procedure zad2_b is
type Matrix is array(integer range<>,integer range<>) of float;
type MatrixPtr is access Matrix;
procedure initMatrix(A_ptrM : MatrixPtr;A_iRand : integer)is
gen : Generator;
begin
reset(gen,A_iRand);
for i in A_ptrM'range(1)
loop
for j in A_ptrM'range(2)
loop
if A_iRand = 0 then
A_ptrM(i,j) := 0.0;
else
A_ptrM(i,j) := random(gen);
end if;
end loop;
end loop;
end;
procedure printMatrix(ptrM : MatrixPtr)is
begin
for i in ptrM'range(1)
loop
for j in ptrM'range(2)
loop
Put(ptrM(i,j),1,3,0);
if j /= ptrM'last(2) then
Put(" | ");
end if;
end loop;
New_line;
end loop;
end;
task type SumColumn is
entry Start(A_pM1,A_pM2,A_pMR : MatrixPtr;A_iCol : integer);
entry Finished;
end;
task body SumColumn is
pM1,pM2,pMR : MatrixPtr;
iCol : integer;
begin
accept Start(A_pM1,A_pM2,A_pMR : MatrixPtr;A_iCol : integer) do
pM1 := A_pM1;
pM2 := A_pM2;
pMR := A_pMR;
iCol := A_iCol;
end;
for i in pMR'range(1)
loop
pMR(i,iCol) := pM1(i,iCol) + pM2(i,iCol);
end loop;
accept Finished;
end SumColumn;
K : constant integer := 3;
W : constant integer := 4;
Programowanie współbieżne i rozproszone - Kamik...
http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...
33 z 38
06.01.2009 10:52
Adds On
Suma macierzy o wartościach zespolonych
Programowanie współbieżne i rozproszone - Kamik...
http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...
34 z 38
06.01.2009 10:52
with Ada.Text_IO,Ada.Integer_Text_IO,Ada.Numerics.Float_Random;
use Ada.Text_IO,Ada.Integer_Text_IO,Ada.Numerics.Float_Random;
procedure sumamacierzyzespolonej is
type zespolona is record
re,im: Integer;
end record;
type Data is array(Integer Range<>) of zespolona;
type DataPtr is access Data;
task type SumVector is
entry start(vector1, vector2 : in DataPtr);
entry finished(vector : out DataPtr);
end;
task body SumVector is
vec1 : DataPtr;
vec2 : DataPtr;
begin
accept start(vector1, vector2 : in DataPtr) do
vec1:=vector1;
vec2:=vector2;
end;
for i in vec1'Range loop
vec1(i).re:=vec1(i).re+vec2(i).re;
vec1(i).im:=vec1(i).im+vec2(i).im;
end loop;
accept finished(vector : out DataPtr) do
vector:=vec1;
end;
end;
w : constant Integer := 5;
k : constant Integer := 4;
m1 : array(1 .. w) of DataPtr;
m2 : array(1 .. w) of DataPtr;
suma : array(1 .. w) of DataPtr;
gen : Generator;
tasks : array(1 .. w ) of SumVector;
begin
for i in m1'Range loop
m2(i) := new Data(1 .. k);
m1(i) := new Data(1 .. k);
for j in m1(i)'Range loop
m1(i)(j).re := Integer(Float(random(gen))*1000.0);
m1(i)(j).im := Integer(Float(random(gen))*1000.0);
m2(i)(j).re := Integer(Float(random(gen))*1000.0);
m2(i)(j).im := Integer(Float(random(gen))*1000.0);
end loop;
end loop;
for i in m1'Range loop
tasks(i).start(m1(i),m2(i));
end loop;
for i in suma'Range loop
tasks(i).finished(suma(i));
end loop;
for i in suma'Range loop
for j in suma(i)'Range loop
Put(suma(i)(j).re);Put("+");Put(suma(i)(j).im);Put("j");
end loop;
New_Line;
end loop;
end;
Programowanie współbieżne i rozproszone - Kamik...
http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...
35 z 38
06.01.2009 10:52
Skrzyżowanie
Na sk rzyżowaniu w k ształcie litery T znajduje się sensor, k tóry zmienia światło na
zielone dla k ierunk u pionowego tylk o, k iedy na sk rzyżowaniu pojawi się samochód
jadący z k ierunk u pionowego.
cross.ads
package cross is
protected Swiatlo is
procedure zmienSwiatlo(b : boolean);
function getSwiatlo return Boolean;
private
state : boolean;
end;
protected sensor is
procedure triged;
pragma Attach_Handler(triged,10);
entry start;
private
trig : boolean :=false;
end;
task controller;
end;
cross.adb
Programowanie współbieżne i rozproszone - Kamik...
http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...
36 z 38
06.01.2009 10:52
with Ada.Text_IO;
use Ada.Text_IO;
package body cross is
protected body sensor is
procedure triged is
begin
trig:=true;
end;
entry start when trig is
begin
trig:=false;
end;
end;
protected body Swiatlo is
procedure zmienSwiatlo(b: boolean) is
begin
state:=b;
end;
function getSwiatlo return boolean is
begin
return state;
end;
end;
task body controller is
begin
loop
sensor.start;
Swiatlo.zmienSwiatlo(true);
if Swiatlo.getSwiatlo then
Put_Line("zielone");
else
Put_Line("czerwone");
end if;
delay(10.0);
Swiatlo.zmienSwiatlo(false);
if Swiatlo.getSwiatlo then
Put_Line("zielone");
else
Put_Line("czerwone");
end if;
end loop;
end;
end;
sk rzyzowanie.adb (najbardziej spek tak ularne ;p)
with Ada.Text_IO,Ada.Interrupts,cross;
use Ada.Text_IO,Ada.Interrupts,cross;
procedure skrzyzowanie is
begin
null;
end;
Źródło: "http://student.agh.edu.pl/~k amik adz/k amik adzeIsBack /k amik adzeWik i
/index.php?title=Programowanie_wsp%C3%B3%C5%82bie%C5%BCne_i_rozproszone"
Kategoria: 5semestr
Programowanie współbieżne i rozproszone - Kamik...
http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...
37 z 38
06.01.2009 10:52
Tę stronę ostatnio zmodyfikowano 18:49, 22 sty 2008.
Programowanie współbieżne i rozproszone - Kamik...
http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...
38 z 38
06.01.2009 10:52