Programación Concurrente y distribuida Modelo Concurrente
Transcripción
Programación Concurrente y distribuida Modelo Concurrente
Working Hypothesis Programación Concurrente y distribuida Modelo Concurrente declarativo Camilo Rueda 1 Universidad 1 Javeriana-Cali PUJ 2008 Working Hypothesis Oz Modelo semántico del KL Entorno: E : Id → Var Store de asignación única: σ Instrucción semántica: una instrucción y su entorno (< s >, E ) Estado de ejecución: una pila de instrucciones y su store (ST , σ) computación: secuencia de estados (ST0 , σ0 ) → (ST1 , σ1 ) . . . Working Hypothesis El Entorno Oz Working Hypothesis Oz Pila de ST semánticos (STn , En ) ...... ...... (ST2 , E2 ) (ST1 , E1 ) Working Hypothesis Oz Ejecución de un programa Estado inicial: ([(< s >, ∅)], ∅) composición secuencial: (< s >1 < s >2 , E ) push (< s >1 , E ) push (< s >2 , E ) variable local : (local < x > in < s > end , E ) E 0 = E + {< x >→ x} push (< s >, E 0 ) Working Hypothesis Oz Ejecución de un programa (cont) encadenar variables: (< x >1 =< x >2 , E ) ligar en el store E (< x >1 ) y E (< x >2 ) Los valores procedimentales son clausuras: variables globales: < z >1 , . . . , < z >k CE = E |< z >1 , . . . , < z >k (proc {$ < y >1 < y >2 < y >n } < s > end , CE ) condicional: (if < x > then < s >1 else < s >2 end , E ) si E (< x >) no es booleano, error si E (< x >) = true, push (< s >1 , E ) si E (< x >) = false, push (< s >2 , E ) si E (< x >) no está determinado, la ejecución se suspende Working Hypothesis Oz Ejecución de un programa (cont) llamar procedimiento: ({< x > < y >1 , < y >2 , . . . < y >n }, E ) si E (< x >) no es procedimiento o número de argumentos no concuerda, error si E (< x >) = (proc {$ < z >1 < z >2 < z >n } < s > end , CE ) agregue a la pila: (< s >, CE + {< z >1 → E (< y >1 ) . . . < z >n → E (< y >n )}) si E (< x >) no está determinado, la ejecución se suspende Working Hypothesis Oz Ejecución de un programa (cont) patrones: (case < x > of < lit > (< feat >1 :< x >1 . . . < feat >n :< x >n ) then < s >1 else < s >2 end , E ) si etiqueta de E (< x >) es < lit > y su aridad concuerda, agregue a la pila, (< s >1 , E + {< x >1 → E (< x >). < feat >1 , . . . , < x >n → E (< x >). < feat >n }) de lo contrario, agregue (< s >2 , E ) si E (< x >) no está determinado, la ejecución se suspende Working Hypothesis Oz Algunos programas declarativos (archivo declarat1.oz) Working Hypothesis Oz Concurrencia declarativa En el modelo declarativo + concurrencia: El resultado del programa es el mismo. La concurrencia no cambia la semántica Para qué Concurrencia entonces?: Los programas pueden calcular incrementalmente Ej: Leer datos incrementalmente de una conexión en la red Nociones: Programación con hilos Programación dirigida por demanda Working Hypothesis Oz Concurrencia declarativa: equivalencia Los programas pueden no terminar o terminar parcialmente equivalencia de resultados: cualquier ejecución conduce a store con restricciones equivalentes X = pepe(Y W ) Y = Z X = pepe(Z W ) Y = Z Working Hypothesis Oz El lenguaje de núcleo < s >::= skip | < s1 > < s2 > | local x in s end | x1 = x2 |x = v |if x then s1 else s2 end | case x of < pattern > then s1 else s2 end |{x y1 ...yn } | thread < s > end stmt vacı́o secuencia creación de var. Var-var binding creacón de valor Condicional Pattern matching applicacion de procedimiento creacion de un hilo Working Hypothesis Oz No determinismo declarativo Para mantener declaratividad: No puede existir no determinismo observable thread X = 1 end thread Y = 2 end thread X = Y end Atrapar la excepción por falla permitirı́a observar el no determinismo Working Hypothesis Oz Modelo de ejecución (MST0 , σ0 ) → (MST1 , σ1 ) → ... Cada MST representa un multiconjunto de stack de ejecución ({ST } ⊕ MST 0 , σ) → ({ST 0 ⊕ MST 0 , σ 0 )} ({[(thread s end, E )] + ST 0 } ⊕ MST 0 , σ) → ({[(s, E)]}⊕ {ST 0 } ⊕ MST 0 , σ) Working Hypothesis Oz Hilos Creación de un hilo: thread < s > end Los hilos: operan de manera independiente ejecutan en el momento en que sus instrucciones puedan hacerlo interactuan ligando variables en el store. Working Hypothesis Oz Hilos: scheduler debe ser justo en Mozart: round robin scheduling cada hilo tiene un máximo tiempo de actividad (“time slice”) hay “preemption”: después del tiempo máximo, se detiene el hilo y se pasa a otro. los hilos pueden tener prioridades (alta,media,baja) {Thread.setThisPriority P} Working Hypothesis Oz Hilos vs Procesos Concurrencia de procesos es por competencia Concurrencia de hilos es por colaboración Muchos hilos corren en un proceso Working Hypothesis Oz Hilos: modelo tı́pico Productor ↔Consumidor Lo que se produce se guarda en una lista infinita: a|b| . . . |R El consumidor consume apenas el productor produce Mecanismo de programación: streams (flujos) Working Hypothesis Programación de streams Varios procesos independientes: Enumerar Transformar (“transducir”) Filtrar Acumular Oz Working Hypothesis Oz Sincronización Sincronización de barrera Programación dirigida por datos Programación bajo demanda (“lazy”)