Ada
Randki (spotkania) w Adzie
Model
Zasady
•
=DGDQLHVNáDGDVL ]HVSHF\ILNDFMLRUD]WUH FL
•
6SHF\ILNDFMDPR H]DZLHUDüW\ONRGHNODUDFMHZHM üDQJ
entries)
task Buffer isentry Append (I: in integer); entry Take (I: out integer); end Buffer;
•
=DGDQLHF]\QQHPR HZ\ZRáDüZHM FLH
Buffer.Append(15)•
:WUH FL]DGDQLDELHUQHJRV RSLVDQHF]\QQR FLGRNRQ\ZDQHZ
WUDNFLHUDQGNLSRSU]H]GDQHZHM FLH
task body Buffer isbegin { ... }
accept Append (I: in integer) do ^RSLVF]\QQR FL` end Append; { ... } end Buffer;
„U Ady”
ZADANIE AKTYWNE :<:2à8- &( ZADANIE BIERNE 35=<-08- &( ZHM FLH ZHM FLH ZHM FLH•
6\QFKURQL]DFMDPL G]\]DGDQLHPDNW\ZQ\PZ\ZRáXM F\P
ZHM FLHD]DGDQLHPELHUQ\PV\PHWU\F]QHF]HNDQLH
•
Wzajemne wykluczanie
•
.ROHMNL]ZL ]DQH]LQVWUXNFMDPL
acceptV UHDOL]RZDQHMDNR
kolejki proste
Semantyka randki
1.
=DGDQLHF]\QQHZ\ZRáXM FHZHM FLHSU]HND]XMHSDUDPHWU\
aktualne in i inout
GR]DGDQLDELHUQHJRL]DZLHV]DVL Z
RF]HNLZDQLXQD]DNR F]HQLHUDQGNL
2.
=DGDQLHELHUQHZ\NRQXMHLQVWUXNFMHZWUH FLRGSRZLHGQLHJR
ZHM FLD
3.
Parametry out i inout
V SU]HND]\ZDQHGR]DGDQLDF]\QQHJR
4.
5DQGNDNR F]\VL NRQW\QXDFMD]DGD
Charakterystyka randki jako operacji pierwotnej
•
Synchroniczna komunikacja bez buforowania
•
$V\PHWU\F]QDLGHQW\ILNDFMD]DGD
•
'ZXNLHUXQNRZ\SU]HSá\ZGDQ\FK
•
:\NRQ\ZDQLHFL JXLQVWUXNFML
Instrukcja
select6NáDGQLD
select when w1 ⇒DFFHSWZHM FLHGR,HQGZHM FLH instrukcje-poza-rejonem-krytycznym-1; or when w2 ⇒DFFHSWZHM FLHGR,HQGZHM FLH instrukcje-poza-rejonem-krytycznym-2; ...Semantyka
1.
6]XNDQLHRWZDUW\FKJDá ]LW\FK]SUDZG]LZ\PLGR]RUDPL-H OL
ich nie ma oraz brak frazy else
WREá G
2.
-H OLV ]DGDQLDF]\QQHRF]HNXM FHZNROHMNDFKSU]\ZHM FLDFK
RWZDUW\FKJDá ]LWRUR]SRF]\QDVL UDQGND]
pierwszym
zadaniem w niedeterministycznie
Z\EUDQHMJDá ]LRWZDUWHM
3.
-H OLZV]\VWNLHNROHMNLZRWZDUW\FKJDá ]LDFKV SXVWHRUD]QLH
ma else, delay ani terminate, to zadanie bierne zostaje
]DZLHV]RQH*G\W\ONRMDNLH ]DGDQLHF]\QQH]JáRVLFK üZHM FLD
GRRWZDUWHMJDá ]LWRUR]SRF]\QDVL ]QLPUDQGNDXZDJD
GR]RU\QLHV MX ZDUWR FLRZDQHF]\OL]ELyURWZDUW\FKJDá ]LQLH
]PLHQLDVL
4.
Randka przebiega „standardowo”
5.
3R]DNR F]HQLXUDQGNL]DGDQLHELHUQHZ\NRQXMH
instrukcje-poza-rejonem-krytycznym6.
Mamy else
-H OLQLHPDRWZDUW\FKJDá ]LDOERNROHMNLZ
RWZDUW\FKV SXVWHWRMHVWZ\NRQ\ZDQ\FL JLQVWUXNFML
I-inne 7.Mamy delay
-H OLNROHMNLZRWZDUW\FKJDá ]LDFKV SXVWHWR
zadanie bierne czeka, ale tylko T jednostek, a potem wykonuje
I-inne8.
Mamy terminate
:VNUyFLHSRZRGXMH]DNR F]HQLH]ELRUX
]DGD MH OLLQVWUXNFMD
select jest zawieszona i wszystkieHZHQWXDOQH]DGDQLDDNW\ZQH]DNR F]\á\VL OXEWH F]HNDM Z
select]JDá ]L
terminate3URJUDPRZDQLH]X \FLHP
select•
=Z\NáDUDQGNDLPSOHPHQWXMHPHFKDQL]P53&
Remote
Procedure Call). Fraza
select uogólnia RPCtask body T is begin loop select accept czujnik-1 do ... ; or accept czujnik-2 do ... ; or delay 0.1; -- 100 milisekund Alarm; end select; end loop; end T;
•
Fraza else
MHVWUyZQRZD QD
delay z zerem. Implementuje rodzajprzepytywania (ang. polling
VSUDZG F]\QLHPDNRPXQLNDWyZ
GRSU]HWZRU]HQLDLMH OLQLHWRZ\NRQXMQRUPDOQHF]\QQR FL
•
Kilkakrotne accept
GODWHJRVDPHJRZHM FLD
loopDFFHSW(GRHQG(QLHSDU]\VWHZ\ZRáDQLD DFFHSW(GRHQG(SDU]\VWHZ\ZRáDQLD end loop
;
•
Instrukcje po accept
PRJ E\üSXVWH7DNDIRUPDVáX \GR
synchronizacji, np. korzystania z zasobu
task body zasób is begin loop accept Chce; accept Zwalnia; end loop; end zasób;
•
,QVWUXNFMHUDQGNLPRJ ]DZLHUDüZHZQ WU]LQQHUDQGNLDOER
Z\ZRáDQLDZHM üNRQVWUXNFMHWDNLHPDM ]QDF]Q VLá Z\UD]X
•
6\QFKURQL]DFMDWU]HFK]DGD
task body T1 is begin ... DFFHSW6\QFKUGR7Z\ZRáXMHWRZHM FLH DFFHSW6\QFKU7Z\ZRáXMHWRZHM FLH end Synchr-2; ... end T1;=DGDQLH7E G]LH]DZLHV]RQHGRSyW\GRSyNLQLHQDVW SLUDQGND
]7-H OL7]JáRVLVL SLHUZV]HGR7WRE G]LHRF]HNLZDáRZ
NROHMFHZHM FLRZHMD SRMDZLVL 7RFRQDPFKRG]L
Select
w zadaniu czynnym
•
=DGDQLHF]\QQHPR H]DZLHVLüVL MHG\QLHF]HNDM FQDMHGQR
ZHM FLHQLHPDZ\ZRáD ZLHOXZHM üQDUD]
•
3U]\NáDGQDZ\NRU]\VWDQLHRJUDQLF]RQHJRF]DVXRF]HNLZDQLDZ
]DGDQLXF]\QQ\P-H OLZRNUH ORQ\PF]DVLHVHNF]XMQLNQLH
zareaguje, to zostanie poinformowany operator
task body T is begin loop select Sensor.sample (...); or delay 1.0; -- w sekundach Notify-operator; end select; end loop; end T;
•
$QNLHWRZDQLHNLONX]DGD REVáXJXM F\FKVHUZHUyZ]DGDQLH
F]\QQHDQJD XMHVL ZUDQGN W\ONRZWHG\JG\VHUZHUMHVW
QDW\FKPLDVWGRVW SQ\:W\PXM FLXMH OLMHVWNLONXF]HNDM F\FK
VHUZHUyZWRUDQGNDRGE G]LHVL ]ND G\P
task body T is begin loop select Server-1.E (...); else null; end select; select Server-2.E (...); else null; end select; ... end loop; end T;•
6SRWNDQLH]MHGQ\P]RF]HNXM F\FKVHUZHUyZ
task body T is begin loop select Server-1.E (...); else select Server-2.E (...); else ... end select; end select; end loop; end T;•
Priorytety
end Server;
task body Server is begin
loop select
accept Request (High) (...) ...; or
when Request (High)’Count = 0 ⇒ accept Request (Medium) (...) ...; or
when Request (High)’Count = 0 and Request (Medium)’Count = 0 ⇒ accept Request (Low) (...) ...;
end select; end loop; end Server; 6HUYHU5HTXHVW+LJKZ\ZRáDQLH
•
Semafor
package Mutex-Package; task type Simple-Mutex is entry Wait;entry Signal;
end Simple-Mutex; task type Mutex is
entry Init (N: in Integer); entry Wait;
entry Signal; end Mutex;
end Mutex-Package;
package body Mutex-Package is task body Simple-Mutex is
begin loop select
accept Wait; accept Signal; or terminate; end select; end loop; end Simple-Mutex; task body Mutex is Count: Integer; begin
accept Init (N: in Integer) do Count := N; end Init; loop select when Count > 0 ⇒ accept Wait do Count := Count - 1; end Wait; or accept Signal do Count := Count + 1; end Signal; or terminate; end select; end loop; end Mutex; end Mutex-Package;
6NáDGQLD$G\
•
Predefiniowane typy:
Integer, Float, Character, Boolean, String
•
Typy wyliczeniowe:
•
Tablice
type Arr is array (1..100) of Integer;
•
Rekordy
type Rec is
record field1: Integer; field2: Boolean; end record;
•
:VND QLNL
type Rec_Pointer is access Rec;
•
Instrukcje
if A > B then & $WHQ UHGQLNMHVWZD Q\ elsif A < B then C := B; else C := 0; end if; for I in 1..10 loop A(I) := 0; end loop; while X > 0 loop X := X/2; end loop; loop X := X/2; exit when X <= 0; end loop;•
Pakiet
WR]ELyUGHNODUDFMLGDQ\FKLSURFHGXUNWyU\PR QD
RGG]LHOQLHNRPSLORZDüXPLHV]F]DüZELEOLRWHFHLXGRVW SQLDü
LQQ\PSDNLHWRPE G SURJUDPRZLJáyZQHPX
•
Atrybut
WRIXQNFMDSU]HND]XM FDZDUWR üSUHGHILQLRZDQHM
ZLHONR FL]ZL ]DQHM]RELHNWHP
if S’Length < 50 then PQLHMQL HOHPZ6 S(S’Last) := S(S’First); -- wstaw na koniec, to co
end if; QDSRF] WNX
for I in S’Range loop -- dla wszystkich elementów w S
S(I) := ‘*’; end loop;
•
Typ zadaniowy (task type): dla zadeklarowania kilku
LGHQW\F]Q\FK]DGD GHNODUXMHVL W\S]DGDQLRZ\DQDVW SQLH
ZLHOHZFLHOH WHJRW\SX