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
[go: Go Back, main page]



Concurrence et Mobilité
Programmation concurrente et
fonctionnelle: CML et JoCaml

Georges Gonthier
INRIA Rocquencourt
Georges.Gonthier@inria.fr


Slide: 1


Plan

  1. de CSP à CCS à CML à JoCaml
  2. événements, canaux
  3. concurrence
  4. tampons
  5. diffusion
  6. concurrence et graphique : eXene
  7. sémantique
  8. JoCaml

Slide: 2


Le précurseur : CSP (Hoare)


Slide: 3


Le modèle : CCS (Milner)


Slide: 4


Canaux et fonctions : CML (Reppy)


Slide: 5


Fonctions concurrentes: JoCaml (Moscova)


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


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
  | e1 e2 application
  | (e1, e2) paire
  | let x=e1 in e2 définition
  | chan x in e création de canal
  | spawn e création de processus
  | sync e 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
  | G e 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,áG e,vñ) = G (wrap (e,v))
d(choose,áG e1,G e2ñ) = G (choose (e1,e2))
d(choose,áG e,ev'ñ) = G (choose (e,ev'))
d(choose,áev',G eñ) = G (choose (ev',e))
d(wrapAbort,áG e,vñ) = G (wrapAbort (e,v))


Slide: 18


Evaluation

Contexte
E ::= [·] | E e | v E | (E,e) | (v,E)
    | let x=E in e | spawn E | sync E
Règles
E[b v] ® E[d(b,v)]
E[let x=v in e] ® E[e[x|®v]]
E[(l x.e) v] ® E[e[x|®v]]
E[(v1,v2)] ® E[á v1,v2ñ]
E[sync (G e)] ® E[sync e]


Slide: 19


Communication


Slide: 20


Concurrence

Un système P est une fonction des noms de processus p vers des expressions e.
e® e'
P[p|®e] ® P[p|®e']
kÏFV( P[p|® E[chan x in e]])
P[p|® E[chan x in e]] ® P[p|® E[e[x|®k]]]
p'Ï Dom P
P[p|®E[spawn v]] ® P[p|®E[()], p'|®(v ())]
ev1
k
¥
 
ev2 ® (e1,e2)
P[p1|®E1[sync ev1], p2|®E2[sync ev2]] ® P[p1|®E1[e1], p2|®E2[e2]]


Slide: 21


JoCaml

let def put x  | cell! _ = cell x | reply ()
     or get () | cell! x = cell x | reply x;;

spawn { cell 3 };;

print_int (get ());; (* 3 *)
put 4;;
print_int (get ());; (* 4 *)
spawn { cell 5 };;
print_int (get ());; (* 4 ou 5 *)

This document was translated from LATEX by HEVEA.