Académique Documents
Professionnel Documents
Culture Documents
"
"
# $ % &
&'
&
&
( ' ) & *
* &
"
+ " & ,
" "
& ( -)
"
.
.
$ "
.
"
.
"
/ +
.
0123
$ 44%%% 4
$ 54 %4
8
8 "
&
) $ %
&
& &
& 9 &
. )
. & "
$ "
!" # $
: () "
; $)
% <
=/ 4
8
+5 % $
!" # %&
. /,.&
02 " × :
4 " ' 0=:
0 /> ,?+4
( % <
5
@ $
$ 5
5 $
'
A" $ % " % "
&
* ' * & "
. :24B % ?,(4 * .
:24 % (4+ * . :24
+ ' " %
"
" A"
"
"
&
? #
, (9 ) 9( *
, @ > < ? $ (*,>? , $
- *+/9 ! " , + $ . " ,+.9 &
( * + &(*+ +
+ "
. $ %
$ . '
% ) & ) $ &
" + "
C " & )
$ " + & - "
" "
( =D0=
' ( )*
#
#
% " .4
$
/
6 " 7
%
*
$
' ( ) *
" '
"
" " "
? " )
"
, ) )
%
,
6 7 6 7
# +
) )
( ( ? > 5
# ) 5
+ /
B<
,
( " !
" (
? +
. "
# /
" / + / $
/ ) $
+ ,
!" +
( =D0=
. )
" . BBB
. ) ) .
. )
? $
!" +, , ,
BBB
$
"
%
BBB
# $ $
8
BBB .
" BBB
$ & "
"
" BBB
!" + ,,,
#$$ ! ! %&'
! !
! "!
#$$ ! "! $
! " !
( #$$ ! " ! $ $ !
! " !
( =D0=
,,,
A E 0D 4
A B E 2F
A B E0
.
A
8
?
.
+
- .
$ + & & . &
++* , /
* +
"
' C 3DDD 6 7
3DDDD
3DDDDD
0
$
C "
" G "
!" + .
( =D0=
* "
"
'H & " + .
&
" , 8
. I $ 8.I
" "
"
$ 1 2+ 3 2
!" + / /) *
4 "
"
* 4
#56 4 4
.
? " )
,
? $ $
"
*
!" + / /) *
$ 2
' * 2'*
8 4
?
$
.
$ "
" . )
+ + * "
&) ?
( " &?
" 4 " /
& " $) "
"
" (+
(+ '
"
" "
' .
(- "
"
$ (+
(-
!" + 0
* *
) +
) ( =D0=
*
- ?A)
? "
) ) &9
. ) & B? ?
" 9
) "
!" +0
-
*
"
"
) .
"
+ '
)
# 01:J 5
A
)
"
-
. % $ % )
.
& "
%
* $ %
%
# 8 K 011:
)
/
& ?
012D ! $ + ( $5 #
01J0
/
$ $
& &
* / 8 */8 $ 44%%% 4
"
"
. )
" "
"
A. # A .
# $ 5
(
. .# 'H * / + .
$ % L 'H / +
? 'H / / +
"
"
1 .
7 " "
$ %
"
C
"
" M
C
"
"
2 . )*
; % "
& $ %
" + +
B %
%
& " -
B %
& "
0D/ 0D/
2 . ) *
& "
, "
"
C A C
" A % < " "
"
& <
"
& .
* / )
"
" "
?
! &/
* . .
# .
. $
. ?
"
A B A
- B A $
*# * # $ 5
" !C+ $ 44 %< 4% < 4 N *#
'
&
& $ 4
&
&
#
( &
# &
( " 4 & +
!
- & "
$ $ %
" "
& .
? .)
"
( %
" ;##
I+
3 "
& $
" . &
"
A " %
%
'6 & 7 ?
. 6# 4 5 7 ,8(
) " . %%%
(*,>? ) ) *+/ %%%
8. ? . % ) %%%
B %%% %F
& $ $ % %
, & "
& (
"
. "
& "
+ "
)
)
B
" "
&
) .
& ' & "
"
" .
'
(
.
"
*
(
&A
&
" *
" %
. . "O F= 'H . "2 0=:
"
&A ) &
) " " .
"
2
. &
A M
* " + & &
& A
+ &
9
# & "
B " "
, &
6 7
,
. 9 &A "
? & .
&
)
? "
"
? )
"
"
"
$
? $
)
2
# &
" &
) :
#
1&
#
#
# "
"
#
) "
#
#
"
#
$
2
# L '
? ) /-.
? ? .
-, ) "
.
?
,
+
#( 4. $
(
* & "
"
8
&
5 +
(
#
"
G ' &
)
"
+
& & "
+ $
& &
4
&
+
+
+
+
%
+
.
(
&
? " $ ?A
/ " 9
9
* " )
( "
? P1D . )
* " " )
'H ) " " B
) "
. )
)
1 &
,
&
A "
& "
$
* 0 "
( =D0=
. =DD2 A $ ) . %
. - .8 ./ /&
-
( "
"
& " ) " "
?
.9
& "
"
. & .
.
"
"
"
"
( $
2 &
/
" &
"
&
!
$
2
&
&
#
/
$
&
!
& + ) &
.
* 4 % )
. &
& +
&
,
/ +
4
,
- & ) +
)
.& * 8
# ! " ,+.
(
(
&
!> 2 : + ! (*+L A #
(*,>? 8. ? !?& , / +
- & + * / @
/ +
)
"
. "
*
"
/ + B ;## I+
?$ " +
*?
'
" 5
(
) &
"
? . "
. "
3 # 4 .# &
, $ $
$ " -
;## B
' #
3#
* + # $
* + 3 #$* , (
(
&
&
(
" "
)
- )
,
/
) .
A
. )
+
? "
(
* " . . . .
"
,
+
(
.
" "
"
&
&
"
? &
"
$ &
.
$ &
+ . +
+ . . =
3
,
,
( =D0=
- #
# #
( & "
- " B "
" B " . " &A
. .
-
B )
? " )
;## ) )
( 4 "
& " ≠ " ) &
' ) 6 7 *
* = )
≠ "
8
* =
+ = "
+ &
)
" $
! 0
( =D0=
'
& "
&
"
&
8 "
(
"
+ " +
.
,
"
" " ,
" ,
"
,
( =D0=
B ) "
B B
- +
) &A &? - "
) "
"
.
( =D0=
* $
) (
"
( " "
? "
+
" 1&
A " B " B
;##
B - " B 1&
) )
- " 1& " B )
( "
' 5 -
$ & *222 0 / 2 + ; <
=; .=>) )??@
? O
4 "
" # 2+
" $ '
(
( 4 "
&
(
( ) ?
"
"
(
&
( ? (
(
"
(
&
( )
( )
(
?
&
( )
? (
"
1 3
+
" B "
) " "
$ "
"
/ &
( =D0=
, $
$ "
&
+ ) " .
( 6 7
? $
& 1&
.
1&
.
,
"
$
-
& 8 "
8 " ?
%
( =D0=
"
&
$ ) "
8
" "
"
"
&
( =D0=
( =D0=
8 9
# & "
" . "
( " %
?
" ?" "
" & " "
" "
" " "
? + 37 - 7
+ 7 7 "
" ?
( =D0=
:
( =D0=
&
+ + 4
+ + +
" +
" B ,+. (*,>? 8. ?
'
* . * , + * & ,+)*&
*+/ ( * , @ > < ? $ (*,>?
! " ,+.
( + 8 $ 44 %= 4
+ )? . 8. ? $ 44%%% 4
+ )? !?& $ 44 4
+ &
$ "
&
5
/
+
+
+
+
&
"
?
& ?
&
&
- & )
( & )
&
$
( &
8 &
9
'
( &
&
+
'
. 9
# "
9
'
&
"
"
1
C '"
"
? " "
& "
"
8 &
"
" ($
) "
"
8
&
,
"
($ &
" "
(
- /& /
"0 & / )
? " /
.
" " "
& "
- A#
0
"
&
&
&
4
4
&
#
"
) &
)
. "
$
&
#
"
.
&
*
? "
" &
"
:
& " & ,
" "
& ) " " ;
& ,
& ,
"
& , "
" ; Q
Q
" & , $
" " ( " "
" " &
& )
:
. ) & & "
$
& $
1
&" " R? P
"
&"
? " "
" "
1) L0
" Q
. &
& ' +
&
&
"
& " ' $
0 8 /& C O A F
F:=)OD0 , $ < + $
& &
&
& " )
+
. )
*
& .
0 1 0 1
( =D0=
?
4
&
.
& @
+ .
&
4
.
& 6 7
" "
"
& "
"
(
* +
% )
" "
"
'
8 ) $ $ *$ 5
$
( $ $ $ *$ 5
$
* ($ ? "
" $ $ P
) ? $
, " ) ? P
$ "
? 5 4 $ $ 5 $ " 5
>5 $ 4 5 5
9 5 <
( =D0=
5 '
( < P < $
$ $ "
% %
($ ? P < $ $
( =D0=
& " ?
" & ?
&
"
+ "
+
&
'
( =D0= 1
2 / + 2 /
* #
"
?
"
" "
( "
" " "
.
$
+ "
$
" "
A & )
&
&
'
( =D0=
+
+
"
$
&
'
- ) &
# .
.
"
- "
" &
"
( " "
.
"
) "
'
- )
?
+ &
? "
# $ "
$
# $
-
8
"
.
4 "
Modelul calculului concurent.
Sectiuni critice
Capitolul 2
2015
Rezumat
• Definirea modelului abstract al calculului concurent.
Modelul intreteserii.
• Corectitudine
• Implementarea modelului in Promela/SPIN si Java
• Mecanisme de sincronizare pentru sectiunea critica.
Analiza unor algoritmi de baza.
• Implementarea mecansimelor de sincronizare in
Promela si Java.
2015
Calcul concurent
• = instrument de abstractizare pentru
paralelismul potential.
• = program “clasic” in care instructiunile
masina rezultate in urma compilarii sale sunt executate
secvential de un procesor.
• = executiile proceselor componente se
suprapun in timp.
• = compus din mai multe programe
secventiale care pot fi executate in paralel. Programele
secventiale din cadrul unui program concurent se numesc si
(a nu se confunda cu notiunea de proces dintr&un SO).
• = paralelism potential in care procesele se pot
executa prin partajarea resurselor unui numar restrans
de procesoare.
2015
Exemple de concurenta
• Operatii de intrare – iesire
• Multitasking
• Multiprocesoare si multicalculatoare
• Sisteme distribuite
2015
Operatii de intrare – iesire
• Operatiile de intrare – iesire necesita un timp mult mai indelungat de
desfasurare decat operatiile interne de procesare ce folosesc procesorul si
memoria interna.
– Interfetele om – masina implica activitatea umana care este foarte lenta
– Pot necesita operatii mecanice (fizica mecanica), cum sunt &urile cu &ul
sau folosirea tastaturii
– Pot necesita accesul la dispozitive de memorie externa, cu timpul de acces mai mare
decat timpul intern de procesare
• Se folosesc Procese
Multitasking
• &ul este o functie de baza a nucleului SO. Permite
ca executia proceselor sa fie suprapusa “virtual” in timp prin
intermediul (engl. ) unui SO.
• Planificatorul realizeaza (engl. ) si
controleaza executia echitabila (engl. ) a proceselor prin
alocarea periodica a procesorului fiecarui proces din SO.
• Limbajele moderne de programare implementeaza
&ul in cadrul programelor de aplicatie prin
facilitatea de a defini calcule concurente folosind conceptul de
(engl. ) si .
• Programele interactive (cu GUI) trateaza evenimentele
utilizator pe un fir separat ce ruleaza concurent cu firul alocat
programului principal.
2015
Multiprocesoare si multicalculatoare
• Calculatoarele moderne sunt , adica contin mai
multe CPU&uri.
– CPU&urile pot sa fie omogene sau specializate de exemplu pentru
operatii de I/E sau pentru operatii grafice (GPU).
– Un CPU poate contine mai multe unitati de procesare numite si &
uri, in arhitectura .
• Sistemele de calcul moderne sunt , adica sunt
compuse din mai multe calculatoare:
– Retele locale de calculatoare
– e de calculatoare
– Centre de date
– Sisteme distribuite de mari dimensiuni: WWW, P2P, sisteme de
, etc.
2015
Sisteme distribuite
• Sistemele distribuite sunt sisteme multicalculator eterogene ce
comunica prin schimb de mesaje si urmaresc in primul rand
partajarea resurselor:
– Date
– Servicii
– Largime de banda de retea pentru comunicatie
• Accesul la resursele partajate are loc in mod concurent.
• Cresterea performantelor componentelor de deservire (servere)
dintr&un SD poate face apel la arhitecturi multiprocesor sau
multicore, ce necesita folosirea programarii concurente.
• La randul lor, arhitecturile multiprocesor pot folosi intern
comunicarea prin schimb de mesaje, ce face inevitabil apel la
tehnici specifice SD.
2015
Modelul întreŃeserii
• Se numeste o multime
finita de proce secventiale. Procesele sunt
compuse dintr&o multime finita de
.
• (numita si
) este o secventa de
instructiouni atomice rezultata prin
întreŃeserea arbitrara (engl.
) a instructiunilor atomice ale
fiecarui proces compomponent. O executie
(calcul) se numeste si .
• Fiecare proces contine un
, numit si , Sursa: !""#
care indica urmatoarea instructiune ce va fi
executata din procesul respectiv.
Instructiunea respectiva se numeste
(engl. ).
2015
Exemplu de întreŃesere
• Se considera procesele:
= instructiunea p1 urmata de instructiunea p2: p1 → p2
$ = instructiunea q1 urmata de instructiunea q2: q1 → q2
• Scenariile posibile sunt:
p1 → q1 → p2 → q2
p1 → q1 → q2 → p2
p1 → p2 → q1 → q2
q1 → p1 → q2 → p2
q1 → p1 → p2 → q2
q1 → q2 → p1 → q2
• Urmatorul scenariu este ilegal (imposibil):
p2 → p1 → q1 → q2
• Tema: cate scenarii exista daca are pasi si $ are pasi?
2015
Pseudocod concurent
Exemplu trivial de program concurent
integer ←0
p q
integer 1 ← 1 integer 2 ← 2
p1: ← 1 p2: ← 2
Sursa: !""#
• Un algoritm contine:
– Titlul
– Declaratiile de variabile globale
– O multime de coloane, cate o coloana pentru fiecare proces
– Fiecare proces incepe cu declaratii de variabile locale
– Urmeaza instructiunile atomice etichetate ale procesului
2015
Diagrama de stari
• Executia unui program
concurent este definita de p1: ← 1
p2: ← 2
o diagrama cu stari si 1 = 1, 2 = 2
tranzitii intre stari. =0
• Starea include:
– Valorile pointerilor de (end) p1: ← 1
control pentru fiecare p2: ← 2 (end)
proces 1 = 1, 2 = 2 1 = 1, 2 = 2
=1 =2
– Valorile variabilelor globale
si locale din fiecare proces
• Numarul maxim de stari al (end) (end)
unui program concurent (end) (end)
1 = 1, 2 = 2
1 = 1, 2 = 2
creste exponential cu =2 =1
numarul de procese.
Sursa: !""#
2015
Tranzitii de stare
• Fie s1 si s2 doua stari ale unei diagrame de stare a unui
program concurent. Exista o % de la s1 la s2 daca si
numai daca executand una dintre instructiunile unui proces
indicata de pointerul sau de control din s1 ne conduce la
obtinerea starii s2.
• O diagrama de stari se construieste inductiv pornind de la nodul
unic ce reprezinta starea initiala s0 a programului. Se
construiesc tranzitiile posibile din s0 rezultand o multime de
stari de nivel 1. Apoi se construiesc tranzitiile posibile din
starile de nivel 1 rezultand starile de nivel 2, s.a.m.d. Se obtine
in final diagrama de stare ce contine multimea tuturor starilor
ce pot fi atinse (engl. ) pornind din starea initiala.
2015
Scenarii
Procesul p Procesul q 1 2
p1: ← 1 q1: ← 2 0 1 2
(end) q1: ← 2 1 1 2
(end) (end) 2 1 2
Sursa: !""#
Sursa: !""#
Sursa: !""#
• Daca numarul de CPU este cel putin cat numarul de procese, intreteserea
nu mai este necesara.
• O problema sunt (engl. ). Doua
procese incearca sa scrie simultan in aceeasi locatie. Operatiile de scriere
sunt serializate de & a.i. rezultatul sa nu fie inconsistent (adica
daca un proces scrie 1 si celalalt 2 sa nu rezulte o valoare nedeterminata,
de ex. 3). Rezultatul va fi oricum nedeterminist, functie de care proces va
scrie ultimul, in urma intreteserii ce apare pentru evitarea conflictului.
2015
Intreteserea in sistemele distribuite
Sursa: !""#
Intretesere arbitrara
• Se poate ignora timpul in analiza programelor concurente.
Astfel, va conta doar ordinea in care sunt executate
instructiunile, nu si momentul de timp cand are loc executia.
• Este posibila construirea de algoritmi care sunt robusti la
modificarea & &ului sau a platformei & .
• Este aproape imposibila repetarea executiei unui program
concurent, asa cum se poate face cu un program secvential, in
scopul depanarii acestuia.
• Concluzie:
%
& &
'
2015
Atomicitatea instructiunilor
Incrementare atomica
integer ←0
p q
p1: ← +1 q1: ← +1
p q p q
Sursa: !""#
Incrementare neatomica
Incrementare neatomica
integer ← 0
p q
integer integer
p1: ← q1: ←
p2: ← +1 q2: ← +1
Sursa: !""#
Sursa: !""#
p q $
p1: ← q1: ← 0 ? ?
p2: ← +1 q1: ← 0 0 ?
p2: ← +1 q2: ← +1 0 0 0
(end) q2: ← +1 1 0 0
(end) (end) 1 0 0
2015
2015
Incrementare pe masina cu registre generale
2015
Corectitudine
• Corectitudinea unui program secvential presupune (i) terminarea
programului si (ii) corectitudinea rezultatului (verificare )
• Corectitudinea unui program concurent presupune verificarea unor
proprietati ale tuturor scenariilor posibile rezultate prin intreteserea
arbitrara:
– Proprietati de (engl. ). O proprietate de siguranta P este satisfacuta
daca si numai daca pentru scenariu posibil si pentru stare ea este
adevarata. Exemplu:
“* ”.
– Proprietati de (engl. ). O proprietate de vivacitate P este satisfacuta
daca si numai daca pentru scenariu posibil o stare in care ea este
adevarata. Exemplu:
“+ % %
”
•
2015
Dualitate
• Proprietatile de siguranta se exprima adesea prin sablonul:
“* ”
• Proprietatile de vivacitate se exprima adesea prin sablonul:
“ ”
• + % %
( ) %
• Proprietatile de siguranta si vivacitate sunt duale. Negatia unei proprietati
de siguranta este proprietate de vivacitate si reciproc.
• O proprietate de siguranta se exprima logic prin ∀s ¬P(s), iar o
proprietate de vivacitate se exprima prin ∃s P(s). Negata proprietatii de
siguranta va fi:
¬(∀s ¬P(s)) ≡ ∃s P(s), adica o proprietate de vivacitate. Similar:
¬(∃s P(s)) ≡ ∀s ¬P(s), adica o proprietate de siguranta
• Proprietatile programelor concurente se exprima natural in
.
2015
Echitate
• Exista o singura exceptie a presupunerii ca orice intretesere
arbitrara reprezinta o executie valida a unui progrma concurent.
• Un scenariu este ( ) (eng;. (& ) ) daca
pentru orice stare a sa daca incepand de la ea o instructiune este
activata in mod continuu atunci eventual ea va aparea in
scenariu.
• Sa presupunem ca am executat un scenariu 0, 1, …, si ca
incepand cu , pointerul de control al procesului indica spre
instructiunea ' ce este astfel activata continuu, atunci '
eventual va aparea (va fi selectata) in acest scenariu pentru o
stare , ≥ .
• Observatie: atribuirile si instructiunile de control odata activate,
vor ramane activate in mod continuu.
2015
Oprire in conditii echitabile
Oprire prin iesire din bucla
integer ← 0
boolean ←
p q
p1: while = q1: ←
p2: ←1–
Sursa: !""#
Concurenta in java
• Platforma Java a fost dezvoltata pentru a facilita programarea
concurenta.
• Incepand cu versiunea 5.0 ea include o interfata API de nivel&
inalt pentru concurenta.
• Programarea concurenta presupune folosirea si
. Un proces poate contine unul sau mai multe fire de
executie. De obicei un JVM ruleaza ca un singur proces.
• O facilitate esentiala a platformei Java este
– . Din punctul de vedere al programatorului,
orice aplicatie Java are alocat un proces si ea contine cel putin
un fir numit .
2015
Clasa
• Un fir Java este reprezentat printr&un obiect ' , .
!
" #$ " % #
Interfata
• Un fir Java este reprezentat printr&un obiect ce implementeaza
interfata ' - .
& &
#$ " % #
&
!
" " &
!
! " '!
% ( ) **
!
" #$ " % # *
% ( ) **
!
# % #
Metoda !
• Metoda ' permite
!
! " '!
unui fir . ce executa
% ( ) ** apelul ! ' () sa se
! suspende pana cand
" #$ " % # * firul ! se termina.
% ( ) **
Apoi . isi continua
! executia.
• In exemplu, firul
principal asteapta ca
toate firele sa se
termine, apoi
afiseaza mesajul
! final si se termina.
" #$
# % #
2015
Incrementare neatomica in Promela
(
% (
*+
% %*+
,
,
,
,*+
% %*+
%
Asteapta ca si $ sa se termine
&& %
Numarare concurenta
Numarare concurenta
integer ←0
p q
integer integer
p1: do 10 times q1: do 10 times
p2: ← q2: ←
p3: ← +1 q3: ← +1
Sursa: !""#
2015
2015
Algoritm generic pentru problema sectiunii critice
Algoritm generic pentru problema sectiunii critice
variabile globale
p q
Sursa: !""#
Prima incercare
Sectiune critica V1
integer ←1
p q
loop forever loop forever
p1: q1:
p2: await =. q2: await =!
p3: q3:
p4: ←2 q4: ←1
Sursa: !""#
Sursa: !""#
2015
Corectitudinea primei incercari
Lipsa infometarii
Sursa: !""#
Sectiune critica V2
boolean & ← false
boolean & $ ← false
p q
loop forever loop forever
p1: q1:
p2: await & $ = q2: await & =
p3: & ← true q3: & $ ← true
p4: q4:
p5: & ← false q5: & $ ← false
Sursa: !""#
2015
A patra incercare
Sectiune critica V4
boolean & ← false
boolean & $ ← false
p q
loop forever loop forever
p1: q1:
p2: & ← true q2: & $ ← true
p3: while & $ = true q3: while & = true
p4: & ← false q4: & $ ← false
p5 & ← true q5 & $ ← true
p6: q6:
p7: & ← false q7: & $ ← false
Sursa: !""#
2015
2015
Instructiuni atomice complexe
• Este dificil de rezolvat problema sectiunii critice folosind doar
instructiuni atomice de incarcare si stocare din/in memorie
(engl. ).
• Instructiunea atomica incarca valoarea unei
variabile booleene si apoi o seteaza la valoarea “true”.
( , ) is:
←
← true
• Alt exemplu de instructiune atomica este :
( , ) is:
integer
←
←
← 2015
Sursa: !""#
Sursa: !""#
Interfata $ in Java
• Un mecansim de sincronizare se poate implementa folosind
interfata ' 0 in Java.
% . /
/ 00 %
/ 00 %
2 3
/ 00
00
* + 00
%
/ 00
#1 ; #* <
% ( ) . / **
. / 2 3
2015
$ ! "
! ! " ! ¬
! "
!
%
& !
∧ # ∨ # ⇒
¬
'
(
' ! ∈
) *⊨ ×
" ∈ ⊨ "
" ∉ ⊨ ≠
⊨ ⊨ ⊨ ∧
⊨ ⊨ ⊨ ∨
⊭ ⊨¬
⊨¬ ∨ ⊨ ⇒
.
←
←
, +,
- ← +- ←
. / " +. / "
0 +0
1 ← +1 ←
( ,∧ ,∧¬ ∧¬ 〈
" ,# " ,# " # " 〉
( 0∧ 0
' 2 ¬ 3 0 ∧ 04
) .*
2 # ¬ 3 0 ∧ 04
!
!
!
!
6 ' ∨ 7, ∨ 8 ∨ !# "
" " # 7,# 8# !
! !
& ! ! ) .*
( " . 1⇒
( " ⇒ . 1
( . 1⇔ . 1⇔
( ¬ 3 0 ∧ 04
'
9 # !
& !
0
0∧ 0 &
2 0∧ 0
.
. ! 34 0
2 .# 3 4 0 2 .
!
92 .
! . 13 ! 4
# ! 0 # ;
"
# ! 6
:
! #
# #
# : 3 4
2 3 ! # 4
#
: # <
# "$"
3 #4
σ " = ># ,# -# 8?
$ 3 $
4# ) *
# ! #
) *
( % <
⊨ % × #
& σ " = ># ,# -# 8?# !≥>
! σ! !#
σ ! " = !# !7,# !7-# 8?
σ⊨ > ⊨
%
' 3 &#
$ ' 4 @3 4
σ ⊨ !≥> σ !⊨
' ! $
2 # 2 )
.* 2 ¬3 0 ∧ 04
%
' 3 &# '
4 (3 4
σ⊨ 2 !≥> σ ⊨
' !
)
.* 2 3 -⇒ 04 ' -
0 #
%
' 3 4
σ⊨ , - 2 !≥> σ !⊨ - >≤"A!
σ "⊨ ,
! (
1 # #
! 3 4
!
& ' (
' '3 " 4
9
σ⊨ , -
34 2 !≥> σ !⊨ - >≤"A!
σ "⊨ ,
3 4 "≥> σ "⊨ ,
# -
# ! ,
⇔ ∧3 4
⇔ ∨3 4
%
' 3 (4 B
σ⊨ σ,⊨
2 #
, ( ←>
- ( ←,
. ( ←-
. ⇒ 3( " -4
#
# 3( " -4
# <
#
. ⇒ 3( " -4
)
C 2 ' ) *
⇒
⇒
% #
¬ ⇔ ¬
¬ ⇔ ¬
C 2
⇔ ∨ 3 ∧3 44
⇔ ∨
⇔ ∧
⇔
⇔
∧ ∨
3 ∧ 4⇔ ∧ 6 ;;
!
& ∧ ⇔ ⃞ ∧ 4
!
)⇒* ∧
!
! # "" 23 #!4 ∧
" ⃞ ∧ 4
# ! ⃞ ∧ 4
)⇐* ⃞ ∧ 4 2 "
" ⃞ ∧ 4 " ∧ #
C ! "
# ∧
**
HH
←
←
←,
, +,
- ← +- ←
. /: " +. /: "
0 "- +0 ",
1 ← +1 ←
D / ", +D / "-
E ← +E ←
F +F
G ←- +G ←,
,> ← +,> ←
**
& ! 5 3 ϕ
ϕ4
3 ",∨ " -4 3 4
3 . 1 ∨ F ,> ⇔ 4 3 4
3 . 1 ∨ F ,> ⇔ 4 3 4
¬3 F ∧ F4 3 2 4
# !
& !
3 F ∧ F4 F . F
. ! .
F " !
F #
' %
# ;
& < <
! <
$
$ # '
← (
3 : 4 2 2
) + , +
& ! # ! &
HH
3 F⇒ G4
! 6
3 ,⇒ -4
# ,
)
92 HH # !
#
33 0 ∧ 3 " -44 ⇒ 14
I , " -#
2 G
←, 2 ,#
.# 1;
C ! !
33 0 ∧ 3 " -44 ⇒ 14
& !
⇒ $
! $
# #
#$ #
) **
& 2
)
*
3 -⇒ F4
!
34 # ,
3 4 #
¬ , : ¬ ,
"
! 3 4
#
3 ∧ ",4 ⇒ ¬
! ! -
# - .
! # # 0
! ", # 1
# 1 D
",# D
! ¬ # ¬
& ¬3 3 -⇒ F44 ⃞ -∧¬ F4
2 -∧¬ F
"-
& ! - .
& .# ¬ F# ! # 0
! "-# ! 1
& ! 1 D
! "-# D
! ¬ #
¬
! ! 3 ! 4 D#
G
+,> ", ",# ;
! ! ¬ "-# ",
-∧¬ F ! G 2
←-
, ", C !
, ",
C ! /: . 2
. 0
! ¬ #
! . 0
-
&
% &
3 4
% ( !
!
3 4
&
" ' . )
5 &
5
& !
92 2
$ 2
2
2
2
92 92 2 !
' $ ) 2
$
' 2
J K L
$
$
$
= ?
J K L
2 $
2
$
: !
! 2 #
** ' . )
" ! #
C <
%
&
$
'
)/0
' (
&
! > ' #
& 2 #
#
((
)/0
& -
2 #
# #
&
)*
9 2
# )* '
2 <
' " &
← ># ←>
, +,
- ← 7, +- ← 7,
. / "> ≤ +. / "> A
0 +0
1 ←> +1 ←>
- -
! ! !
!
( #
9
#
-
>
' ! !
&
! #
3 . ≤ # . A
4
/
5
">⇔ ,∨ - 3 4
">⇔ ,∨ - 3 '4
0 ⇒ 3 " >4 ∨ 3 ≤ 4 3 4
0 ⇒ 3 " >4 ∨ 3 A 4 3 4
! # !
&
0
0 # 2 .
3 " >4 ∨ 3 ≤ 4 # ;
0 3 " >4 ∨ 3 ≤ 4
# 3 " >4 ∨ 3 ≤ 4
0# : +- +1 - ≤
1 "> ;
!
!
0 ∧ 0 ⇒ 33 " >4 ∨ 3 ≤ 44 ∧ 33 " >4 ∨ 3 A 44
# 0∧ 0 ' ! ≠>
≠> C !
0∧ 0⇒3 ≤ 4∧3 A 4
3 ≤ 4∧3 A 4 # !
¬3 0 ∧ 04
2 2
"
( 2 3 -⇒ 04
& 2 -⇒ 0
# - ¬ 0
& -# .
¬ 0 . #
. # # 3 ""4
"M> .# . #
2 3 : 4#
C ! ¬33 " >4 ∨ 3 ≤ 44
C ! 3 ≠ >4 ∧ 3 A 4 3 ≠ >4
!
2 - 3 ""4
! 3 ""7,4 "M># ! 3 A 4;
,
- ' = ? ← , 7 23 ' 4
. : !
0 / 3 ' =!? " >4 3 ' =?≪ ' =!?4
1
D ' =?←>
2
!
( ! #
:
'
' " & *
N=, *? ' ← =># 8# >?
N=, *? # $←= # # ?
,
- # $= ? ←
. ' = ? ← , 7 23 ' 4
0 # $= ? ←
1 : !
D / # $= ? "
E / 3 ' =!? " >4 3 ' =?≪ ' =!?4
F
G ' =?←>
Semafoare si monitoare
Capitolul 4
2015
Rezumat
• Semafoare
• Monitoare
2015
Procese
• Algoritmii pentru sectiuni critice fac apel exclusiv la instructiunile
procesorului gazda.
• Semafoarele definesc o abstractie de programare la un nivel deasupra
instructiunilor masina, de regula la nivelul SO.
• Intr-un sistem multiprocesor sau multitasking mai multe procese pot
partaja resursele aceluiasi procesor.
• Un sistem contine o multime de procese, dintre care:
– Un proces in executie (engl. running)
– Mai multe procese gata de executie (engl. ready)
• O componenta a SO numita planificator (engl. scheduler) realizeaza
periodic realocarea procesorului unui nou proces gata de executie.
• Abstractizand modul de functionare a planificatorului, rezulta ca in
principiu este posibila orice intretesere a proceselor gata de executie.
2015
blocked
2015
Definirea semafoarelor
• Un semafor S este o structura de date cu doua campuri:
– S.V de tip numar natural
– S.L de tip multime de procese
• Initial semaforul primeste o valoare k ≥ 0 pentru campul S.V si
multimea vida ∅ pentru campul S.L, adica:
semaphore S ← (k, ∅)
• Pentru un semafor S pot fi definite doua operatii atomice:
wait(S)
signal(S)
• Numele date initial de Dijkstra pentru wait si signal sunt P si V.
Ele reprezinta initialele unor cuvinte in limba olandeza:
2015
Operatia wait
wait(S):
if S.V > 0
S.V ← S.V – 1
else
S.L ← S.L ∪ { p }
p.state ← blocked
• Daca S.V > 0 atunci se decrementeaza S.V si procesul curent p
poate continua executia.
• Daca S.V = 0 atunci procesul curent p este adaugat la multimea
S.L si p trece in starea blocked. Se spune ca p devine blocat la
semaforul S.
2015
Operatia signal
signal(S):
if S.L = ∅
S.V ← S.V + 1
else
fie un proces arbitrar q ∈ S.L
S.L ← S.L − { q }
q.state ← ready
• Daca S.L = ∅ atunci se decrementeaza S.V.
• Daca S.V ≠ ∅ atunci se alege un proces arbitrar q ∈ S.L si se
deblocheaza fiind trecut in starea ready.
• Starea procesului p ce executa operatia nu se schimba.
2015
Diagrama de stari
• Daca q este blocked in q1 atunci singurul proces care va putea avansa este
p. Rezultatul este ca q isi va putea continua executia din q2. Situatia este
similara pentru p.
• Nu exista nici o stare (p2,q2), desi excluderea mutuala este verificata.
• Nu exista o stare in care procesele sunt blocked, deci nu avem interblocaj.
• Daca p executa wait atunci el va progresa direct sau prin intermediul starii
blocked intr-o stare in care poate executa signal, deci nu avem infometare.
2015
Invarianti pentru semafoare
• Teorema: Fie S un semafor, k≥0 valoarea initiala a lui S.V, #signal(S)
numarul de apeluri ale functiei signal(S) si #wait(S) numarul de apeluri
ale functiei wait(S). Atunci sunt valabili urmatorii doi invarianti:
S.V ≥ 0 (Inv1)
S.V = k + #signal(S) – #wait(S) (Inv2)
• Demonstratie:
– Deoarece initial S.V = k, k ≥ 0 si #signal(S) = #wait(S) = 0 rezulta ca Inv1 si Inv2
sunt verificati.
– wait(S) eventual descreste S.V cand S.V > 0, iar signal(S) eventual creste S.V, deci
Inv1 este adevarat in mod trivial.
– Daca se executa wait(S) si S.V este decrementat atunci #wait(S) este incrementat.
– Daca se executa signal(S) si S.V este incrementat atunci #signal(S) este incrementat.
– Daca signal(S) deblocheaza un proces q, atunci se termina executia unui wait(S)
procesul q, astfel ca S.V ramane neschimbat, iar #wait(S) si #signal(S) sunt
imcrementate cu 1.
– Daca wait(S) blocheaza procesul curent atunci S.V, #wait(S) si #signal(S) nu se
schimba.
2015
2015
Lipsa infometarii si interblocajului in sectiunea
critica cu semafoare pentru 2 procese
• Daca am avea interblocaj, inseamna ca cele doua procese p si q
ar trebui sa fie blocate in urma executiei apelului wait(S), adica
S.V = 0.
• Deci nici unul dintre cele doua procese nu se afla in SC, adica
#cs = 0. Rezulta ca #cs + S.V = 0, contradictie cu Inv3.
• Daca unul dintre procese, fie el p, ar fi infometat, atunci el va fi
blocat indefinit la semaforul S ce va avea valoarea (0,S.L) cu p
∈ S.L. Conform Inv3, ar rezulta ca #cs = 1 – S.V = 1 – 0 = 1.
Deci obligatoriu celalalt proces q se afla indefinit in SC. Dar in
acest fel se contrazice presupunerea de progres a lui q in SC.
2015
2015
wait(S): signal(S):
if S.V > 0 if S.L = ∅
S.V ← S.V – 1 S.V ← S.V + 1
else else
S.L ← enqueue(S.L, p) (q, S.L) ← dequeue(S.L)
p.state ← blocked q.state ← ready
2015
Semafoare busy-wait
• Un semafor busy-wait nu contine componenta S.L iar S.V este identic cu S.
wait(S): signal(S):
await S > 0 S←S+1
S←S–1
• Un semafor busy-wait nu garanteaza lipsa infometarii in problema
sectiunii critice nici pentru cazul a 2 procese. In scenariul de mai jos q
este infometat, linia 4 este identica cu linia 1.
• q e selectat indefinit (echitabil), dar exact cand S = 0, a.i. nu va progresa.
# p q S
1 p1: wait(S) q1: wait(S) 1
2 p2: signal(S) q1: wait(S) 0
3 p2: signal(S) q1: wait(S) 0
4 p1: wait(S) q1: wait(S) 1
2015
Alta definitie a semafoarelor
• Unii autori definesc semafoarele diferit. O metoda combina definitia lui
Dijsktra cu modelul busy waiting. Instructiunea await este inlocuita cu
while, iar un proces ce nu poate avansa este trecut in starea blocked. Apoi,
in signal, dupa incrementarea S.V, se deblocheaza simetric un proces.
• Initializarea are loc ca si in definitia lui Dijsktra.
wait(S): signal(S):
while S.V = 0 S.V ← S.V + 1
S.L ← S.L ∪ { p } if S.L ≠ ∅
p.state ← blocked fie un proces arbitrar q ∈ S.L
S.V ← S.V – 1 S.L ← S.L − { q }
q.state ← ready
2015
2015
Semafoare in Promela
• Tema !
2015
Problema producator - consumator
• Contine doua tipuri de procese:
– Producatori: executa instructiuni ce produc elemente de date, ce
urmeaza a fi trimise la procesele consumator.
– Consumatori: dupa receptionarea unui element de date de la procesele
producator, executa o instructiune ce consuma elementul respectiv
• Problema producator – consumator apare in numeroase situatii
in sistemele de calcul concurente si distribuite:
– Un client Web primeste / trimite date de la / catre nivelul de
comunicatie in retea
– Driver-ul unui dispozitiv de intrare transmite date catre sistemul de
operare
– Un procesor de texte trimite date catre un driver de imprimanta.
Ulterior, driver-ul de imprimanta trimite date catre imprimanta.
– Etc.
2015
2015
Producator – consumator cu zona tampon finita
Producator – consumator cu semafoare si zona tampon finita
semaphore notEmpty ← (0,∅)
semaphore notFull ← (N,∅)
finite queue of dataType buffer ← empty queue
p q
dataType d dataType d
loop forever loop forever
p1: d ← produce q1: wait(notEmpty)
p2: wait(notFull) q2: d ← take(buffer)
p3: append(d,buffer) q3: signal(notFull)
p4: signal(notEmpty) q4: consume(d)
• Tema: sa se demonstreze corectitudinea acestui algoritm. Sursa: M.Ben-Ari, 2006
Semafoare divizate
• Algoritmul de rezolvare a problemei producator – consumator cu
semafoare introduce tehnica semafoarelor divizate (engl. split
semaphore).
• El se refera la o tehnica de sincronizare folosind un grup de doua sau mai
multe semafoare ce satisfac un invariant:
“suma lor este (cel mult) egala cu o valoare fixa N”
• In cazul problemei producator – consumator avem invariantul:
notEmpty.V + notFull.V = N
• Tema: sa se demonstreze ca acest invariant este adevarat.
• Daca N = 1 atunci avem un semafor binar cu divizare.
• Observatie: In exluderea mutuala se foloseste un singur semafor binar, iar
instructiunile pereche wait si signal se executa intr-un singur proces.
Pentru sincronizare in problema producator-consumator, o instructiune
wait intr-un proces este imperecheata cu signal in celalalt process.
2015
Problema cinei filosofilor
Cina filosofilor furc4
Fil3
furc3
loop forever
p1: think Fil4 Fil2
furc1
• Un filosof poate apuca furculitele numai una cate una si are nevoie de
doua furculite sa poata manca.
• Proprietati de corectitudine:
– Un filosof mananca numai cand are doua furculite
– Excludere mutuala: doi filosofi nu pot detine simultan aceeasi furculita
– Lipsa interblocajului
– Lipsa infometarii
– Comportament eficient in lipsa conflictelor pe furculite 2015
Definirea monitoarelor
• Monitoarele ofera o alternativa disciplinata si modulara de
implementare a programarii concurente.
• Monitoarele generalizeaza metoda de implementare a
serviciilor nucleului unui SO, pentru a putea fi folosita in
programele concurente de uz general.
• Un monitor asigura excluderea mutuala a apelurilor serviciilor
sale de catre procese diferite. La un moment dat numai un
singur proces poate executa o operatie a monitorului.
• Monitoarele se pot implementa in mod natural folosind obiecte.
Serviciile monitorului se implementeaza ca metode ce asigura
accesul corect la starea (datele) private ale obiectului.
2015
Declararea monitoarelor
Incrementare atomica cu monitoare
monitor CS
integer n ← 0
operation increment
integer temp
temp ← n
n ← temp+1
p q
p1: CS.increment q1: CS.increment Sursa: M.Ben-Ari, 2006
Ilustrarea monitoarelor
monitor CS
n 2
2015
Variabile conditie
• Un monitor forteaza in mod implicit excluderea mutuala a
accesului la variabilele sale.
• Deseori este nevoie de cerinte explicite de sincronizare. De
exemplu, in problema producator-consumator, producatorul se
va bloca daca tamponul este plin, iar consumatorul se va bloca
daca tamponul este gol.
• Conditiile se pot reprezenta explicit prin declararea de variabile
conditie (engl. condition variable).in cadrul monitorului.
– condition varCond
• Se definesc doua operatii atomice asupra variabilelor conditie:
– waitC(varCond). Aceasta operatie realizeaza blocarea procesului
apelant la variabila conditie varCond
– signalC(varCond). Aceasta operatie realizeaza deblocarea procesului
apelant la variabila conditie varCond
2015
2015
Problema producator-consumator cu monitoare
Producator-consumator cu monitoare
monitor PC
bufferType buffer ← empty
condition notEmpty, not Full
operation append(dataType v)
if buffer is full
waitC(notFull)
append(x, buffer)
signalC(notEmpty)
operation take()
dataType w
Sursa: M.Ben-Ari, 2006
if buffer is empty
waitC(notEmpty)
w ← head(buffer)
signalC(notFull)
return w
p q
dataType d dataType d
loop forever loop forever
p1: d ← produce q1: d ← PC.take
p2: PC.append(d) q2: consume(d)
2015
monitor entry
condition1 waiting
monitor
condition2 waiting
Lipsa IRR
• Cu ajutorul IRR, asteptarea pe conditie se poate implementa cu urmatorul
sablon, in cadrul unei operatii a unui monitor:
if not condition
waitC(varCond)
• Fara IRR, procesul semnalizator ar putea fi executat inaintea procesului in
asteptare, astfel incat conditia ar putea deveni invalidata inainte ca
procesul aflat in asteptare sa fie deblocat. Din acest motiv, in astfel de
situatii, sablonul de implementare a asteptarii pe variabila conditie este
urmatorul:
while not condition
waitC(varCond)
• Dezavantajul IRR este ca blocheaza procesul semnalizator si astfel
limiteaza concurenta. De aceea se recomanda ca in prezenta IRR, signalC
sa fie ultima instructiune a operatiei procesului semnalizator, astfel incat
dupa executia instructiunii signalC el va parasi monitorul, nemai fiind
nevoie sa fie blocat.
2015
Monitoare in Java
• Fiecare obiect Java are asociat un zavor implicit (engl. intrinsic
lock) care controleaza accesul firelor la obiect. In acest fel orice
obiect Java implementeaza conceptul de monitor.
notifyAll
notify
wait
object
2015
Conventia “wait and notify”
• Executand wait, un fir elibereaza zavorul si este adaugat in lista in
asteptare a obiectului respectiv. Astfel ca un alt proces care era blocat in
asteptarea zavorului va putea accesa obiectul (monitorul).
• Un fir poate executa notify / notifyAll numai daca detine zavorul, si el va
continua sa-l detina dupa executia acestor apeluri. Executia notify /
notifyAll extrage unul / toate firele in asteptare la obiectul respectiv.
• Stretegia IRR determina ca zavorul sa fie transmis imediat de la procesul
semnalizator S la procesul eliberat W. Insa in Java, daca zavorul devine
liber, orice alt proces (inclusiv cele eliberate cu notify / notifyAll) trebuie
sa-l (re-)achizitoneze pentru a (re-)intra in monitor.
• Deci in Java, procesele care doresc sa intre in monitor (E) si cele eliberate
(W) au aceeasi prioritate, in schimb procesul semnalizator (S) retine
zavorul, adica are prioritate mai mare. Deci avem strategia E = W < S,
numita si conventia “wait and notify”, ce a fost propusa de Lampson si
Redell in 1980. 2015
Blocuri synchronized
• Folosind zavorul implicit asociat unui obiect Java, se poate
implementa facil o sectiune critica sub forma unui bloc
synchronized.
Object obj = new Object();
...
synchronized(obj) {
// sectiune critica
}
2015
Implementarea semafoarelor cu monitoare in Java
public class MySemaphore {
private int value;
public MySemaphore (int k) {
value = k;
}
synchronized public void P()
throws InterruptedException { Folosirea wait urmeaza
while (value == 0) { schema clasica a asteptarii
wait(); pe conditie fara IRR.
}
--value;
} Daca toate procesele
synchronized public void V() { asteapta pe aceeasi
++value; conditie se poate folosi
notify(); notify.
}
}
2015
2015
Producator in Java
public class Producator extends Thread {
int q,r,max,min; // min...max, din q in q, incepand cu restul r
PCMonitor buffer;
int c = 0; // Contor de elemente trimise
public Producator(int q,int r,int min,int max,PCMonitor b) {
this.q = q; this.r = r;
this.min = min; this.max = max;
this.buffer = b;
}
int getCounter() { return c; }
public void run() {
int i = min;
while ((i % q) != r) { i++; } // determina primul numar produs
while (i <= max) {
buffer.append(i); c++;
System.out.println("Producer "+r+" produced "+i);
i += q;
}
}
}
2015
Consumator in Java
public class Consumator extends Thread {
int q,r,max,min;
PCMonitor buffer;
int c = 0; // Contor de elemente consumate
public Consumator(int q,int r,int min,int max,PCMonitor b) {
this.q = q; this.r = r;
this.min = min; this.max = max;
this.buffer = b;
}
int getCounter() { return c; }
public void run() {
int i = min,k;
while ((i % q) != r) { i++; }
while (i <= max) {
k = buffer.take(); c++;
System.out.println("Consumer "+r+" consumed "+k);
i += q;
}
}
}
2015
Testare producator – consumator I
public class Main {
static final int NPTHREADS = 10;
static final int NCTHREADS = 5;
static final int MINN = 0;
static final int MAXN = 76;
static Producator pThreads[] = new Producator[NPTHREADS];
static Consumator cThreads[] = new Consumator[NCTHREADS];
static PCMonitor buffer = new PCMonitor();
public static void main(String[] args) {
int i;
System.out.println("Producator - Consumator started");
for (i=0;i<NPTHREADS;i++) {
pThreads[i] =
new Producator(NPTHREADS, i, MINN, MAXN, buffer);
pThreads[i].start();
}
2015
Interfata Lock
public interface Lock {
void lock();
void lockInterruptibly() throws InterruptedException;
boolean tryLock();
boolean tryLock(long time, TimeUnit unit);
Condition newCondition();
void unlock();
}
• Metoda lock() blocheaza apelantul pana cand achizitioneaza zavorul.
• Metoda lockInterruptibly() este identica cu lock(), dar ridica o exceptie
daca firul este intrerupt in timp ce asteapta.
• Metoda unlock() elibereaza zavorul.
• newCondition() este o metoda factory pentru crearea si returnarea de
obiecte Condition ce reprezinta variabile conditie asociate zavorului.
• Metoda tryLock() achizitioneaza zavorul daca este liber si intoarce imediat
o valoare boolean ce indica daca achizitia a reusit sau nu. Are si o
varianta de apel cu timeout. 2015
Interfata Condition
public interface Condition {
void await() throws InterruptedException;
boolean await(long time, TimeUnit unit)
throws InterruptedException;
boolean awaitUntil(Date deadline) throws InterruptedException;
long awaitNanos(long nanosTimeout) throws InterruptedException;
void awaitUninterruptibly();
void signal(); // wake up one waiting thread
void signalAll(); // wake up all waiting threads
}
• Unui zavor i se pot asocia una sau mai multe variabile conditie create cu
metoda factory newCondition().
• Metodele await(), signal() si signalAll() au roluri similare cu wait(),
notify() si notifyAll() :
– Intrarea in monitor prin metode synchronized se inlocuieste cu apelul metodei lock()
– Iesirea din monitor si eliberarea zavorului se inclocuieste cu metoda unlock()
– Eliberarea explicita a zavorului in monitor se face cu await() pe obiectul Condition.
Astfel un obiect Condition va inlocui variabile Object ce reprezinta monitorul. 2015
2015
Tema
1. Sa se implementeze problema filosofilor folosind
monitoare.
2. Sa se implementeze problema producator-consumator
folosind zavoare explicite.
3. Sa se implementeze problema filosofilor folosind
zavoare explicite.
2015
Canale si schimb de mesaje
Capitolul 5
2015
Rezumat
2015
Comunicatie intre procese
• Procesele pot interschimba informatie prin:
– Memorie comuna
– Comunicare prin transfer de mesaje (engl. message passing)
• Tipuri de comunicare intre procese:
– Comunicatie sincrona: in acest caz schimbul de mesaje este o actiune
atomica ce implica participarea ambelor procese: transmitator sau
expeditor (engl. sender) si receptor sau destinatar (engl. receiver).
• Daca transmitatorul este gata sa transmita un mesaj inainte ca receptorul sa fie
gata sa-l primeasca, transmitatorul se blocheaza.
• Daca receptorul este gata sa primeasca un mesaj, dar transmitatorul nu e gata sa-l
transmita, receptorul se blocheaza
– Comunicatie asincrona: in acest caz transmitatorul nu se va bloca daca
receptorul nu este gata sa primeasca mesajul. In acest caz, mesajul
trebuie salvat temporar pana cand receptorul ajunge in starea de a-l
putea receptiona.
2015
Conventii de adresare
• In general, pentru a putea transmite un mesaj, transmitatorul trebuie sa
cunoasca adresa receptorului.
• Adresare asimetrica. Receptorul nu este obligat sa cunoasca adresa
transmitatorului. Identificarea transmitatorului este posbila, dar
transmitatorul poate optional sa anuleze aceasta optiune. Adresarea
asimetrica este preferata in modelul client-server. Clientul trebuie sa stie
ce serviciu sa apeleze, iar serverul poate fi programat fara sa stie clientii
care il vor apela. Daca e necesar, identitatea unui client se poate incapsula
in mesajele transmise de client serverului.
• Adresare simetrica. Este preferata cand procesele coopereaza pentru
rezolvarea unei probleme, in modelul P2P. Schema se poate implementa
prin definirea unor canale ce pot fi numite (engl. named channels). O
pereche sau grup de procese pot partaja un canal, prin numele acestuia.
• Comunicatie fara adresare. Adresarea se face implicit prin identificarea
unor sabloane in continutul mesajului (engl. pattern matching). Astfel: (i)
rutarea mesajului catre destinatar se poate face functie de continut sau (ii)
mesajul poate fi receptionat de toate procesele.
2015
Producator-consumator cu canale
Producator-consumator cu canale
channel of integer ch
producator consumator
integer x integer y
loop forever loop forever
p1: x ← produce c1: ch ⇒ y
p2: ch ⇐ x c2: consume(y)
Fili-1 Fili
Furci-1 Furci Furci+1
Canale in Promela
• Promela permite definirea:
– Canalelor sincrone
– Canalelor asincrone de capacitate fixa
• Mesajele pot fi:
– De un singur tip, sau
– De o secventa de tipuri (de exemplu int urmat de bool)
• Se pot defini vectori de canale.
• Exemplu de canal sincron:
chan ch = [0] of { int }
• Exemplu de vector de canale asincrone:
chan charray[4] = [10] of { int; bool }
2015
Operatii cu canale in Promela
• Receptionarea de valori din canalul ch si stocarea lor in
variabilele vari.
ch ? var1, var2, … varn;
• Testarea unor valori receptionate. Instructiunea este
executabila numai daca componentele primului mesajul din
canal se evalueaza la consti.
ch ? const1, const2, … constn;
• Transmiterea unui mesaj pe un canal.
ch ! expr1, expr2, … exprn;
2015
2015
Problema Conway in Promela: procesul Compress
#include "for.h"
#define K 4
#define MAXN 9
chan inC, pipe, outC = [2] of { byte };
active proctype Compress() {
byte previous, count = 0, c;
Eticheta end ne asigura ca o stare terminala in
inC ? previous;
end:do care serverul este blocat la o instructiune de
:: inC ? c -> receptie nu e considerata invalida
if
:: (c == previous) && (count < MAXN-1) -> count++
:: else ->
if
:: count > 0 ->
pipe ! count+1;
count = 0
:: else
fi;
pipe ! previous;
previous = c;
fi
od
}
2015
2015
Comunicatie asincrona
• In comunicatia asincrona operatia send nu blocheaza transmitatorul pana
la primirea mesajului de catre destinatar. Operatia reuseste imediat, iar
transmitatorul continua fara blocare.
• Mesajele transmise, dar inca nereceptionate sunt stocate temporar intr-o
coada. Expeditorul adauga mesaje la sfarsitul cozii, iar destinatarul preia
mesajele de la inceputul cozii.
• Pentru comunicatia asincrona se
foloseste conceptul de port.
• Un port este reprezentat de o coada
teoretic infinita de mesaje.
• Observatia: un port este similar cu
tamponul din problema producator
- consumator. Tamponul este infinit
dpdv conceptual, deci producatorul
nu mai asteapta ca tamponul sa nu
fie plin inainte de a depune un Sursa: Magee & Kramer, 2006
mesaj. 2015
2015
tIonel.start();
tGigel.start();
tMaria.start();
}
}
2015
Rendezvouz folosind clasa Exchanger
• Clasa java.util.concurrent.Exchanger<V> defineste un punct de
rendezvouz unde doua fire pot interschimba doua obiecte.
• Aceasta clasa dispune de metoda:
V exchange(V x)
Apelul asteapta un alt fir sa ajunga la punctul de rendezvouz, ii transfera
obiectul x si apoi ii returneaza un obiect receptionat de la celalalt fir.
• Apelul are si o versiune cu timeout, definita astfel:
V exchange(V x, long timeout, TimeUnit unit)
• Tema: sa se implementeze exemplul cu Ionel, Gigel si Maria folosind
clasa Exchanger. Exchanger
Object 1
Thread 1 Thread 2
Object 2
2015
Receptie selectiva
• Se refera la posibilitatea ca un proces sa astepte intrari nu doar
de pe un singur canal, ci pe o multime de canale:
either cond1 and ch1 ⇒ var1
S1
or cond1 and ch2 ⇒ var2
S2
….
or condn and chn ⇒ varn
Sn
[else Sn+1]
• In acest fel asteptarea are loc “in paralel” pe toate canalele.
Daca este prezenta clauza “else” atunci asteptarea este fara
blocare.
2015
Receptie selectiva in Promela
• Receptia selectiva se poate implementa folosind comenzi cu garzi. In
acest caz, alegerile vor contine si instructiuni de receptionare de pe canale.
• Spre exemplu, se considera o parcare in care sosesc si pleaca masini.
Numarul de locuri libere se reprezinta prin variabila spaces. Pentru
semnalarea sosirilor si plecarilor, procesul Parking primeste mesaje pe
canalele arrivals si departures de la masinile care sosesc sau pleaca.
do
:: (spaces>0) && (arrivals ? car) ->
printf(“Car %d arrived\n”,car); --spaces;
:: (spaces<N) && (departures ? car) ->
printf(“Car %d departed\n”,car); ++spaces;
od
• TODO: Implementarea receptiei selective in Java
2015
Fiabilitate si ordonare
• Fiabilitatea presupune garantarea livrarii mesajelor de
la expeditor la destinatar chiar si in prezenta unei
degradari semnificative, dar rezonabile, a numarului de
pachete pierdute din diverse cauze.
• Un serviciu nefiabil nu garanteaza livrarea mesajelor
in situatia in care pachetele de date se pot pierde.
• Integritatea presupune in mod suplimentar ca mesajele
expediate sa ajunge necorupte la destinatar.
• Ordonarea cere ca in anumite aplicatii mesajele sa fie
livrate expeditorului in ordinea expedierii lor de catre
destinatar. Nerespectarea acestei ordini este
considerata un esec.
2015
Destinatia mesajelor
• In Internet destinatia unui mesaj este o pereche (adresa IP, port local).
• Adresa IP reprezinta o adresa a unui calculator gazda conectat la Internet.
Un port local reprezinta destinatia unui mesaj pe un anumit calculator,
reprezentata printr-un numar natural. Un port reprezinta un singur
destinatar, dar poate avea mai multi expeditori.
• Un proces poate receptiona mesaje pe mai multe porturi. Orice proces ce
cunoaste numarul portului asociat unui proces destinatie, ii poate trimite
mesaje. Serverele isi publica porturile pe care primesc mesaje de la clienti.
• Daca un client utilizeaza o adresa fixa de IP pentru a se referi la un
serviciu, atunci acel serviciu va trebui sa ruleze intotdeauna pe acelasi
calculator pentru a ramane valid. Pentru a evita acest lucru, se pot utiliza
urmatoarele tehnici pentru furnizarea transparentei locatiei:
– Programele client se pot referi la servicii prin nume si pot utiliza un server de nume
(engl.name server sau binder) pentru a translata numele in adrese fizice. Aceasta
tehnica permite relocarea serviciilor, dar nu migrarea lor (migrare = mutarea unui
serviciu in timp ce sistemul este in executie), asigurand transparenta locatiei.
2015
Socluri
agreed port
socket any port
socket
message
client server
other ports
Internet address = 138.37.94.248 Internet address = 138.37.88.249
2015
2015
Comunicatia prin mesaje UDP
• http://en.wikipedia.org/wiki/User_Datagram_Protocol
• Definitie: UDP permite transferul de pachete numite
datagrame de la un proces expeditor la un proces destinatar.
Nu exista confirmare si mesajul se poate pierde sau altera
datorita erorilor de transmisie.
• Comunicatia presupune realizarea pasilor:
– Orice proces expeditor sau destinatar va crea intai un soclu legat la o
adresa de IP si un port local.
– Procesul destinatar isi va conecta soclul la un port pe care il va face
cunoscut expeditorilor.
– Expeditorul isi poate lega soclul la orice port local disponibil.
– Expeditorul executa apelul send pentru a transmite un mesaj
destinatarului.
– Apelul receive la destinatar va determina mesajul receptionat cat si
adresa de IP si portul expeditorului. Se permite astfel trimiterea
explicita a unui raspuns expeditorului. 2015
2015
Java API pentru comunicatie UDP – DatagramSocket
• Clasa DatagramSocket implementeaza socluri pentru expedierea si
receptionarea de datagrame UDP.
• Furnizeaza un constructor ce primeste un port, cat si un constructor fara
parametrii care permite sistemului sa aleaga un port liber.
public DatagramSocket() throws SocketException
public DatagramSocket(int port) throws SocketException
• Clasa DatagramSocket furnizeaza metode ce permit urmatoarele:
– Expedierea si receptia de mesaje cu send si receive. send primeste un obiect
DatagramPacket ce contine mesajul si destinatia sa. receive primeste un obiect
DatagramPacket cu mesaj vid pentru receptionarea unui nou mesaj.
public void send(DatagramPacket p) throws IOException
public void receive(DatagramPacket p) throws IOException
• Alte metode:
– setSoTimeout pentru setarea unui timeout. Astfel metoda receive se va bloca pentru
timpul specificat. Daca timpul expira se va genera exceptie
SocketTimeoutException.
– Conectarea la un anumit port si adresa IP la distanta cu connect. In acest fel soclul
se va utiliza doar pentru comunicatia cu adresa respectiva. 2015
Client UDP
import java.net.*;
import java.io.*;
public class UDPClient {
args[0] este mesajul
public static void main(String args[]) {
DatagramSocket aSocket = null;
args[1] este numele serverului
try {
aSocket = new DatagramSocket();
byte [] m = args[0].getBytes(); // Conversie mesaj in sir de octeti.
InetAddress aHost = InetAddress.getByName(args[1]); // Get hostname.
int serverPort = 6789;
Creare soclu si expediere mesaj
DatagramPacket request =
new DatagramPacket(m, args[0].length(), aHost, serverPort);
aSocket.send(request);
byte[] buffer = new byte[1000];
Receptioneaza ecoul mesajului
DatagramPacket reply = new DatagramPacket(buffer, buffer.length);
aSocket.receive(reply);
System.out.println("Reply: " +
new String(reply.getData(),0,reply.getLength()))
} catch (SocketException e)
{System.out.println("Socket: "+e.getMessage());
} catch (IOException e) {System.out.println("IO: " + e.getMessage());
} finally {if (aSocket != null) aSocket.close();}
}
} 2015
Server UDP
import java.net.*;
import java.io.*;
public class UDPServer{
public static void main(String args[]){
DatagramSocket aSocket = null;
try {
aSocket = new DatagramSocket(6789); Legarea soclului la portul 6789 al serverului
byte[] buffer = new byte[1000];
while (true) { Receptionare mesaj
DatagramPacket request = new DatagramPacket(buffer, buffer.length);
aSocket.receive(request);
DatagramPacket reply =
new DatagramPacket(request.getData(), request.getLength(),
request.getAddress(),request.getPort());
aSocket.send(reply); Expediaza mesajul in ecou
}
} catch
(SocketException e){System.out.println("Socket: " + e.getMessage());
} catch (IOException e) {System.out.println("IO: " + e.getMessage());
} finally {if(aSocket != null) aSocket.close();}
}
} 2015
Client TCP - II
} catch (UnknownHostException e) {
System.out.println("Socket:"+e.getMessage());
} catch (EOFException e) {
System.out.println("EOF:"+e.getMessage());
} catch (IOException e) {
System.out.println("readline:"+e.getMessage());
} finally {
if (s != null)
try {
s.close();
} catch (IOException e) {
System.out.println("close:"+e.getMessage());
}
}
}
}
2015
Server TCP. Acceptarea unei conexiuni
import java.net.*;
import java.io.*;
public class TCPServer {
public static void main (String args[]) {
try {
int serverPort = 6789; Legarea soclului la portul 6789 al serverului
ServerSocket listenSocket =
new ServerSocket(serverPort);
while (true) { Serverul asteapta cereri de conexiune
Socket clientSocket = listenSocket.accept();
Connection c = new Connection(clientSocket);
} Pentru fiecare cerere de conexiune serverul creaza
} catch(IOException e) { un fir responsabil cu tratarea conexiunii.
System.out.println("Listen socket:"+e.getMessage());
}
}
}
2015
2015
Server TCP. Tratarea unei conexiuni - II
public void run() {
try { // An echo server.
String data =
Firul citeste un mesaj din fluxul de intrare si
in.readUTF();
il scrie in ecou in fluxul de iesire
out.writeUTF(data);
} catch (EOFException e) {
System.out.println("EOF:"+e.getMessage());
} catch(IOException e) {
System.out.println("readline:"+e.getMessage());
} finally {
try {
clientSocket.close();
}
catch(IOException e) { /* close failed */ }
}
}
}
2015
Adresarea in Internet
• Principala functie a Internet-ului este schimbul de date intre calculatoare.
Pentru aceasta fiecare calculator din Internet are asignata o adresa IP
• Versiunea cea mai raspinadita la ora actuala a protocolului IP este IPv4.
In IPv4 adresa unui calculator este un sir de 32 de biti. Acest sir se
reprezinta sub forma unui 4-uplu format din 4 octeti, separati prin cate un
punct. Exemplu: 151.23.40.3.
• Exista si versiunea IPv6 care foloseste 128 de biti
• Multimea de adrese IP este impartita in 4 clase
– Clasa A, 0 adresa retea (7) adresa calculator (24)
– Clasa B, 10 adresa retea (14) adresa calculator (16)
– Clasa C, 110 adresa retea (21) adresa calculator (8): 192. …
– Clasa D, 1110 adresa multicast (28): 224. …
• 127.0.0.1 = adresa de loopback. Datele trimise aici se intorc inapoi la
sursa. Este utila pentru testarea aplicatiilor de retea folosind un singur
calculator
2015
Clase de adrese in Internet
7 24
Class A: 0 Network ID Host ID
14 16
Class B: 1 0 Network ID Host ID
21 8
Class C: 1 1 0 Network ID Host ID
28
Class D (multicast): 1 1 1 0 Multicast address
27
Class E (reserved): 1 1 1 1 0 unused
2015
Trimiterea multipla IP – I
• Trimiterea multipla IP (engl.IP multicast) functioneaza peste
protocolul IP. Un pachet IP este adresat unui calculator.
Porturile apar in TCP si UDP, la nivelul transport.
• Trimiterea multipla permite expeditorului sa trimita un singur
pachet IP unei multimi de calculatoare care formeaza un grup
de trimitere multipla (engl.multicast group). Identitatea
destinatarilor individuali este transparenta expeditorului. Un
grup de trimitere multipla se identifica printr-o adresa IP de
clasa D – adica o adresa cu primii 4 biti egali cu 1110 in IPv4:
224.0.0.0 – 239.255.255.255.
• Apartenenta la un grup permite unui calculator sa receptioneze
toate pachetele IP adresate grupului. Apartenenta este
dinamica, ea permite intrarea si parasirea dinamica a grupului,
cat si inscrierea simultana la mai multe grupuri. Trimiterea de
pachete catre grup nu necesita apartenenta la grup. 2015
Trimiterea multipla IP – II
• Trimiterea multipla IP este disponibila programelor de aplicatie numai la
nivelul UDP. Un proces poate transmite pachete UDP la o adresa de
trimitere multipla si un numar de port. El poate intra intr-un grup prin
adaugarea soclului sau la grup.
• La nivel IP, un calculator apartine unui grup cand unul sau mai multe
dintre procesele sale are soclul apartinand grupului. Cand un mesaj de
trimitere multipla ajunge la un calculator, el este inaintat tuturor soclurilor
locale care sunt atasate adresei respective si au portul specificat in pachet.
• Pentru implementarea trimiterii multiple in retele IP se folosesc rutere
speciale pentru trimitere multipla (engl. multicast routers).
• Adresele de trimitere multipla pot fi permanente sau temporare.
• Grupurile permanente exista chiar si daca nu au membrii. Ele au destinatie
speciala, adresele lor fiind alocate de IANA – Internet Assigned Numbers
Authority: http://www.iana.org/
• Ex. adresa 224.0.0.1 e folosita de NTP – Network Time Protocol.
• Un grup temporar are nevoie de o adresa libera. Pentru a evita participarea
accidentala la un grup deja existent, se seteaza TTL la o valoare mica.
2015
2015
Capitolul 6
2015
Invocare la distanta
• Protocoale cerere – raspuns (engl. request – reply protocols)
– Ofera suport de nivel coborat pentru emiterea unor cereri de executie a
operatiilor la distanta
– Ofera suport direct metodelor RPC si RMI
– Se bazeaza pe serializarea datelor (engl. marshalling) si referinte la
distanta (engl. remote references)
• Apel de procedura la distanta (engl. remote procedure call –
RPC), aparut in 1984
– Permite unui program client sa apeleze in mod transparent o procedura
ce ruleaza intr-un proces server, aflat posibil pe un calculator diferit de
calculatorul clientului.
• Invocarea metodelor la distanta (engl. remote method
invocation – RMI)
– Permite unor obiecte aflate in procese diferite, posibil pe calculatoare
diferite sa comunice prin invocari de metode.
2015
Impachetarea si despachetarea datelor
• Structurile de date din programele in executie trebuie serializate sub forma
de mesaje ce constau din secvente de octeti. Structurile de date compuse
trebuie liniarizate, iar datele primitive trebuie convertite in format binar.
• Reprezentarile binare ale datelor primitive specifice diverselor platforme
pot sa difere. De ex., caracterele se pot codifica Unicode sau ASCII,
intregii pot avea lungimi si orientari diferite (big endian si little endian),
iar numerele reale pot folosi diverse reprezentari in virgula mobila.
• Exista doua metode de a realiza interschimbul de date:
– Valorile sunt convertite din formatul expeditorului in format extern inaintea
transmisiei si reconvertite din formatul extern in formatul destinatarului dupa receptie.
– Valorile sunt transmise direct in formatul expeditorului impreuna cu indicarea
explicita a formatului folosit.
• Un format extern comun de reprezentare a datelor primitive si a
structurilor de date compuse se numeste reprezentare externa a datelor.
• Procesul de conversie a unei structuri de date intr-o forma convenabila
pentru transmisie = impachetare (engl. marshalling). Procesul de
reconstruire a unei structuri de date dintr-un format folosit pentru
transmisie = despachetare (engl. unmarshalling).
2015
Reprezentari externe
• Formatul de serializare al obiectelor Java.
– Specific limbajului Java
– Fiecare obiect este serializat astfel incat sa poata fi refacut la
destinatie
– Serializarea contine si informatie despre clasa obiectului
• CDR – Common Data Representation) folosit de CORBA.
– Este un format intermediar in care se traduc structurile de date din
diverse limbaje de programare
• XML (eXtensible Markup Language) / JSON (JavaScript
Object Notation)
– Continut
– Schema: defineste tipul de continut
• Ontologii pentru interoperabilitate in Semantic Web
– OWL
2015
Referinte la distanta I
• Cand un client invoca o metoda a unui obiect aflat la distanta –
OD (engl. remote object) se va trimite un mesaj de invocare
catre procesul server care gazduieste obiectul. Acest mesaj
trebuie sa specifice obiectul referit.
• Referinta unui obiect la distanta (engl. remote object reference)
– ROD = identificator al unui obiect care este valid intr-un SD.
• In cadrul oricarui mesaj de invocare a unui OD se transmite un
ROD.
• ROD trebuie generate astfel incat sa se asigure unicitatea lor in
timp si spatiu. Deoarece pot exista mai multe procese ce
gazduiesc OD, trebuie ca ROD sa fie unice pe multimea tuturor
acestor procese. Chiar si dupa ce un OD a fost sters, ROD
corespunzatoare nu se va refolosi pentru a se evita referirea
unor obiecte eronate.
2015
Referinte la distanta II
• O reprezentare a unui ROD poate contine: adresa de IP a
calculatorului, numarul portului, data crearii OD, un numar
local al obiectului ce este incrementat automat de procesul
care a creat OD. La aceasta se poate adauga o descriere a
interfetei OD.
• In cazul in care un OD exista numai in cadrul procesului care
l-a creat si va dispare odata cu distrugerea acestuia, o ROD va
putea fi folosita pe post de adresa a obiectului.
• In cazul in care obiectele pot fi relocate intr-un alt proces pe
un calculator diferit, o ROD nu se va putea utiliza pe post de
adresa a obiectului, pentru aceasta existand tehnici speciale.
32 bits 32 bits 32 bits 32 bits
IP address interface of
port number time object number
remote object
2015
Protocol cerere-raspuns
Client Server
Request
doOperation
message getRequest
select object
(wait) execute
Reply method
message sendReply
(continuation)
Identificatori de mesaje
• Orice schema de gestiune a mesajelor intr-un SD ce presupune
asigurarea fiabilitatii si/sau implementarea unui protocol
cerere-raspuns cere ca fiecarui mesaj sa i se aloce un
identificator unic.
• Un identificator de mesaj are doua parti:
– requestId ce se genereaza prin incrementare de catre expeditor. Se
impune ca ciclul de viata al mesajului sa fie mai mic decat timpul in
care generatorul revine la 0.
– Identificatorul procesului expeditor: adresa de IP si numar port. Se
poate determina dintr-un pachet UDP
• Daca requestId se reprezinta pe n biti atunci valoarea sa
maxima este 2n-1. Dupa depasirea valorii maxime, valorile se
reiau prin incrementare de la 0. Se impune ca timpul in care se
epuizeaza toate valorile posibile sa fie mult mai mare decat
durata medie de viata a mesajului in sistem. 2015
Modelul de eroare al protocolului cerere-raspuns
2015
Timeout
• Metoda doOperation trebuie sa foloseasca tehnica
timeout pentru a trata cazurile de oprire neasteptata a
serverului sau de pierdere a mesajelor. In acest caz
exista diverse optiuni:
– Retur imediat cu indicarea catre client ca operatia a esuat.
– Eroarea de timeout poate fi cauzata de pierderea mesajelor
de cerere sau de raspuns. In acest caz doOperation poate
emite cererea in mod repetat pana cand fie primeste un
raspuns, fie intarzierea de primire a raspunsului este
suficient de mare ca sa existe certitudine ca problema este de
la server, nu de la pierderea mesajelor.
2015
Inlaturarea mesajelor de cerere duplicate
• In cazurile in care cererea este retransmisa, serverul o
poate receptiona de mai multe ori. De exemplu, serverul
poate primi cererea, insa executarea cererii si emiterea
raspunsului de catre server poate dura mai mult decat
cuanta de timeout.
• Astfel ca exista posibilitatea ca serverul sa execute
cererea de mai multe ori.
• Din acest motiv, mesajele cu acelasi requestId trebuie
recunoscute si filtrate.
• Daca insa raspunsul nu a fost inca transmis, nu trebuie sa
se execute nici o actiune speciala.
2015
2015
Istoricul interactiunii
• Pentru serverele care necesita retransmisia raspunsului fara a reexecuta
operatia trebuie gestionata istoria interactiunii.
• Se numeste istorie o structura care contine mesajele de raspuns care au
fost transmise. O intrare in aceasta structura contine un identificator al
cererii, un mesaj de raspuns si identificatorul clientului catre care a fost
transmis. Aceasta structura se foloseste pentru a permite serverului sa
retransmita mesajele de raspuns la cererile clientilor.
• Pentru ca structura sa nu devina prea mare serverul trebuie sa poata decide
cand anumite raspunsuri nu mai trebuie pastrate in istorie. Deoarece un
client face o singura cerere la un moment dat, serverul poate interpreta
fiecare noua cerere drept o confirmare a raspunsului anterior. De aceea
istoria poate pastra doar ultimul mesaj de raspuns trimis fiecarui client.
• Tot sunt insa probleme daca numarul clientilor este mare.
• Deoarece cand un client se termina el nu va confirma ultimul raspuns
primit, acesta va trebui sa fie inlaturat automat din istorie dupa un anumit
timp.
2015
Interfete (I)
• Limbajele moderne de programare permit organizarea
programelor ca multimi de module ce comunica intre ele.
Comunicarea se face printr-o interfata pentru fiecare modul in
parte.
• Interfata unui modul specifica metodele si variabilele ce pot fi
accesate din alte module.
• Modulele unui SD pot rula in procese separate. Astfel ca un
modul nu va putea accesa variabilele din alt modul. Chiar daca
de exemplu se poate specifica accesul la anumite atribute,
accesul propriuzis se va face prin medode getter si setter.
• Tehnicile clasice de transfer a parametrilor (apel prin valoare si
apel prin referinta) nu sunt potrivite cand apelantul si apelatul
sunt in procese diferite.
2015
Interfete (II)
• Specificarea unei proceduri sau metode intr-o interfata a unui modul intr-
un SD se face prin parametrii de intrare/iesire.
– Parametrii de intrare sunt transmisi modulului la distanta prin trimiterea valorilor lor
intr-un mesaj de cerere si apoi folosirea lor drept argumente pentru executarea
operatiei la server.
– Parametrii de iesire sunt returnati in mesajul de raspuns si sunt utilizati drept rezultat
al apelului sau vor inlocui valorile variabilelor corespunzatoare din mediul apelului.
– Cand un parametru este atat de intrare cat si de iesire, valoarea corespunzatoare va fi
transmisa atat in mesajul de cerere cat si in cel de raspuns.
• Deoarece pointerii dintr-un proces nu sunt valizi intr-un alt proces, ei nu
se transmit ca argumente si nu se returneaza ca rezultate in apeluri la
distanta.
• In modelul client-server, serverul furnizeaza o interfata pentru servicii –
IS (engl.service interface). In SD obiectuale, un OD furnizeaza o interfata
la distanta – ID (engl.remote interface). Intre ele exista diferenta ca
metodele dintr-o ID pot transmite obiecte si/sau ROD ca argumente si pot
returna obiecte si/sau ROD ca rezultate.
2015
2015
Modelul obiectual I
• O aplicatie obiectuala consta dintr-o multime de obiecte ce
interactioneaza. Un obiect incapsuleaza date si cod. Vom presupune ca
accesul la datele private ale unui obiect se poate face numai prin
intermediul metodelor sale.
• Referinte la obiecte. Obiectele sunt accesate prin referinte. Invocarea
metodelor unui obiect se face prin intermediul referintei la obiect.
Obiectul a carui metoda a fost invocata se numeste obiect tinta
(engl.target) sau receptor (engl.receiver). Referintele pot fi atribuite
variabilelor, transmise ca argumente metodelor sau returnate ca rezultate
ale metodelor.
• Interfete. O interfata defineste semnaturile unei multimi de metode. Un
obiect furnizeaza o anumita interfata daca clasa sa contine cod ce
implementeaza metodele interfetei respective. O clasa poate implementa
mai multe interfete. O interfata defineste un tip ce se poate folosi in
declaratii de variabile sau parametrii.
2015
Modelul obiectual II
• Actiuni. O actiune se initiaza cand un obiect invoca o metoda a
altui obiect. Obiectul receptor executa metoda corespunzatoare
si eventual intoarce controlul obiectului apelant. O invocare
poate avea doua efecte:
– schimbarea starii obiectului receptor;
– crearea de noi obiecte;
– invocari ulterioare de metode ale altor obiecte.
• Exceptii. Exceptiile sunt metode elegante de a trata erorile, fara
complicarea codului. Ele separa clar codul de tratare a erorilor
de codul pentru o executie normala.
• Colectarea gunoaielor. Este mecanismul prin care se asigura
eliberarea automata a spatiului de memorie ocupat de obiectele
care nu mai sunt necesare.
2015
SD obiectuale
• Starea unui obiect este multimea valorilor variabilelor membre. In acest
fel starea unui program obiectual este partitionata logic intr-o multime de
obiecte. Distribuirea fizica a acestor obiecte in procese si/sau calculatoare
diferite este o extensie naturala a modelului obiectual.
• SD obiectuale pot adera la o arhitectura client-server. Obiectele sunt
gestionate de servere iar clientii pot invoca metodele acestora folosind
RMI. Obiectele din servere pot fi la randul lor clienti ale unor obiecte din
alte servere.
• Obiectele dintr-un SD pot fi replicate pentru cresterea tolerantei la defecte
si imbunatatirea performantelor sau pot migra pentru cresterea
performantei si a disponibilitatii.
• Obiectele pot folosi primitive de sincronizare pentru a-si asigura accesul
concurent corect la propriile variabile membre.
• Accesul la obiecte doar prin metode este un prim pas spre independenta de
formatul de reprezentare si de caracteristicile fizice ale platformei gazda.
2015
Modelul obiectual distribuit (I)
• Are la baza doua concepte fundamentale: i) referinta unui obiect la
distanta (engl.remote object reference) – ROD; ii) interfata la distanta
(engl.remote interface) – ID.
• ROD este o extensie a conceptului de referinta a unui obiect la SD. O
ROD este un identificator care se poate folosi intr-un SD pentru referirea
la un obiect unic. ROD se folosesc pentru invocarea unei metode a unui
OD si pot fi transmise ca argumente si intoarse ca rezultate in RMI.
• O ID specifica metodele unui OD care pot fi invocate prin RMI de catre
alte obiecte. In CORBA, definirea ID se face folosind limbajul CORBA
IDL. In Java RMI, o ID se defineste prin extinderea interfetei Remote.
• Actiunile intr-un SD obiectual pot genera lanturi de RMI.
remote local C
invocation invocation local E
invocation remote
invocation F
B local
A
invocation D
2015
remoteobject
Data
remote
interface
m1 implementation m4
{ m2
m3 of methods
m5
m6
2015
Instantierea OD
• AD pot contine OD ce dispun de metode speciale – gen
constructor, pentru instantierea altor OD ce pot fi ulterior
invocate prin RMI.
• Spre exemplu, obiectul L din figura de mai jos contine o
metoda pentru crearea de OD. Astfel ca in urma invocarii la
distanta de catre obiectele C si K ale metodei constructor din
obiectul L vor fi create 2 OD si anume M si N.
2015
Semantica RMI
• Am aratat ca implementarea functiei doOperation in protocolul RR se poate face in
diverse moduri, asigurandu-se diverse nivele ale garantarii livrarii parametrilor:
– Reincercarea de a transmite mesajul de cerere: mesajul de cerere este retransmis pana cand se
receptioneaza un raspuns sau se presupune ca serverul s-a oprit.
– Filtrarea duplicatelor: cand se utilizeaza retransmiterea, cererile duplicate sunt filtrate si
eliminate de catre server.
– Retransmisia rezultatelor: se pastreaza o istorie a mesajelor cu rezultatele, pentru a permite
retransmiterea fara reexecutarea operatiilor la server.
• Diverse combinatii ale acestor variante conduc la o varietate de semantici posbile pentru
fiabilitatea RMI din punctul de vedere al apelantului.
2015
2015
Transparenta RMI
• In general, invocarile la distanta sunt similare cu invocarile locale din
punct de vedere sintactic.
• Cu toate acestea, invocarile la distanta sunt mai vulnerabile la erori decat
invocarile locale. Indiferent de semantica adoptata, exista intotdeauna
posibilitatea sa nu se obtina nici un rezultat si in cazul unei erori sa nu se
distinga intre o eroare de retea si o eroare in procesul server. Din acest
motiv trebuie ca obiectele care efectueaza invocari la distanta sa poata
recupera din eventualele erori.
• Astfel se apreciaza ca diferentele dintre invocarile locale si invocarile la
distanta trebuie sa existe la nivelul interfetelor. Spre exemplu, in Java
RMI, OD se disting prin faptul ca implementeaza interfata Remote. Ele
pot genera exceptii RemoteException.
• Implementatorii OD cu interfetele specificate printr-un IDL vor avea in
vedere faptul ca aceste obiecte pot fi accesate concurent de clienti
multiplii, trebuind sa ia masurile de proiectare corespunzatoare.
• O alta varianta o reprezinta RMI tranzactional – unui apel la distanta i se
ataseaza proprietati de tranzactie – ACID.
2015
Implementarea RMI
• Consta dintr-o multime de obiecte si module ce includ:
– Modulul de comunicatie
– Modulul de gestiune a ROD
– Software-ul de RMI, ce contine obiectele proxy, skeleton si dispatcher.
2015
Modulul de comunicatie
• Exista doua module de comunicatie care interactioneaza cu un
protocol RR. Aceste module vor folosi doar primele trei
campuri din cadrul mesajelor de cerere-raspuns: messageType,
requestId si remoteReference (pe post de ROD). Campurile
operationId si arguments sunt tratate separat de software-ul de
RMI.
• Modulele de comunicatie sunt responsabile sa asigura o
anumita semantica, de exemplu at-most-once.
• Modulul de comunicatie din server selecteaza obiectul
dispatcher corespunzator clasei obiectului invocat. Pentru
aceasta el obtine referinta locala a obiectului de la modulul
pentru referinte la distanta, dupa ce i-a transmis ROD din
cadrul mesajului de cerere.
2015
Modulul de gestiune a ROD
• Este responsabil cu traducerea intre referintele locale si ROD si pentru
crearea ROD. Pentru aceasta el gestioneaza o tabela de obiecte la distanta
(engl.remote object table) – TOD.
• TOD memoreaza corespondenta intre referintele locale in cadrul
procesului si ROD. Tabela include:
– cate o intrare pentru fiecare OD continut de procesul server;
– cate o intrare pentru fiecare obiect proxy local.
• Modulul este apelat de software-ul de RMI, cand se impacheteaza sau
despacheteaza ROD.
• Actiunile acestui modul sunt:
– cand un OD este transmis ca argument sau intors ca rezultat pentru prima oara, acest
modul este interogat pentru a crea o ROD pentru acest obiect, acest ROD fiind
adaugat la tabela;
– cand se primeste un mesaj de cerere sau raspuns cu un ROD, modulul este interogat
pentru a determina referinta locala corespunzatoare. Ea poate fi un obiect proxy sau o
referinta la OD propriuzis. Daca ROD nu este in taabela, atunci se creaza un nou
obiect proxy si se adauga la tabela.
2015
Software-ul de RMI
• Are componentele:
– Obiectul proxy sau stub.
– Obiectul dispatcher.
– Obiectul skeleton.
2015
Obiectul proxy sau stub
• Rolul unui obiect proxy este de a face invocarea metodelor la
distanta transparenta pentru client; ele vor delega invocarea
catre OD, ascunzand: referirea OD, impachetarea argumentelor,
despachetarea rezultatului si expedierea/receptia mesajelor.
• Exista cate un obiect proxy pentru fiecare OD referit dintr-un
proces client ce detine o ROD. Clasa obiectului proxy
implementeaza metodele ID ale OD pe care il reprezinta, dar
diferit de OD. Fiecare metoda a obiectului proxy impacheteaza
o ROD la obiectul tinta, propriul operationId si argumentele
sale intr-un mesaj de cerere trimis catre server. Apoi asteapta
un mesaj de raspuns, despacheteaza rezultatul si il intoarce
obiectului apelant.
2015
Obiectul dispatcher
• Un server are cate un obiect dispatcher (dispecer) si un
obiect skeleton (schelet) pentru fiecare clasa
reprezentand un OD. Obiectul dispecer primeste
mesajul de cerere de la modulul de comunicatie si
utilizeaza campul operationId pentru a selecta metoda
corespunzatoare din obiectul schelet. Obiectele
dispecer si schelet utilizeaza acelasi operationId pentru
metodele ID.
2015
Obiectul skeleton
• Acest obiect (schelet) implementeaza metodele din ID.
Implementarea este insa diferita fata de cea din OD,
continand un cod “liant” cu mesajele de cerere /
raspuns, pe langa invocarea metodelor OD.
• O metoda a scheletului:
– despacheteaza argumentele metodei din mesajul de cerere
– invoca metoda corespunzatoare din OD
– asteapta terminarea invocarii
– impacheteaza rezultatul, impreuna cu exceptiile, intr-un
mesaj de raspuns catre mesajul de cerere expediat de
obiectul proxy.
2015
2015
Probleme la implementarea RMI (II)
• Metode factory. Am aratat ca ID nu pot contine constructori. Acest lucru
inseamna ca OD nu pot fi create prin invocarea la distanta a constructorilor. OD
se creaza fie in sectiunea de initializare a serverului, fie printr-o ID proiectata
special pentru aceasta. Termenul de metoda factory este folosit pentru a indica o
metoda de creare a OD. Un obiect factory este un obiect creat cu o metoda
factory. Orice OD care trebuie sa poata crea noi OD la cerere trebuie sa
furnizeze metode in propria ID pentru acest scop.
• Serviciul de nume (engl.binder). In general, programele client necesita o
modalitate de a putea obtine o ROD pentru cel putin un OD gazduit de server.
Un serviciu de nume intr-un SD este un serviciu separat care gestioneaza o
tabela cu maparile numelor textuale ale OD la ROD. Acest serviciu este utilizat
de programele server pentru inregistrarea OD pe care le gazduiesc si de
programele client pentru regasirea lor. Serviciul de nume Java RMI este
RMIRegistry, iar servicul de nume CORBA este CORBA Naming Service.
• Fire pe server. Ori de cate ori un obiect executa o invocare la distanta, executia
poate conduce la alte invocari de metode, eventual la distanta, inainte de
intoarcerea unui rezultat. Pentru a se evita ca o invocare la distanta sa provoace
intarzieri ale unor invocari ulterioare din acelasi obiect, in general serverele
aloca cate un fir separat pentru executia fiecarei invocari la distanta. 2015
Activarea OD
• Unele aplicatii cer ca informatiile sa supravietuiaca perioade lungi de timp. Nu este insa
practic ca obiectele ce gestioneaza aceste informatii sa fie mentinute in cadrul proceselor
in executie pentru un timp nelimitat, deoarece ele nu sunt efectiv folosite in tot acest
timp. Pentru a se evita pierderea de resurse datorata executiei continue a serverelor ce
gazduiesc OD, se poate recurge la pornirea acestor servere ori de cate ori acest lucru este
cerut de catre clienti. Procesele care pornesc procese server se numes activatori
(engl.activator), de exemplu serviciul Inetd din Linux.
• Un OD este activ cand este disponibil pentru RMI intr-un proces in executie. Altfel el
este pasiv, dar poate fi activat. Un OD pasiv consta din 2 parti: i) implementarea
metodelor; ii) starea sa in forma impachetata.
• Activarea unui OD consta din crearea unui obiect activ din obiectul pasiv asociat prin
crearea unei noi instante a clasei si initializarea variabilelor membre din starea salvata.
Activarea poate avea loc la cerere, de exemplu cand obiectul este invocat de alt obiect.
• Un proces activator are urmatoarele responsabilitati: i) inregistrarea obiectelor pasive
care sunt disponibile pentru activare. Acest lucru presupune inregistrarea numelor
serverelor la URL-urile sau numele fisierelor corespunzatoare obiectelor pasive; ii)
pornirea proceselor server si activarea OD din cadrul lor; iii) Monitorizarea locatiilor
serverelor pentru OD ce au fost deja activate.
• In CORBA activatorul se cheama implementation repository. In Java RMI exista cate un
activator pentru fiecare calculator server.
2015
Persistenta obiectelor
• Un obiect care transcede peste activarile/dezactivarile proceselor server se numeste
obiect persistent – OP. Un astfel de obiect este in general gestionat de o memorie de OP
– MOP care stocheaza starea sa in forma impachetata pe disc.
• O MOP gestioneaza un numar mare de OP. Ele sunt activate in momentul invocarii lor de
catre alte obiecte. Activarea este transparenta din punctul de vedere al obiectului apelant.
Cand nu mai sunt necesare in memorie, OP sunt pasivizate si salvate in MOP. MOP are
nevoie de o strategie pentru pasivizarea OP (de exemplu la sfarsitul unei tranzactii, cand
OP au o stare consistenta, sau la terminarea programului). MOP realizeaza si o
optimizare, salvand doar acele obiecte care au fost modificate de la ultima salvare.
• MOP permit in general organizarea OP sub forma de colectii cu nume interpretabile de
un agent uman – URL sau cale in sistemul de fisiere.
• Exista doua abordari pentru a decide daca un obiect este OP sau nu: i) MOP gestioneaza
multimea radacinilor colectiilor de obiecte persistente si orice obiect care este accesibil
dintr-o astfel de radacina este OP. Aceasta abordare este folosita de Persistent Java.
MOP ce folosesc aceasta abordare se bazeaza pe un colector de gunoaie pentru a elimina
obiectele care nu mai sunt accesibile dintr-o radacina persistenta; ii) MOP utilizeaza
clase speciale pe care se bazeaza persistenta. Un OP apartine unei astfel de subclase.
Obiectele care nu mai sunt necesare trebuie sterse explicit (abordare specifica C++).
2015
Proiectarea ID a MGC
Transferul parametrilor II
• Argumentele si valorile returnate ale metodelor la distanta pot fi de
urmatoarele tipuri: obiecte locale, OD, tipuri primitive, etc. Obiectele
locale trebuie sa fie serializabile.
• Regulile de transfer sunt urmatoarele:
– OD sunt transmise in general prin referinta – ROD. Pe partea de client o ROD
desemneaza obiectul stub asociat OD respectiv.
– Obiectele locale sunt transmise prin valoare, folosind serializarea obiectelor. Se
copiaza implicit toate campurile, exceptand campurile static si transient.
• Transferul unui OD prin ROD inseamna ca orice modificare a starii OD
prin invocarea unei metode la distanta se va reflecta in OD. Cand se
transmite un OD, numai metodele definite de ID sunt disponibile la
receptor. Celelalte metode din implementarea clasei obiectului nu sunt
disponibile receptorului.
• In schimb transferul unui obiect local presupune transferul prin valoare,
fiind creata o copie a obiectului la receptor. Astfel ca orice schimbare a
obiectului la receptor nu se va reflecta in originalul copiei la expeditor.
2015
Implementarea unei ID
• O clasa ce implementeaza una sau mai multe ID-uri trebuie in general sa
realizeze urmatoarele:
– Sa declare ce ID-uri implementeaza
– Sa defineasca cate un constructor pentru fiecare OD
– Sa furnizeze cate o implementare pentru fiecare dintre metodele din ID-urile
implementate
• Un program server RMI trebuie sa creeze o multime de OD-uri initiale si
sa le ‘exporte’ in cadrul sistemului RMI. Acest lucru inseamna ca ele vor
fi disponibile invocarii la distanta.
• Procedura de initializare - setup poate fi incapsulata intr-una dintre
metodele implementare clasei unui OD sau poate fi inclusa intr-o alta
clasa. Ea trebuie sa realizeze urmatoarele:
– Sa creze si sa instaleze un manager de securitate
– Sa creeze si sa ‘exporte’ unul sau mai multe OD-uri
– Sa inregistreze cel putin un OD in registrul RMI (sau intr-un alt serviciu de nume,
cum ar fi un serviciu accesibil prin Java Naming and Direcory Interface – JNDI)
pentru
2015
Implementarea MGC I
package engine;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;
import compute.Compute;
import compute.Task;
public ComputeEngine() {
super();
}
2015
Capitolul 7
2015
http://www.google.comlsearch?q=kindberg
www.google.com
www.cdk3.net Internet
http://www.cdk3.net/
www.w3c.org
Activity.html
2015
Standarde Web
• Sunt specificatii formale si tehnice non-
proprietare ale diverselor aspecte ale Web-ului.
2015
Arhitectura Web-ului
• Este o arhitectura client/server tipica.
– Un server Web are sarcina de a gestiona o multime de
documente din cadrul Web. Aceste documente se numesc si
pagini Web.
– Un client generic de Web este un program care emite cereri
catre un server Web pentru accesarea paginilor Web
gestionate de acel server. Exemple de clienti sunt:
• Un navigator WWW care permite regasirea si afisarea paginilor
WWW in scopul vizualizarii continutului lor de catre un agent
uman.
• Un program de tip softbot care localizeaza diverse pagini WWW
in scopul crearii unui index. Indexul poate fi utilizat ulterior de un
motor de cautare.
2015
Web – concepte de baza
• Conceptele de baza ale Web-ului:
– Protocolul de transfer al
documentelor (engl. hypertext
transfer protocol) HTTP
– Limbajul de reprezentare a
continutului paginilor Web (engl.
hypertext markup language) HTML
2015
Istoric HTTP
• Este protocolul de comunicare intre clientii si serverele Web. Specifica
cererile care pot fi adresate de clienti si raspunsurile care pot fi generate
de servere. Specificatia defineste structura si formatul (sintaxa) acestora.
• HTTP/0.9 (versiunea initiala), inainte de raspandirea WWW, foarte
limitata. Singura cerere admisa este GET, la care serverul raspunde cu
documentul cerut.
• HTTP/1.0 (1992), este un document informativ, nu un standard. Foloseste
conceptul de tip media (MIME). S-au introdus noi cereri, de exemplu
cererea POST pentru trimiterea de date de la client catre server.
• HTTP/1.1 (1997). Inlatura problemele versiunii anterioare: i) modelul
interactiunii unice cerere/raspuns pe conexiune TCP/IP, model care are
performante slabe. Aceasta versiune introduce conexiunile persistente; ii)
lipsa de suport pentru gazdele virtuale non-IP. Conceptul de gazda
virtuala (engl.virtual host) permite unui server WWW sa deserveasca
cereri catre mai multe calculatoare gazda. In HTTP/1.1 este posibil sa se
specifice explicit in cererea HTTP calculatorul gazda careia ea ii este
adresata rezultand astfel conceptul de gazda virtuala non-IP.
2015
HTTP – protocol cerere-raspuns
• HTTP = protocol de aplicatie de tip cerere-raspuns (engl.request-reply).
• Protocoalele de aplicatie faciliteaza comunicatia intre componentele unei
aplicatii distribuite. Exemple: SMTP, IMAP, POP3, etc.
• Conform modelului cerere-raspuns, un proces client emite cereri catre un
proces server. Procesul server proceseaza cererea si intoarce un raspuns.
• Se mai numeste model pull, prin contrast cu un model push in care
clientul este instiintat automat de schimbarile de stare ale serverului.
• Cererile si raspunsurile HTTP se mai numesc si mesaje. Un mesaj este un
sir de caractere ce contine: linia de start (engl.start line), zero sau mai
multe campuri antet (engl.message header field) si optional un camp
corp (engl.message body field).
• Cererile contin informatii de identificare a tipului entitatilor. Se foloseste
formatul MIME (Multipurose Internet Mail Extensions). Untip MIME
specifica un tip si un subtip, de exemplu: text/plain, text/html,
image/jpeg, etc.
2015
2d8
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<html>
....
</html>
2015
cerere =
linie-de-cerere
(antet-general | antet-cerere | antet-entitate)*
sfarsit-de-linie
[corp-mesaj]
linie-de-cerere = metoda spatiu uri spatiu versiune-http sfarsit-de-linie
metoda =
OPTIONS | GET | HEAD | POST | PUT | DELETE |
TRACE | CONNECT | metoda-extensie
uri = * | uri-absolut | cale-absoluta
2015
Sintaxa formala a unui raspuns HTTP
Un raspuns HTTP are structura urmatoare: eroare-client = cerere-gresita | neautorizat |
raspuns = plata-necesara | interzis |
linie-de-stare resursa-inexistenta | metoda-nepermisa | ...
(antet-general | antet-raspuns | antet-entitate)* cerere-gresita = 400
sfarsit-de-linie neautorizat = 401
[corp-mesaj] plata-necesara = 402
linie-de-stare = versiune-http spatiu cod-stare interzis = 403
spatiu fraza-motiv sfarsit-de-linie resursa-inexistenta = 404
cod-stare = cod-succes | redirectare | metoda-nepermisa = 405
eroare-client | eroare-server | ...
eroare-server = eroare-interna | nu-este-
cod-succes = ok | creat | acceptat | ... implementata | ...
ok = 200 eroare-interna = 500
creat = 201 nu-este-implementata = 501
acceptat = 202
redirectare = mutat-permanent | mutat-temporar
| ...
mutat-permanent = 301
mutat-temporar = 302
2015
Cookies
• HTTP este un protocol fara stare (engl.stateless). HTTP nu dispune de
un mecanism propriu care sa permita unui server Web sa poata pastra
informatii despre starea clientului.
• Termenul de cookie se refera la mecansimul prin care o aplicatie Web pe
partea de server poate stoca si regasi informatii despre starea unui client.
HTML – Istoric II
• XHTML 1.0, este o reformulare a HTML 4.01 ca aplicatie XML intr-o
recomandare W3C de la inceputul lui 2000. La inceputul lui 2001
XHTML 1.1 extinde XHTML 1.0 cu facilitati pentru modularizare.
• Incepand cu 2003 s-a lucrat la specificatia XForms pentru specificatia
formularelor Web.
• Ulterior a aparut ideea preluarii ideilor XForms in HTML. Dar aceasta
idee a fost initial rejectata de W3C, ca fiind in conflict cu directia
dezvoltarii formularelor Web bazate pe XML.
• Cu toate acestea, ideea a fost continuata de implementatorii de
navigatoare (Opera, Mozzila, Apple).
• In 2006 W3C a reluat ideea dezvoltarii HTML, iat in 2007 a fost creat un
grup W3C responsabil cu dezvoltarea HTML 5.0 (sau HTML5).
• In februarie 2014 a fost publicata o recomnadere candidat W3C pentru
HTML5.
2015
HTML – Concepte
• Lingua franca pentru hipertext in Web.
• HTML este inspirat din SGML. SGML a fost
inventat in 1986 (mult inainte de aparitia Web).
• SGML este un limbaj de meta-marcare (engl.meta-markup). In
esenta el permite definirea de noi tipuri de documente printr-o
definitie de tip de document – DTD. Unui tip ii corespunde un
limbaj de marcare specific (ex. HTML). El descrie continutul
si structura unui document. Un document scris intr-un limbaj
de marcare contine:
– Date = continutul propriuzis al documentului.
– Marcaje = informatii referitoare la structura documentului.
Se numesc si metadate.
• XML este un limbaj de meta-marcare inspirat tot de SGML.
2015
HTML 4.0
• Pentru a sprijini si versiunile mai vechi de HTML, versiunea 4.0 defineste 3
tipuri de documente HTML:
– Documente tranzitionale: acest tip se va folosi doar pentru verificarea
documentelor HTML, in nici un caz pentru generarea de noi documente.
Astfel, elemente ca BASEFONT, FONT, CENTER, S, STRIKE sau U sunt
doar parte a documentelor tranzitionale. Ele sunt folosite pentru formatare.
In viitor formatarea se va face cu foi de stiluri CSS.
– Documente stricte: acest tip nu include elementele prezente in documentele
tranzitionale pentru compatibilitate cu versiunile anterioare de HTML.
– Documente tip colectii de pagini
• Tipul de document se defineste printr-o definitie de tip (concept preluat din
SGML). Definitia de tip se specifica optional la inceputul unui document
HTML astfel:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3c.org/TR/REC-html40/strict.dtd">
2015
Structura unui document HTML
• Un document HTML contine date si marcaje (engl.tag). Marcajele contin
informatia de formatare (pentru programul navigator), iar datele reprezinta
continutul documentului. Ele determina modul de afisare a datelor.
Marcajele pot fi: de inceput (engl.start tag) si de sfarsit (engl.end tag).
• Un marcaj de inceput poate contine optional atribute cu valori astfel:
<marcaj atribut = ”valoare” atribut = ”valoare” …>
Ex: <img src= ”logo.gif” alt=”home page” >
• Un marcaj de sfarsit se scrie astfel:
</marcaj>
Ex: </img>
• Teoretic marcajele trebuie inchise corect, ca parantezele unei expresii
matematice. In practica, deseori, marcajele de sfarsit se omit, ambiguitatile
fiind rezolvate prin metode ad-hoc de programul navigator. Astfel ca
HTML4 s-a redefinit in XML rezultand XHTML. In XML un document
este bine-format (engl.well-formed), cu marcajele inchise corect.
• Un document HTML contine un antet (engl.header) si un corp (engl.body)
intre marcajele <html> si </html>. html este elementul radacina.
2015
Legaturi HTML
• Se bazeaza pe folosirea de ancore (engl.anchor) cu elementul a. Exista
doua tipuri de ancore: ancore sursa si ancore destinatie.
• Ancorele sursa au forma
<a href=”url”>text</a>
si reprezinta originea unei legaturi. url reprezinta resursa destinatie a
legaturii. text este textul afisat in zona sensibila a legaturii.
• Ancorele destinatie au forma
<a name=”nume”></a>
si reprezinta destinatia unei legaturi. Numele unei ancore destinatie
poate fi specificat intr-o ancora sursa prin #nume pe post de url.
Ancorele destinatie se pot specifica si cu atributul id in cadrul
elementului referit, in acest caz numai fiind nevoie sa se foloseasca
elementul a.
2015
Paginile Web statice si dinamice
2015
– Folosind metoda GET, datele sunt atasate URL-ului sub forma unor perechi
variabila-valoare. In acest caz URL-ul reprezinta un program aflat pe server si datele
sunt transmise acestui program in mediul sau de executie (engl.environment). La
URL se adauga un sir de forma:
?nume1=valoare1&nume2=valoare2& … &numen=valoaren
Un caracter special printr-un cod hexa precedat de ’%’. Ex. ?cale=%2Fweb%2
semnifica valoarea /web/ pentru variabila cale.
– Folosind metoda POST, datele sunt atasate in corpul cererii, spre deosebire de cazul
anterior, unde sunt atasate URL-ului, in antet. Ele sunt transmise programului prin
intrarea standard.
2015
Nume=abc&
Parola=12ab&
Validare=on&
Grup=2&
Trimite=Trimite&
Poza=C%3A%5Cbackup%5Cpersonal%5CDarrelInceBook%5CCd+
Book%5Cindex.htm&
Secret=Secret&
COMENTARIU=comentariu&
OPTIUNI=Valoarea+2
2015
Utilizarea clientului de HTTP
• Clientul se poate rula considerand sintaxa simplificata a metodei GET:
GET /~badica_costin/proiecte/hiperproc/index_e.html
• si apoi considerand sintaxa completa:
GET /~badica_costin/proiecte/hiperproc/index_e.html HTTP/1.1
Connection: Keep-Alive
Host: software.ucv.ro
Accept: text/html
• Se observa ca in primul se livreaza direct continutul HTML al resursei.
• In al doilea caz apare un raspuns detaliat conform sintaxei raspunsurilor HTTP:
HTTP/1.1 200 OK
Date: Mon, 31 Mar 2008 15:50:50 GMT
Server: Apache/1.3.37 (Unix) mod_ssl/2.8.28 OpenSSL/0.9.8b PHP/4.4.4
Last-Modified: Thu, 23 Feb 2006 09:54:23 GMT
ETag: "9f41-1c78-43fd864f"
Accept-Ranges: bytes
Content-Length: 7288
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: text/html
2015
Implementarea unui server de Web - II
import java.io.*;
public class WebServer {
Socket soc;
OutputStream os; BufferedReader is;
String resource;
void getRequest() {
try {
String message;
while ((message = is.readLine()) != null) {
if (message.equals(""))
break; // end of command block
System.out.println(message);
StringTokenizer t = new StringTokenizer(message);
String token = t.nextToken(); // get first token
if (token.equals("GET")) { // if token is ”GET”
resource = t.nextToken(); // get second token
System.out.println(resource);
}
}
} catch (IOException e) {
System.err.println("Error receiving Web request");
}
}
2015
2015
Servere Web
• Server Web = un program cu rol de server care este
capabil sa raspunda la cereri HTTP.
• Modul de functionare al unui server Web este foarte
important pentru infrastructura si aplicatiile Web, desi in
acelasi timp este ascuns utilizatorilor uzuali ai Web.
• Probleme importante referitoare la serverele Web sunt:
– Performanta
– Configurarea si administrarea
– Extensia si programarea
• Exemple de servere Web:
– Apache Tomcat (disponibil liber in domeniul public este) httpd
– MS Internet Information Services-IIS
2015
Functii de baza ale serverelor Web
2015
2015
Configuratii de servere Web
• Optiunile de configurare ale unui server Web se refera
in general la:
– Modul in care se va executa serverul pe masina care il
gazduieste:
• la cerere
• permanenta
– Daca serverul deserveste mai multe domenii folosind un
singur calculator si o singura adresa de IP. Aceste domenii
se numesc gazde virtuale (engl.virtual host).
– Modul de lucru:
• server de origine
• proxy
2015
2015
Executia permanenta a serverelor Web
• Serverul este pornit manual de utilizator sau automat
la pornirea sistemului si se executa in permanenta.
Dupa pornire serverul asculta cererile HTTP pe portul
pe care a fost configurat.
– Pornirea manuala este recomandata intr-un mediu de
dezvoltare a unei aplicatii Web.
– Pornirea automata este recomandata dupa ce aplicatia Web
a fost instalata (engl.deployed).
• Serverul poate fi pornit:
– de la linia de comanda sau
– instalat ca serviciu al sistemului de operare.
2015
Gazde virtuale
• Un server Web poate deservi unul sau mai multe
domenii numite gazde virtuale.
2015
Servere proxy
• Un server proxy accepta cereri pentru resurse si fie le rezolva din memoria
cache locala, fie prin inaintarea cererii catre serverul de origine.
1: Cerere catre proxy
Client 4: Raspuns catre client Proxy
Server de origine
2015
Tehnologii server pentru continut dinamic interactiv
• SSI
– Mecanism propriu serverului Web. Se refera la abilitatea de a modifica
dinamic continutul unei pagini folosind directive de preprocesare adresate
serverului. Ofera insa flexibilitate limitata.
• CGI
– Standard de comunicare intre un server de Web si un program extern. Acest
program extern poate fi scris in C, Perl, Python, etc.
• Miniserveri si JSP
– Extensii ale unui server Web bazate pe tehnologiile Java.
• ISAPI si ASP
– Extensii ale unui server de Web bazate pe tehnologiile Microsoft.
• PHP
– Limbaj de scripting pentru partea de server inspirat din Perl si C.
2015
Servere de aplicatii
• Aplicatiile de comert electronic au o parte semnificativa pe partea de
server. Pentru a descrie aceasta parte se foloseste frecvent termenul de
aplicatie Web = extensia dinamica a unui server Web.
• Aplicatiile Web sunt in general de doua tipuri:
– Aplcatii orientate pe prezentare. Contin pagini Web interactive si sunt capabile sa
genereze continut dinamic ca raspuns la cererile clientilor.
– Aplicatii orientate pe serviciu. Implementeaza un punct terminal pentru un serviciu
Web. Serviciu Web = un serviciu oferit de o aplicatie altor aplicatii, prin intermediul
platformei Web.
• Aplicatiile Web contin componente Web. Acestea sunt caramizile cu care
se poate extinde dinamic functionalitatea unui server Web. In tehnologia
Java, componentele Web sunt miniservere sau pagini JSP.
• Componentele Web sunt gazduite de o platforma speciale de executie
numita container Web. Containerul furnizeaza servicii ca: dispecerizarea
cererilor, securitate, concurenta, gestiunea ciclului de viata, etc.
• O aplicatie Web consta in general din: componente Web, fisiere de
resurse statice si clase/biblioteci de ajutor (engl.helper).
2015
SSI
• SSI (engl.Server Side Include) este o tehnologie ce permite includerea de
informatii intr-o pagina Web inainte de trimiterea paginii la client.
• O pagina care foloseste SSI contine instructiuni speciale. Aceste instructiuni sunt
interpretate de server ori de cate ori pagina este ceruta de un client. Instructiunile
pot specifica: includerea unor documente in pagina curenta (de exemplu un
header sau un footer), a datei curente, a valorii unui contor de acces, etc.
• Avantajul SSI fata de CGI este ca este o tehnologie mult mai simpla si ca nu
implica apelul nici unui program extern.
• Nu exista un standard de SSI si de aceea fiecare server are o sintaxa si
functionalitate proprie pentru SSI. Pentru serverul Apache instructiunile SSI sunt
de forma unor comentarii HTML/XML cu structura urmatoare:
<!-- #comanda atribut1=valoare1 atribut2=valoare2 ... -->
• Un exemplu este urmatorul:
<!--#include virtual="/header.html" -->
• Apache permite folosirea si a unor facilitati SSI avansate desemnate prin
acronimul XSSI. Un exemplu este posibilitatea definirii unui flux de control ca in
programarea procedurala prin comenzile if, elif, else si endif.
2015
2015
Arhitectura CGI
Server
HTTP CGI
2015
Miniservere
• Miniserverele (engl.servlet) sunt programe
asemanatoare cu programele CGI ce ruleaza pe partea
de server in cadrul unui mediu special de executie
(engl. run-time) numit container.
• In principiu un miniserver:
– Preia date de la client
– Genereaza un raspuns, posibil interactionand cu fisiere
si/sau baze de date
– Trimite rezultatul inapoi clientului
• Intr-o arhitectura multi-nivel miniserverele realizeaza
interfata dintre nivelul de prezentare si nivelul de
logica a aplicatiei.
2015
Functionarea miniserverelor
• Presupune urmatorii pasi:
– Un program client emite o cerere HTTP catre un server WWW.
– Serverul interpreteaza cererea si executa o secventa de program careia
ii transmite parametrii cererii.
– Programul apelat interpreteaza parametrii cererii si executa o portiune
de cod care genereaza dinamic o pagina HTML.
• Prelucrarile executate de miniserver pot duce la:
– Generarea unei pagini WWW statice.
– Generarea unei pagini WWW actualizata dinamic.
– Configurarea unei pagini WWW pe baza parametrilor cererii HTTP.
Parametrii sunt preluati de la utilizator printr-un formular HTML.
• In general miniserverele sunt potrivite pentru aplicatiile
orientate pe serviciu sau pentru controlul aplicatiilor orientate
pe prezentare.
2015
Instalarea miniserverelor
• Se instaleaza Tomcat (implementarea de referinta pentru miniservere).
• Se porneste serverul cu comanda startup.
• Se verifica instalarea prin introducerea URL-ului: http://localhost:8080
• Aplicatia Web se instaleaza in directorul webapps al serverului. Pentru
fiecare aplicatie exista cate un subdirector. Se poate folosi ca exemplu
aplicatia ROOT.
• Se creaza directorul noi aplicatii, fie el mywebapp.
• Acest director va contine un subdirector WEB-INF/classes unde se vor
instala clasele miniserverelor.
• In radacina directorului WEB-INF se creaza descriptorul de instalare a
aplicatiei (engl.deployment descriptor). Acesta este un fisier cu numele
web.xml. El va defini miniserverele din cadrul aplicatiei.
• Se creaza un fisier HTML index.html care permite invocarea
miniserverului. Acest fisier se poate plasa in radacina aplicatiei. El poate fi
afisat in programul navigator folosind URL-ul:
http://localhost:8080/mywebapp/index.html 2015
Descriptorul de instalare
• Miniserverul se descrie cu marcajele servlet si servlet-mapping.
Exemplu de miniserver
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class FirstServlet extends HttpServlet {
public void doGet(HttpServletRequest
request,HttpServletResponse response)
throws IOException,ServletException {
response.setContentType("text/HTML");
PrintWriter out = response.getWriter();
out.println("<HTML>");
out.println("<HEAD>");
out.println("<TITLE>Simple Servlet</TITLE>");
out.println("</HEAD>");
out.println("<BODY>");
out.println("<BR><BR><BR>");
out.println("<CENTER><H1>A Simple Servlet</H1></CENTER>");
out.println("</BODY>");
out.println("</HTML>");
out.flush();
}
}
2015
Invocare miniserver cu parametrii
<FORM METHOD=GET ACTION="PersonalServlet">
Enter your first name:
<INPUT TYPE="Text" NAME="FirstName" VALUE="">
<BR><BR>
<INPUT TYPE="Submit" VALUE="Submit">
</FORM>
• Se poate invoca si direct cu URL-ul:
http://localhost:8080/mywebapp/PersonalServlet?FirstName=<v
aloare>
• Preluarea parametrilor se face cu metodele clasei HttpServletRequest:
String getParameter(String <name>) – Determina valoarea unui parametru
trimis prin GET si POST
Enumeration getParameterNames() – Returneaza numele tuturor
parametrilor trimisi prin POST
String[] getParameterValues(String <name>) – Returneaza valorile
unui parametru care poate avea mai mult de o valoare.
2015
2015
Sesiuni
• HTTP este un protocol fara stare (engl. stateless). Acest lucru
inseamna ca orice pereche cerere-rapsuns reprezinta o
tranzactie (conversatie) separata.
• Uneori este insa nevoie ca datele achizionate sa se pastreze
intre interactiuni. Un exemplu: un cos electronic de cumparaturi
trebuie actualizat astfel incat sa reflecte multiumea tuturor
optiunilor de cumparare ale utilizatorului.
• Din acest motiv miniserverele implementeaza conceptul de
sesiune ce reprezinta un container pentru datele privind
activitatile unui client sunt stocate si eventual accesate de toate
miniserverele care au acces la obiectul respectiv.
• O sesiune expira automat dupa o perioada de timp prestabilita
(implicit 30 s) sau daca este invalidata explicit de miniserver
(metoda invalidate()).
2015
Accesul la un obiect sesiune
• Crearea unei sesiuni (varianta fara parametrii sau cea cu parametrul create
= true fie intoarce sesiunea curenta, daca exista, fie creaza o sesiune noua
si o returneaza):
HttpSession getSession()
HttpSession getSession(boolean create)
• Un obiect sesiune contine o multime de perechi atribut-valoare. Fiecare
nume este String si fiecare valoare este Object. Valorile trebuie sa fie
obiecte serializabile.
• Adaugarea de informatie la sesiune se face prin:
void setAttribute(String <name>, Object <value>)
• Eliminarea unui valori se face cu metoda:
Object removeAttribute(String <name>)
• Regasirea unei valori se face cu metoda:
Object getAttribute(String <name>)
• Determinarea tuturor numelor se face cu:
String[] getAttributeNames()
2015
Cookies
• Cookies ofera o alta modalitate de a pastra datele utilizatorului
in timpul cat acesta foloseste o aplicatie Web.
• Sesiunile pastreaza datele doar pe durata unei vizite a aplicatiei.
cookies pastreaza datele si intre vizite succesive. Sesiunile se
bazeaza tot pe cookies.
• Un cookie este o pereche nume-valoare care asociaza o valoare
cu un atribut. Este posibil sa se pastreze o sesiune pentru durata
unei sesiuni, ea putand fi pastrata pe calculatorul clientului
pentru utilizari viitoare.
• O cookie se pastreaza intr-un fisier trimis de server clientului.
Fisierul este retransmis catre server la fiecare vizita ulterioara a
acestuia a aplicatiei de pe server.
2015
Folosirea cookies
• O cookies se reprezinta cu clasa Cookie.
• Constructorul este:
Cookie(String <name>, String <value>)
• Adaugarea unui cookie la un obiect HttpServletResponse:
void addCookie(Cookie <cookie>)
• Determinarea cookie-urilor dintr-o cerere HttpServletRequest:
Cookie[] getCookies()
• Alte metode utile ale clasei Cookie:
void setComment(String <value>)
String getComment()
String getName()
String getValue()
void setValue(String <value>)
int getMaxAge() 2015
PHP
• Este o tehnologie bazata pe un limbaj de scripting pe partea de
server, inspirat din C si Perl.
• Ofera un acces facil la o varietate de baze de date bazate pe
SQL: mySQL, Oracle, PostgresSQL, ODBC, dBASE,
Informix, etc si se poate folosi impreuna cu o varietate de
servere Web incluzand Apache si MS IIS.
• Limbajul PHP a fost creat in 1995 de Rasmus Lerdorf (danez
cu cetatenie canadiana).
• http://en.wikipedia.org/wiki/PHP
• Versiunea curenta este PHP 5.4
• http://www.php.net/
2015
ASP
• ASP (Active Server Pages) este o tehnologie a firmei Microsoft pentru
realizarea paginilor de WWW dinamice si interactive, aparuta in 1996.
• ASP se bazeaza pe o interfata de programare oferita de un server Web,
numita si ISAPI – Internet Server Application Programming Interface.
• ASP se bazeaza pe limbaje de scripting (la fel ca JSP si PHP) si pe un
motor de scripting. Un astfel de motor este inclus in MS IIS.
• Interpretoarele incorporate in motorul ASP se bazeaza pe tehnologia
COM. Motorul curent suporta limbajele de scripting JScript (versiunea
JavaScript promovata de Microsoft) si VBScript.
• Noua generatie ASP este denumita ASP+ si ruleaza sub platforma
Windows .NET. Ea suporta nativ si limbajul C#. Spre deosebire de ASP,
scripturile ASP+ sunt compilate, fapt ce contribuie la cresterea vitezei de
prelucrare.
2015
Capitolul 8
2015
2015
Standardele FIPA
• Foundation for Intelligent Physical Agents
(http://www.fipa.org/) – FIPA este o asociatie
internationala non-profit care se ocupa cu
dezvoltarea unei colectii de standarde legate de
tehnologia agentilor software.
2015
Managementul agentilor (II)
• Agent Platform – AP. Reprezinta infrastructura in care agentii
exista. AP poate fi distribuita pe mai multe calculatoare. FIPA
nu precizeaza detaliile de implementare ale AP.
• Agent. Reprezinta un proces gazduit de o AP ce ofera unul sau
mai multe servicii ce pot fi publicate prin intermediul unei
descrieri de serviciu – Agent Service Description. Un agent are
un identificator unic numit AID. FIPA nu precizeaza maniera
de proiectare a serviciilor (numite si capabilitati) ale unui
agent. Singura cerinta este respectarea structurii si codificarii
mesajelor transmise catre alti agenti.
• Message Transport Service – MTS. Reprezinta acel serviciu al
unei AP pentru transportul mesajelor intre agentii unei AP sau
din AP-uri diferite. MTS foloseste un Message Transport
Protocol – MTP. MTS este furnizat de catre un Agent
Communication Channel – ACC ce raspunde de transmiterea
mesajelor folosind MTP.
2015
(request
:sender (agent-identifier :name alice@mydomain.com)
:receiver (agent-identifier :name bob@yourdomain.com)
:ontology travel-assistant
:language FIPA-SL
:protocol fipa-request
:content
"((action
(agent-identifier :name bob@yourdomain.com)
(book-hotel :arrival 15/10/2006 :departure 05/07/2002 ... )
))"
) 2015
Introducere in JADE
• JADE este o platforma software complet compatibila cu specificatiile FIPA
ce furnizeaza functionalitati middleware de baza, independente de aplicatie
si simplifica dezvoltarea aplicatiilor distribuite folosind POA.
2015
Arhitectura JADE (I)
• O platforma JADE este compusa din containere distribuite intr-o retea de
calculatoare.
• Un container este reprezentat de un process Java ce contine runtime-ul
JADE si serviciile necesare pentru gazduirea si executarea agentilor.
• Exista un container special numit Main-container ce reprezinta punctul de
start – bootstrap al platformei. El este primul container care se lanseaza la
pornirea platformei. Toate celelalte containere ale platformei se
inregistreaza la pornire la Main-container. Numele lor implicite sunt
Container-1, Container-2, ..., dar pot fi redefinite de la linia de comanda.
• Main-container are urmatoarele responsabilitati:
– Gestiunea tabelei de containere – CT ce este un registru cu referintele si adresele de
transport corespunzatoare toate containerelor din platforma
– Gestiunea tabelei globale cu descrierile agentilor din platforma – GADT impreuna cu
starea si locatia lor curente
– Gazduirea AMS si a DF, cei doi agenti speciali ce reprezinta serviciul de pagini albe
pentru gestiunea agentilor din platforma si respectiv serviciul implicit de pagini aurii.
• Fiecare container mentine o tabela cu descrierile agentilor locali – LADT.
2015
2015
Arhitectura JADE (III)
• In acest fel Main-container nu este un punct de congestie a
performantelor sistemelui – system bottleneck. Cu toate acestea
el este un punct critic in functionarea sistemului – single point
of failure.Pentru a preveni acest dezavantaj JADE dispune de
un serviciu special de replicare – Main Replication Service.
• Identitatea unui agent este continuta in Agent Identifier – AID
ce este compus dintr-o multime de atribute conforme cu
semantica specificata de FIPA. Elementele de baza ale unui
AID sunt:
– numele agentului = un identificaor unic al agentului construit de JADE
prin concatenarea numelui local (suficient pentru unicitatea intr-o
platforma) si numele platformei.
– adresele agentului = adresele de transport ale platformei. O astfel de
adresa reprezinta o adresa de tranport corespunzatoare unui MTP unde
se pot transmite mesaje FIPA.
2015
2015
Rularea platformei
• Se descarca kit-ul JADE de la http://jade.tilab.com/.
• Se dezarhiveaza arhivele intr-un director care va reprezenta radacina
sistemului JADE.
• Se creaza un subdirector bin in radacina JADE sau unde se vor depune
fisierele de comenzi – bat pentru rularea JADE.
• Se creaza o comanda pentru setarea CLASSPATH catre bibiotecile JADE:
set JADE_HOME=C:\software\jade
set CLASSPATH=%JADE_HOME%\lib\jade.jar; %JADE_HOME%
\lib\jadeTools.jar; %JADE_HOME%\lib\http.jar; %JADE_HOME%
\lib\iiop.jar; %JADE_HOME% \lib\commons-codec\commons-codec-
1.3.jar;%JADE_HOME%\classes
• Se porneste platforma (cu conditia ca java sa se gaseasca in PATH).
Optiunea –gui are ca efect lansarea Remote Monitoring Agent – RMA, un
agent special cu interfata grafica pentru monitorizarea platformei.
java jade.Boot –gui
• Crearea unui nou container se poate face cu una din comenzile:
java jade.Boot -host NumeHost –container
java jade.Boot -host NumeHost -container -container-name
NumeContainer
2015
JADE MTS
• Pentru interoperabilitate intre platforme non-JADE dar conforme FIPA JADE
implementeaza toate MTP-urile standard impuse de FIPA. Un MTP implica
definitia protocoului de transport corespunzator impreuna cu codificarea stanrd a
plicului pentru un mesaj ce contine informatia de transport a mesajului.
• Astfel unul dintre mesajele de lansare ale platformei este:
INFO: MTP addresses:
http://Toshiba:7778/acc
• Acest lucru arata ca pentru Main-container JADE porneste implicit cu un MTP
bazat pe HTTP. Pentru celelalte containere ale platformei nu se activeaza nici un
MTP.
• La primirea unui mesaj din afara platformei, MTP-ul pentru Main-container
dirijeaza corect mesajul in interiorul platformei. Intern platforma foloseste un
protocol proprietar de transport numit Internal Message Transport Protocol –
IMTP.
• Se pot activa insa explicit MTP-uri pentru orice alt container al platformei. In
acest fel platfoma va primi noi adrese de transport.
• Daca nu este nevoie de interoperabilitate FIPA in afara platformei, optiunea
–nomtp va conduce la inhibarea crearii implicite a HTTP MTP pentru Main-
container.
2015
JADE IMTP
• IMTP este folosit pentru schimbul de mesaje intre agentii aflati in
containere diferite, doar in cadrul unei aceleasi platforme JADE.
• Nu e nevoie ca IMTP sa fie compatibil cu propunerile de MTP din
standardul FIPA si este considerabil diferit de MTP-urile destinate
interoperabilitatii intre platforme.
• IMTP permite unui container nou sa se conecteze pe un port la Main-
container.
• IMTP este bazat pe un protocol proprietar ce foloseste socluri TCP.
• Optiunile:
– -host hostName
– -port portNumber
• sunt destinate configurarii IMTP.
• La pornire JADE afiseaza:
– Gazda si portul unde a fost pornit Main-container: jicp://10.8.0.14:2000
– Numele lui Main-container: Agent container Main-Container@10.8.0.14 is ready.
2015
2015
Crearea unui agent (I)
• Presupune crearea unei clase ce mosteneste jade.core.Agent.
• Initializarea unui agent se face prin redefinirea metodei setup(). Deobicei
initializarea presupune:
– Crearea si afisarea unui GUI
– Crearea unei conexiuni la o baza de date
– Inregistrarea unor servicii in catalogul pagini aurii
– Crearea si adaugarea unor comportamente initiale unui agent – clase ce descriu
sarcinile agentului si modul lor de realizare
• Identificarea unui agent se face consistent cu specificatiile FIPA:
– Identificarea unui agent se face printr-o instanta a clasei jade.core.AID.
– Un AID contine un GUID – Global Unique Name si un numar de adrese.
– Un GUID in JADE este format din: (i) un nume local si (ii) numele platformei.
Numele local trebuie sa fie unic in cadrul platformei. Platforma este responsabila cu
verificarea/asigurarea unicitatii sale.
• Spre exemplu:
– Nume local: Guru
– GUID: Guru@Toshiba:1099/JADE
– O adresa (pot fi mai multe, cate una pentru fiecare MTP instalat:
http://Toshiba:7778/acc.
2015
2015
Crearea unui agent (III)
• Dupa compilare, clasa SimpleAgent se poate folosi pentru crearea de
agenti.
• O varianta este ca un agent sa se creeze de la linia de comanda, fie la
crearea Main-container, fie la crearea unui alt container, in felul urmator:
java jade.Boot -gui NumeAgent:ClasaAgent
java jade.Boot -host NumeCalculator -container NumeAgent:ClasaAgent
• O alta posibiltte este crearea unui agent prin incarcarea clasei
corespunzatoare din consola GUI a RMA. Pentru aceasta se face click-
dreapta pe containerul in care se doreste crearea agentului, se alege
optiunea Start New Agent si se introduc numele agentului si numele
clasei. Calea catre clasa trebuie sa se gaseasca in CLASSPATH-ul folosit
la lansarea containerului respectiv.
• Atragem atentia ca daca la pornire nu se indica explicit numele platformei
cu optiunea:
–name NumePlatforma
aceasta va primi un nume implicit ce contine numele calculatorului gazda
pe care a fost pornita si portul respectiv.
2015
Comportamentul agentilor
• Sarcinile pe care trebuie sa le realizeze un agent se definesc prin multimea
de comportamente (engl. behaviour) ale agentului respectiv.
• Un comportament este o instanta a clasei abstracte
jade.core.behaviours.Behaviour.
• Un comportament se poate adauga la un agent cu ajutorul urmatoarei
metode a clasei jade.core.Agent:
public void addBehaviour(Behaviour b);
• Crearea si adaugarea comportamentelor unui agent se face deobicei la
initializarea agentului, in corpul metodei setup().
• Clasa jade.core.behaviours.Behaviour contine doua metode abstracte:
public abstract void action();
public abstract boolean done();
• Metoda action() defineste operatiile pe care trebuie sa le realizeze agentul
in cursul realizarii comportamentului respectiv.
• Metoda done() indica daca executia comportamentului respectiv – a
terminat (action() intoarce true) sau nu (action() intoarce false).
2015
Planificarea comportamentelor
• Un agent poate executa comportamentele asignate in mod concurent.
• Planificarea comportamentelor nu este preemptiva ci este cooperativa.
Cand un comportament este planificat pentru executie, se apeleaza metoda
sa action() si executia se termina doar la terminarea acestei metode.
Programatorul va decide cand un agent va comuta executia de la un
comportament la alt comportament.
• Acest model poate parea dificil, necesita un efort suplimentar de
programare, dar are urmatoarele avantaje:
– Se foloseste un singur fir de executie pentru fiecare agent. Acest lucru este important
mai ales in mediile in care resursele sunt limitate, de exemplu telefoanele celulare
– Performantele sunt mai bune deoarece comutarea comportamentelor este astfel mult
mai rapida decat comutarea firelor Java
– Elimina sincronizarile necesare pentru accesul concurent al comportamentelor unui
agent la resursele comune ale agentului
– La comutarea unui comportament starea unui agent nu include informatii legate de
stiva. Acest lucru permite: (i) salvarea persistenta a starii unui agent astfel incat
executia sa fie reluata ulterior (agent persistency), (ii) transferarea agentului pentru
executie intr-un alt container (agent mobility).
2015
Executia comportamentelor
Calea de executie a firului unui
agent este:
1. Initializarea agentului: setup()
2. Daca nu s-a apelat doDelete() se
merge la pasul urmator, altfel se
apeleaza implicit takeDown(),
dupa care executia se termina.
3. Se determina urmatorul
comportament activ b din lista
comportmentelor active
4. Se executa metoda sa action()
5. Se testeaza terminarea cu done().
Daca done() intoarce fals atunci se
trece la pasul 2, altfel se trece la
pasul urmator
6. Se elimina b din lista
comportamentelor active si se
revine la pasul 2
Daca nu exista comportamente
active firul agentului intra in
“sleep”. 2015
Comportament ONE-SHOT
• Un comportament ONE-SHOT se executa intr-un singur pas. Acest lucru
inseamna ca metoda sa action() se executa o singura data.
• Acest tip de comportament este implementat de clasa:
jade.core.behaviours.OneShotBehaviour
• Metoda done() a comportamentelor ONE-SHOT intoarce true.
• Definirea unui astfel de comportament se face convenabil prin extinderea
clasei OneShotBehaviour astfel:
public class MyOneShotBehaviour extends OneShotBehaviour {
public void action() {
// perform operation X
}
}
• In acest exemplu operatia X se va executa o singura data.
2015
Comportament ciclic
• Un comportament ciclic nu se termina niciodata. Metoda sa action()
executa aceleasi operatii de fiecare data cand este apelata.
• Acest tip de comportament este implementat de clasa:
jade.core.behaviours.CyclicBehaviour
• Metoda done() a comportamentelor ciclice intoarce false.
• Definirea unui astfel de comportament se face convenabil prin extinderea
clasei CyclicBehaviour astfel:
public class MyCyclicBehaviour extends CyclicBehaviour {
public void action() {
// perform operation Y
}
}
• In acest exemplu operatia Y se va executa repetat, pana la terminarea
agentului caruia i s-a asignat comportamentul ciclic respectiv.
2015
Comportament generic
• Un comportament generic contine o variabila de stare ce determina executia unor operatii
diferite in functie de valoarea sa curenta. Un comportament generic se termina la
intalnirea unui anumite conditii.
• Se considera urmatorul exemplu de comportament ce se executa in 3 pasi:
public class ThreeStepBehaviour extends Behaviour {
private int step = 0;
public void action() {
switch (step) {
case 0:
// perform operation X
step++; break;
case 1:
// perform operation Y
step++; break;
case 2:
// perform operation Z
step++; break;
}
}
public boolean done() {
return step == 3;
}
} 2015
2015
Planificarea temporala a operatiilor (I)
• Clasa WakerBehaviour permite planificarea executiei unei operatii la expirarea unei
constante de timp (in milisecunde) sau a unei date limita, precizate prin constructor:
public WakerBehaviour(Agent a, java.util.Date wakeupDate);
public WakerBehaviour(Agent a, long timeout);
• Operatia ce trebuie executata este specificata prin definirea metodei abstracte onWake().
Dupa executarea acestei metode executia comportamentului se termina.
public class WakerAgent extends Agent {
protected void setup() {
System.out.println("Adding waker behaviour");
addBehaviour(new WakerBehaviour(this, 10000) {
protected void onWake() {
// perform operation X
}
} );
}
}
• In acest exemplu, operatia X este executata la 10 secunde dupa afisarea mesajului
“Adding waker behaviour”
2015
2015
2015
2015
2015
Filtrarea mesajelor (I)
• In aplicatii un agent poate fi pus in situatia de a procesa numai mesajele
de un anumit tip. De exemplu un agent interesat in cumpararea de
calculatoare poate primi propuneri de la potentiali vanzatori prin mesaje
PROPOSE. In acest fel el va trebui sa filtreze mesajele PROPOSE din
multimea tuturor mesajelor primite.
• Filtrarea mesajelor la receptie se poate face prin speificarea unui tipar de
mesaj – message template ca parametru al metodei receive().
• Un tipar de mesaj este o instanta a clasei jade.lang.acl.MessageTemplate.
Aceasta clasa dispune de o multime de metode factory pentru crearea de
diverse tipare de mesaje.
• Spre exemplu, crearea unui tipar pentru filtrarea mesajelor cu un anumit
act comunicativ se poate face cu urmatoarea metoda factory:
private MessageTemplate MessageTemplate.MatchPerformative(int performative);
2015
2015
2015
Serviciul de pagini aurii (II)
• Orice agent poate publica descrieri de servicii si poate cauta (descoperi)
servicii. Inregistrarile, anularile inregistrarior, actualizarile si cautarile pot
fi efectuate in orice moment de-alungul ciclului de viata al unui agent.
• Serviciul de “pagini aurii” din JADE respecta cerintele FIPA, fiind
furnizat de un agent specializat numit DF. Orice platforma gazduieste un
agent DF implicit cu numele local df@nume-platforma. Pot fi creati mai
multi agenti DF (incluzan agentul implicit) si ei pot fi angajati intr-o
federatie pentru a oferi un catalog distribuit de “pagini aurii”.
• Comunicarea cu DF se poate realiza prin mesaje ACL folosind un limbaj
de continut adecvat – de exemplu SL0 si o ontologie – de exemplu
ontologia FIPA-agent-management, conform specificatiilor FIPA.
• Pentru simplificarea interactiunilor cu DF JADE furnizeaza o clasa
speciala numita jade.domain.DFService cu ajutorul careia este posibil sa
se publice si sa se caute servicii prin intermediul unei API specializate.
2015
Publicarea serviciilor
• Un agent care doreste sa publice unul sau mai multe servicii
trebuie sa furnizeze agentului DF o descriere ce include: (i)
AID-ul sau; (ii) lista serviciilor furnizate; si optional (iii) lista
limbajelor si ontologiilor pe care ceilalti agenti trebuie sa le
foloseasca la interactiunea cu acel agent.
2015
Clasa CompositeBehavior
• Un CompositeBehaviour contine un numar de subcomportamente. La
primirea controlului ea executa unul dintre ele in functie de o anumita
politica.
• Politica este stabilita de metodele abstracte:
– scheduleFirst() – stabileste ce subcomportament trebuie executat la inceput si
– scheduleNext() – stabileste ce subcomportament trebuie executat la pasul urmator.
• Terminarea este semnalata cand apelul metodei checkTermination()
intoarce true.
• Parametrul currentDone indica daca subcomportamentul curent s-a
terminat (true) sau nu, iar currentResult este valoarea returnata de acesta
(daca s-a terminat) prin metoda onEnd().
• Metoda getCurrent() intoarce subcomportamentul curent planficat pentru
executie.
2015
Schema de compunere a comportamentelor
Schema de executie generica a
metodei action() a unui
comportament compus.
2015
2015
Comportament paralel (II)
• Un comportament compus paralel se poate termina: (i) fie cand
toate subcomportamentele sale s-au terminat; (ii) fie cand cel
putin unul dintre comportamentele sale s-a terminat.
• Politica de terminare se poate specifica la crearea
comportamentului prin intermediul unui parametru special al
constructorului clasei ParallelBehaviour ce poate avea una
dintre valorile:
– ParallelBehaviour.WHEN_ALL ce indica terminrea la terminarea
tuturor subcomportamentelor
– ParallelBehaviour.WHEN_ANY cc indica terminarea la terminarea
primului subcomportament.
• Varianta WHEN_ANY se poate folosi pentru a specifica
terminarea fortata a unei sarcini in cazul in care ea nu se
finalizeaza intr-un timp predefinit – timeout. In acest caz se
compune paralel acel comportament cu un comportament
WakerBehaviour. 2015
2015
Protocoale de interactiune in JADE (I)
• Clasele ce ofera suport pentru implementarea PI standard in JADE se
gasesc in pachetul jade.proto.
• In cadrul unei interactiuni guvernata de un PI un agent poate avea rolul de
initiator sau de participant – in JADE este numit responder. Din acest
motiv clasele pachetului jade.proto cuprind doua categorii corespunzatoare
celor doua situatii, cu sufixurile Initiator si respectiv Responder. Spre
exemplu, pentru protocolul FIPA-Contract-Net avem clasele:
ContractNetInitiator si ContractNetResponder.
• Aceste clase dispun de metode de apel invers – callback methods ce trebuie
redefinite de programator pentru implementarea logicii specifice
domeniului de aplicatie.
• Un rol intr-o conversatie implica executarea anumitor sarcini, asa ca toate
clasele pentru implementarea PI standard sunt comportamente JADE.
• Constructorii claselor initiator contin un parametru ACLMessage ce
reprezinta mesajul care initiaza protocolul (de exemplu
ContractNetInitiator va primi un mesaj CFP). Toate clasele initiator suporta
atat o interactiune unu-la-unu cat si o interactiune unu-la-multi, depinzand
de numarul de dstinatari specificati in mesajul de initiere. 2015
2015
Implementarea unei negocieri folosind CNP
• Se considera un scenariu de comert electronic.
• O multime de vanzatori ofera spre vanzare un produs (de ex. o carte) si
sunt dispusi sa vanda produsul cu conditia oferirii unui pret minim.
• Un cumparator doreste sa cumpere produsul si are la dispozitie un buget
maxim.
• Cumparatorul emite un CFP cu pretul maxim disponibil. Raspund cu
PROPOSE vanzatorii pentru care acest pret maxim depaseste pretul lor
minim, cerand plata valorii initiale propusa de cumparator in CFP. Restul
raspund cu REFUSE. Cumparatorul alege pe unul dintre cei care au
raspuns cu PROPOSE, ii raspunde cu ACCEPT_PROPOSAL, iar la restul
care au raspuns cu PROPOSE le raspunde cu REJECT_PROPOSAL. In
final vanzatorul selectat raspunde cu INFORM confirmand vanzarea
produsului la pretul stabilit.
2015
Servicii Web
Capitolul 9
2015
2015
Motivarea SW
• Se considera un
scenariu de integrare
de aplicatii B2B:
– Un beneficiar (engl.
customer) comanda
marfuri de la un
furnizor (engl.
supplier).
– Furnizorul le livreaza
din stoc (daca
marfurile exista in
stoc) sau cere ca
marfurile sa fie livrate
de un partener tert
depozit (engl.
warehouse).
@ Alonso et al.2004
2015
Infrastructura si componentele SW
• Un SW este identificat printr-un URI si poate fi accesat de clienti prin
mesaje formatate folosind XML.
• Mesajele sunt incapsulate folosind SOAP (initial acronim pentru Simple
Object Access Protocol) si transmise peste un protocol de transport:
HTTP, SMTP sau TCP.
• Interfetele SW sunt descrise in WSDL (Web Services Description
Language)
• Aplicatiile folosesc SW. Anumite SW au functii generale (orizontale):
securitate, servicii de directoare, coreografie.
@ Colouris et al.2012
2015
2015
Metoda REST
• Metoda REST este inspirata din arhitectura Web-ului si din
specificatiile protocolului HTTP.
• REST este un stil arhitectural pentru sisteme hipermedia
distribuite, propus de Roy Fielding in capitolul 5 al tezei sale
de doctorat in 2000.
• Acest stil arhitectural este caracterizat prin 6 principii:
– Client – server.
– Stateless.
– Cache(able).
– Uniform interface.
– Layered system.
– Code-on-demand (optional).
2015
Client – server
• Principiul modelului client – server este separarea
responsabilitatilor (engl. separation of concerns).
• Clientii sunt responsabili cu partea de interfata cu utilizatorul,
in schimb serverele sunt repsonsabile cu stocarea datelor.
• Avantaje:
– Se imbunatateste portabilitatea interfetei cu utilizatorul pe platforme
multiple
– Creste scalabilitatea serverului prin simplificarea componentelor sale
– Cele doua tipuri de componente pot evolua separat, lucru specific
cerintelor SD actuale de a putea evolua la scala Internet-ului in
domenii organizationale multiple
@ Fielding.2000
2015
Stateless
• Comunicarea dintre client si server este fara stare, in sensul ca serverul nu pastreaza
starea interactiunii cu clientul.
• Rezulta ca fiecare cerere de la client catre server trebuie sa contina toata informatia
necesara intelegerii cererii, intrucat nu exista informatie de stare stocata pe server.
• Avantaje:
– Vizibilitatea este imbunatatita. Un sistem de monitorizare nu va avea nevoie de alte informatii,
pe langa cerere, pentru analiza completa a cererii.
– Fiabilitatea este imbunatatita deoarece se simplifica recuperarea din erori partiale.
– Scalabilitatea serverului creste deoarece operarea acestuia este simplificata.
• Dezavantaje:
– Scade performanta retelei, din cauza transmisiei repetate a datelor.
– Serverul pierde controlul asupra consistenta aplicatiei, ce va depinde de corectitudinea
implementarii clientului
@ Fielding.2000
2015
Cache(able)
• Clientii pot stoca in cache raspunsurile. Pentru aceasta,
continutul unui raspuns poate fi marcat explicit ca fiind
cacheable sau not-cacheable.
• Avantaje:
– Creste eficienta, prin eliminarea anumitor interactiuni
– Creste scalabilitatea si gradul de satisfactie al utilizatorului
• Dezavantaje
– Scade fiabilitatea, in cazul in care datele salvate in cache (engl. stale
data) sunt expirate si difera semnificativ de datele care ar putea fi
obtinute printr-o interactiune directa.
@ Fielding.2000
2015
Uniform interface
• Simplifica arhitectura si asigura decuplarea implementarii de
interfetele serviciilor.
• Acest principiu se bazeaza pe constrangerile:
– Identificarea resurselor
– Manipularea resurselor prin intermediul reprezentarilor lor
– Mesaje auto-descriptive, adica contin toata informatia necesara
procesarii lor
– Hipermedia este motorul starii aplicatiei.
@ Fielding.2000
2015
Layered System
• Arhitectura este compusa din nivele ierarhice astfel incat un
client nu va putea determina daca este conectat direct la un
server final sau la un intermediar.
• Folosirea serverelor intermediare permite:
– Cresterea scalabilitatii prin echilibrarea incarcarii, asemanator cu o
arhitectura de procesure pe flux de tip pipe-and-filter.
– Asigurarea unor politici de securitate privind datele care traverseaza
bariere organizationale.
@ Fielding.2000
2015
Code-on-demand
• Arhitectura permite extinderea functionalitatii clientului prin
descarcarea de cod sursa sau binar.
• Aceasta facilitate permite imbunatatirea extensibilitatii
sistemului, dar reduce vizibilitatea, fiind un principiu optional.
@ Fielding.2000
2015
Metoda SOAP
• Metoda SOAP este inspirata din RPC si RMI. Conform
metodei SOAP, un SW expune o interfata care este descrisa
folosind WSDL.
• Standardele Web referitoare la SOAP si WSDL sunt parte a
Web Services Activiy: http://www.w3.org/2002/ws/
• Apelurile clientilor trebuie sa fie conforme cu specificatia
interfetei SW, similar cu apelul procedurilor si metodelor din
limbajele de programare.
• Metoda SOAP aduce in plus fata de RMI:
– Identificarea SW prin URI, ca orice resursa Web
– Reprezentarea in XML a mesajelor interschimbate de clienti si servere
– Transportul mesajelor peste protocoalele Internet, cum sunt HTTP sau
SMTP
2015
Introducere in SOAP
• W3C a lansat SOAP in 1999. Versiunea curenta este 1.2.
• SOAP acopera 4 aspecte:
– Un format de mesaje pentru communicare intr-un singur sens ce
descrie reprezentarea unui mesaj intr-un document XML
– O descriere cum un mesaj SOAP (documentul XML reprezentat de
mesaj) ar trebui transportat folosind HTTP sau SMTP
– Un set de reguli ce trebuie urmate la procesarea unui mesaj SOAP si o
clasificare simpla a entitatilor implicate in procesarea unui mesaj
SOAP. Se specifica ce parti ale mesajelor ar trebui citite de care dintre
entitati si cum trebuie reactionat la un continut neinteles
– Un set de conventii cum sa se transforme un apel RPC intr-un mesaj
SOAP si reciproc, respectiv cum ar trebui sa se implementeze un stil
RPC de interactiune (clientul creaza un apel RPC, acesta este tradus
intr-un mesaj SOAP, inaintat si transformat intr-un apel RPC la server,
raspunsul serverului este convertit in mesaj SOAP, transmis clientului,
si returnat clientului ca urmare a apelului RPC)
2015
Mesaje SOAP
Plic SOAP
• Un mesaj SOAP este incapsulat intr-
un “plic” ce contine datele care Antet SOAP
trebuie transmise.
• Plicul are asociata o informatie Element antet
necesara pentru transportul
mesajului la intermediari si la
receptorul final. Corp SOAP
• Continutul unui mesaj are 2 parti:
– Antet (engl. header) partitionat in Element corp
blocuri sau elemente. Este optional. Se
adreseaza infrastructurii de SW.
– Corp (engl. body sau payload)
partitionat in blocuri sau elemente. Este
obligatoriu. Se adreseaza aplicatiei.
2015
Structura unui mesaj SOAP
<?xml version='1.0' ?>
<env:Envelope
xmlns:env="http://www.w3.org/2003/05/soap-envelope">
<env:Header>
...
</env:Header>
<env:Body>
...
</env:Body>
</env:Envelope>
• Antetul este marcat cu Header si corpul este marcat cu Body.
• Mesajul SOAP este marcat cu Envelope.
• Continutul mesajului depinde de stilul de construire.
2015
Exemplu
• Sa consideram un mesaj SOAP intr-o aplicatie Web pentru
rezervarea unui bilet de avion.
• Un client doreste sa rezerve un bilet pentru un zbor cu un traseu
specificat, printr-o aplicatie de rezervare. Aplicatia de rezervare
contacteaza sistemul de rezervari al unei agentii folosind
SOAP.
• Aplicatia clientului transmite mesajul cu preferintele rezervarii
clientului.
• Sistemul de rezervari raspunde cu o multime de optiuni ce
satisfac preferintele clientului.
• Clientul isi alege un zbor convenabil si furnizeaza detaliile de
plata, printr-un mesaj SOAP transmis de aplicatia de rezervare.
• Sistemul de rezervari raspunde prin confirmarea sau infirmarea
realizarii platii. 2015
Stiluri de mesaje SOAP
• Construirea unui mesaj SOAP este influentata de:
– Stilul de interactiune
– Regulile de codare (engl. encoding rules)
• In functie de stilul de interactiune avem:
– Stilul document
– Stilul RPC
• Stilul document presupune ca aplicatiile ce comunica prin SOAP sa se
puna de acord asupra structurii documentelor interschimbate. Corpul
mesajului SOAP va contine un document XML care reprezinta mesajul.
• Stilul RPC presupune existenta de mesaje cerere si mesaje raspuns,
similar unui apel RPC.
– Mesajul cerere contine: (i) numele procedurii (operatiei) invocate si (ii) parametrii de
intrare.
– Mesajul de raspuns contine: (i) rezultatul operatiei si (ii) parametrii de iesire.
2015
Reguli de codare
• Definesc modul de reprezentare in XML al unei entitati sau structuri de
date. De exemplu, un produs se poate reprezenta in XML intr-o mare
varietate de moduri:
<ProductItem> <ProductItem <ProductItem name=“…”
<name>…</name> name=“…” <type>…</type>
<type>…</type> type=“…” <make>…</make>
<make>…</make> make=“…” </ProductItem>
</ProductItem> />
2015
Modelul de date SOAP 1.2 - I
• Acest model defineste datele aplicatiei sub forma unui graf
orientat etichetat. Modelul este optional.
• Graful este format din arce si varfuri. Un arc poate sa fie arc
de iesire sau arc de intrare in raport cu un varf.
• Arcele de iesire ale unui varf se disting prin eticheta si/sau
pozitie. Pozitia defineste o relatie de ordine totala pe multimea
arcelor de iesire ale unui varf.
• Etichetele arcelor sunt nume de elemente XML.
• Un varf al grafului are zero sau mai multe arce de iesire. Un
varf fara arce de iesire are asociata optional o valoare lexicala.
• Un varf al grafului poate fi simplu referit sau multiplu referit,
dupa cum are un singur arc de intrare sau mai multe arce de
intrare.
2015
2015
Reprezentarea in XML a modelului de date SOAP
• Codarea SOAP defineste un set de reguli prin care modelul de
date SOAP este reprezentat in XML.
• Arcele grafului se reprezinta prin elemente XML. Varful
terminal al unui arc se determina astfel:
– Daca un element XML nu are atribut ref atunci el reprezinta un varf al
grafului iar arcul corespunzator elementului se termina in acel varf.
– Daca un element XML x are atribut ref atunci valoarea y a acestui
atribut trebuie sa fie identica cu atributul id al unui unic element XML
z din plicul mesajului. In acest caz, arcul reprezentat prin x se va
termina intr-un varf al grafului asociat elementului z.
• Valoarea lexicala a unui varf se reprezinta prin textul din nodul
respectiv. Optional, elementul ce contine valoarea respectiva
poate sa aiba atributul nodeType, cu una din valorile simple,
struct sau array.
2015
2015
Mesaje SOAP stil RPC
• Informatia unui mesaj de cerere este structurata conform cerintelor RPC
in nume metoda si parametrii.
• Pentru mesajul de raspuns avem numele metodei careia i se adreseaza
raspunsul, o valoare de retur si optional parametrii de iesire.
... ...
2015
credit card
name
Costin Badica
number
123456789099999
expiration
2005-02
2015
Raspuns la cererea de plata a biletului de avion
• Presupunem ca apelul RPC pentru plata biletului de avion a
fost proiectat sa accepte doi parametrii de iesire – out:
– Un parametru care va contine codul de referinta al rezervarii
– Un URI unde utilizatorul client poate vizualiza detaliile rezervarii.
• Pentru a indica faptul ca avem un mesaj raspuns la cererea RPC
cu metoda chargeReservation, raspunsul va aduaga sufixul
Response la numele metodei din cerere, rezultand metoda
chargeReservationResponse.
• Uneori descrierea RPC permite ca apelul sa intoarca o valoare
printr-un parametru return. In cazul nostru aceasta valoare ne
poate indica faptul ca plata a fost confirmata prin confirmed sau
este in asteptare prin pending.
2015
2015
Mesaj SOAP raspuns stil RPC cu valoare returnata
<env:Header>
<t:transaction
xmlns:t="http://thirdparty.example.org/transaction"
env:encodingStyle="http://example.com/encoding"
env:mustUnderstand="true">5</t:transaction>
</env:Header>
<env:Body>
<m:chargeReservationResponse
env:encodingStyle="http://www.w3.org/2003/05/soap-encoding"
xmlns:rpc="http://www.w3.org/2003/05/soap-rpc"
xmlns:m="http://travelcompany.example.org/">
<rpc:result>m:status</rpc:result>
<m:status>confirmed</m:status>
<m:code>FT35ZBQ</m:code>
<m:viewAt>
http://travelcompany.example.org/reservations?code=FT35ZBQ
</m:viewAt>
</m:chargeReservationResponse>
</env:Body>
2015
Node
intermediar nu nu da nu
destinatar final da nu da da
2015
Atributul mustUnderstand
• Acest atribut poate avea doua valori:
– true = acest lucru inseamna ca un nod caruia ii este destinat acest
bloc, trebuie sa proceseze obligatoriu nodul respectiv conform
semanticii blocului respectiv.
– false = acest lucru inseamna ca procesarea blocului de un nod caruia
ii este destinat acest bloc este optionala.
2015
2015
2015
Structura WSDL
Specificatie WSDL
Parte concreta
• Partea concreta defineste legaturile
legaturi
SW si alte informatii specifice SW.
servicii
2015
. . .
</description>
• Elementul radacina al WSDL este description.
• In exemplu nu se asigneaza un nume special pentru spatiul de nume al
elementelor tipice WSDL. Orice element neprefixat cu spatiu de nume
este specific vocabularului WSDL. Spre deosebire de acest exemplu, in
exemplele SOAP am folosit numele env pentru vocabularul SOAP.
• Se defineste apoi spatiul de nume pentru vocabularul folosit la descrierea
serviciului de rezervare prin interfete, legaturi si servicii. Se initializeaza
atat atributul targetNamespace, cat si spatiul de nume tns. Elementele
descrierii serviciului de rezervare vor fi astfel prefixate cu tns.
2015
Partea abstracta a WSDL
• Contine:
– Optional o multime de definitii de tipuri. Aceste tipuri
descriu datele din cadrul mesajelor primite si receptionate de
SW.
– O multime de zero sau mai multe interfete. O interfata
defineste o multime de operatii, similar cu RPC. Fiecare
operatie se caracterizeaza printr-un sablon de schimb de
mesaje (engl. message exchange pattern) – MEP. O operatie
grupeaza o multime de mesaje de cerere si raspuns.
2015
Parametrii operatiilor
• Elementul input se foloseste pentru specificarea unui parametru
de intrare ai unei operatii.
• Orice operatie specifica si un MEP, prin atributul pattern.
Atributul messageLabel specifica rolul acestui mesaj in cadru
unei secvente de interactiune dintre client si SW, conforma cu
MEP-ul specificat. In acest caz rolul este In.
• Atributul element specifica tipul de date asociat acestui mesaj,
in spatiul de nume ghns.
• Elementul ouput specifica un parametru de iesire al unei
operatii.
• Elementul outfault specifica un posibil mesaj de eroare ce poate
fi transmit clientului. Fiind vorba de sablonul in-out, daca este
prezent, el va inlocui mesajul in directia out.
2015
Sabloane de schimburi de mesaje
• in-only • Sabloanele robust-* si
– Un mesaj cu eticheta In in directia in *-optional-* pot genera erori.
• robust-in-only Acestea sunt semnalate
– Un mesaj cu eticheta In in directia in asociind un posibil mesaj de
• in-out eroare fiecarui mesaj din
– Un mesaj cu eticheta In in directia in sablon. Un mesaj de roare are
– Un mesaj cu eticheta Out in directia out.. o directie inversa fata de
• in-optional-out mesajul din sablon.
– Un mesaj cu eticheta In in directia in
– Optional un mesaj cu eticheta Out in directia out
• Sabloanele *-only nu
• out-only genereaza mesaje de eroare.
– Un mesaj cu eticheta Out in directia out. • Restul de sabloane pot
• robust-out-only genera erori. Orice mesaj,
– Un mesaj cu eticheta Out in directia out. exceptandul pe primul, poate
• out-in fi inlocuit cu un mesaj de
– Un mesaj cu eticheta Out in directia out. eroare in aceeasi directie.
– Un mesaj cu eticheta In in directia in
• out-optional-in
– Un mesaj cu eticheta Out in directia out.
– Optional un mesaj cu eticheta In in directia in
2015
2015
Schema de definire a legaturilor si serviciilor
<?xml version="1.0" encoding="utf-8" ?>
<description
. . .
xmlns:wsoap= "http://www.w3.org/ns/wsdl/soap"
xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
. . .
<binding name="reservationSOAPBinding"
interface="tns:reservationInterface"
. . . >
. . .
</binding>
<service name="reservationService"
interface="tns:reservationInterface">
. . .
</service>
</description>
• wsoap defineste spatiul de nume al extensiilor SOAP 1.2 pentru legaturi.
• soap defineste spatiul de nume in care sunt definite elementele ce compun
un “plic” al mesajelor SOAP. In exemplele SOAP a fost definit ca env.
2015
Definirea legaturilor
<binding name="reservationSOAPBinding"
interface="tns:reservationInterface"
type="http://www.w3.org/ns/wsdl/soap"
wsoap:protocol="http://www.w3.org/2003/05/soap/bindings/HTTP/">
<operation ref="tns:opCheckAvailability"
wsoap:mep="http://www.w3.org/2003/05/soap/mep/soap-response"/>
<fault ref="tns:invalidDataFault" wsoap:code="soap:Sender"/>
</binding>
• Se defineste o legatura reservationSOAPBinding.
• Atributul interface defineste interfata opCheckAvailability careia ii este
asociata legatura. Interfata este definita in spatiul de nume tns.
• Atributul type specifica tipul mesajelor. Aici este vorba de mesaje SOAP.
• Atributul protocol defineste protocolul de transport, in acest caz HTTP.
• Elementul operation specifica prin atributul ref operatia pentru care se
specifica legatura. Atributul mep specifica sablonul de interactiune SOAP
ce se va folosi pentru a implementa sablonul abstract in-out.
• Elementul fault refera prin ref eroarea pentru care se stabileste legatura.
2015
Definirea serviciilor
<service name="reservationService"
interface="tns:reservationInterface">
<endpoint name="reservationEndpoint"
binding="tns:reservationSOAPBinding"
address ="http://greath.example.com/2004/reservation"/>
</service>
2015
Documentarea serviciilor
<?xml version="1.0" encoding="utf-8" ?>
<description
. . . >
<documentation>
. . .
Aici se introduce comentariul serviciului
. . .
</documentation>
. . .
</description>
2015
Schema WSDL 2.0