Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456 Concurrence et Mobilité Programmation concurrente et fonctionnelle: CML et JoCaml
Concurrence et Mobilité Programmation concurrente et fonctionnelle: CML et JoCaml
Georges Gonthier INRIA Rocquencourt Georges.Gonthier@inria.fr
Slide: 1
Plan
de CSP à CCS à CML à JoCaml
événements, canaux
concurrence
tampons
diffusion
concurrence et graphique : eXene
sémantique
JoCaml
Slide: 2
Le précurseur : CSP (Hoare)
Communicating Sequential Processes.
Ensemble statique de processus séquentiels.
Choix non-déterministe de Dijkstra.
Communication explicite et synchrone de
processus à processus.
Slide: 3
Le modèle : CCS (Milner)
Calculus of Communicating Systems.
La communication s'effectue sur des canaux.
Pas de notion statique de processus.
Opérateurs de choix et de concurrence.
Equivalence observationnelle ® algèbre.
Pas de passage de valeur (voir le p-calcul).
Slide: 4
Canaux et fonctions : CML (Reppy)
Concurrent ML
Basé sur Standard ML, mais existe aussi en
bibliothèque O'Caml.
Les canaux sont des valeurs.
Les opérations sur les canaux sont
des valeurs (événements).
Les canaux transmettent des valeurs.
Les événements peuvent être synchronisés
lors de l'évaluation des valeurs.
L'évaluation des valeurs peut être lancée
de façon asynchrone.
Slide: 5
Fonctions concurrentes: JoCaml (Moscova)
Fondé sur le Join-calcul (voir cours 3).
Basé sur O'Caml.
Etend le modèle d'exécution avec des
fonctions concurrentes.
Exécution asynchrone, processus.
Synchronisation par filtrage.
Extension à la programmation distribuée et mobile.
Slide: 6
Evénements
type 'a event
val sync : 'a event -> 'a
val select : 'a event list -> 'a
val poll : 'a event -> 'a option
val choose : 'a event list -> 'a event
val guard : (unit -> 'a event) -> 'a event
val wrap : ('a event * ('a -> 'b)) -> 'b event
val wrapHandler : ('a event * (exn -> 'a)) -> 'a event
val wrapAbort : ('a event * (unit -> unit)) -> 'a event
val always : 'a -> 'a event
Slide: 7
Canaux
type 'a chan
val channel : unit -> 'a chan
val send : ('a chan * 'a) -> unit
val accept : 'a chan -> 'a
val sameChannel : ('a chan * 'a chan) -> bool
val transmit : ('a chan * 'a) -> unit event
val receive : 'a chan -> 'a event
Slide: 8
Concurrence
type thread_id
val spawn : (unit -> unit) -> thread_id
val yield : unit -> unit
val exit : unit -> 'a
val threadWait : thread_id -> unit event
(** condition variables **)
type 'a cond_var
val condVar : unit -> 'a cond_var
val writeVar : ('a cond_var * 'a) -> unit
exception WriteTwice
val readVar : 'a cond_var -> 'a
val readVarEvt : 'a cond_var -> 'a event
Slide: 9
Tampons
datatype 'a buffer_chan =
BC of {inch : 'a chan, outch : 'a chan}
fun buffer () = let
val inCh = channel() and outCh = channel()
fun loop ([], []) = loop([accept inCh], [])
| loop (front as (x::r), rear) = select [
wrap (receive inCh, fn y => loop(front, y::rear)),
wrap (transmit(outCh, x), fn () => loop(r, rear))]
| loop ([], rear) = loop(List.rev rear, [])
in
spawn (fn () => loop([], [])); BC{inch=inCh, outch=outCh}
end
Slide: 10
Diffusion
datatype 'a mchan =
MChan of ('a request chan * 'a event chan)
and 'a request =
Message of 'a | NewPort
fun newPort (MChan(reqCh, respCh)) =
(send (reqCh, NewPort); accept respCh)
fun multicast (MChan(ch, _), m) = send (ch, Message m)
Slide: 11
Relais de diffusion
fun mChannel () = let
val reqCh = channel() and respCh = channel()
fun mkPort outFn = let
val buf = BC.buffer() and inCh = channel()
fun tee () = let val m = accept inCh
in BC.bufferSend(buf, m); outFn m; tee() end
in spawn tee; (fn m => send(inCh, m), BC.bufferReceive buf)
end
fun server outFn = let
fun handleReq NewPort = let val (outFn', port) = mkPort outFn
in send (respCh, port); outFn' end
| handleReq (Message m) = (outFn m; outFn)
in server (sync (wrap (receive reqCh, handleReq))) end
in spawn (fn () => server (fn _ => ())); MChan(reqCh, respCh)
end
Slide: 12
Application aux interfaces graphiques : eXene
Utilise les canaux pour separer les flux
de commandes, de requêtes, de contrôle.
Les fenêtres peuvent filtrer les événements.
Les événements permettent un contrôle fin
du déroulement des requêtes.
Slide: 13
Copie et réaffichage
fun copyArea arg = let
val replyCh = channel()
in
spawn (fn() => request (COPY_AREA(replyCh, arg)));
guard (fn() => (
case (poll (receive replyCh)) of
(SOME rects) => always rects
| NONE => (flush(); receive replyCh)
(* end case *))
end
Slide: 14
Le lcv-calcul
e
::=
v
valeur
|
e1e2
application
|
(e1,e2)
paire
|
letx=e1ine2
définition
|
chanxine
création de canal
|
spawne
création de processus
|
synce
synchronisation
Slide: 15
Valeurs et événements
v
::=
b
constante
ev
::=
L
jamais
|
x
variable
|
k!v
émission
|
á v1,v2 ñ
paire
|
k?
rception
|
l x.e
fonction
|
evÞv
wrapper
|
k
canal
|
ev1Åev2
choix
|
ev
événement
|
ev/v
abort wrapper
|
Ge
garde
Slide: 16
Delta-règles
d(never,())
=
L
d(transmit, ák,vñ)
=
k!v
d(receive, k)
=
k?
d(wrap, áev,kñ)
=
evÞv
d(choose, áev1,ev2ñ)
=
ev1Åev2
d(wrapAbort, áev,vñ)
=
ev/v
Slide: 17
Delta-règles des gardes
d(guard,v)
=
G (v())
d(wrap,áGe,vñ)
=
G (wrap(e,v))
d(choose,áGe1,Ge2ñ)
=
G (choose(e1,e2))
d(choose,áGe,ev'ñ)
=
G (choose(e,ev'))
d(choose,áev',Geñ)
=
G (choose(ev',e))
d(wrapAbort,áGe,vñ)
=
G (wrapAbort(e,v))
Slide: 18
Evaluation
Contexte
E
::=
[·] | Ee | vE |
(E,e) |
(v,E)
| letx=Eine |
spawnE | syncE
Règles
E[bv]
®
E[d(b,v)]
E[letx=vine]
®
E[e[x|®v]]
E[(l x.e) v]
®
E[e[x|®v]]
E[(v1,v2)]
®
E[á v1,v2ñ]
E[sync (Ge)]
®
E[synce]
Slide: 19
Communication
k!v ¥k k?
® ((),v)
Si ev1 ¥kev2
® (e1,e2), alors
ev2
k
¥
ev1
® (e2,e1)
ev1
k
¥
(ev2 ®v)
® (e1,ve2)
ev1
k
¥
(ev2 Å ev3)
® (e1,ev
b
3
;e2)
ev1
k
¥
(ev3 Å ev2)
® (e1,ev
b
3
;e2)
ev1
k
¥
(ev2/v)
® (e1,e2)
(k?)b=(k!v)b=(),
(ev®v)b=evb,
(ev1 Å ev2)b=
ev1b;ev2b,
et (ev/v)b=evb;spawnv
Slide: 20
Concurrence
Un système P est une fonction des noms de processus p
vers des expressions e.