Working Hypothesis Programación Concurrente y distribuida Camilo Rueda 1 1 Universidad Javeriana-Cali 1 de febrero de 2010
Motivación Working Hypothesis Premisa El contexto de aplicación de la Ingeniería de Software está cambiando
Motivación Working Hypothesis Premisa El contexto de aplicación de la Ingeniería de Software está cambiando CPU multi-núcleo
Motivación Working Hypothesis Premisa El contexto de aplicación de la Ingeniería de Software está cambiando CPU multi-núcleo Programas en la web
Motivación Working Hypothesis Premisa El contexto de aplicación de la Ingeniería de Software está cambiando CPU multi-núcleo Programas en la web Dispositivos móviles programables
Motivación Working Hypothesis Premisa El contexto de aplicación de la Ingeniería de Software está cambiando CPU multi-núcleo Programas en la web Dispositivos móviles programables Programas interactuan con el mundo físico
Motivación (cont) Working Hypothesis Conceptos, modelos, técnicas y metodologías deben adaptarse
Motivación (cont) Working Hypothesis En software tradicional: Conceptos, modelos, técnicas y metodologías deben adaptarse Concepto Modelo Técnica Modularidad Tipo abstracto de datos Clase
Motivación (cont) Working Hypothesis En el nuevo contexto: Conceptos, modelos, técnicas y metodologías deben adaptarse Concepto Modelo Técnica Proceso objeto activo Puerto+cola de mensajes Localidad...... Exclusión mutua...... Imparcialidad ( fairness )...............
Working Hypothesis Por qué nuevas metodologías? Ejemplo: Exclusión mutua P 1 l 0 : loop forever do l 1 : sección no crítica l 2 : s := 1; l 3 : y 1 := 1; l 4 : wait (y 2 = 0) (s 1); l 5 : sección crítica l 6 : y 1 := 0 od P 2 m 0 : loop forever do m 1 : sección no crítica m 2 : s := 2; m 3 : y 2 := 1; m 4 : wait (y 1 = 0) (s 2); m 5 : sección crítica m 6 : y 2 := 0 od ejecutar : s := 1; y 1, y 2 := 0, 0; [P 1 P 2 ] funciona?
Working Hypothesis Por qué nuevas metodologías? Ejemplo: Exclusión mutua P 1 l 0 : loop forever do l 1 : sección no crítica l 2 : s := 1; l 3 : y 1 := 1; l 4 : wait (y 2 = 0) (s 1); l 5 : sección crítica l 6 : y 1 := 0 od P 2 m 0 : loop forever do m 1 : sección no crítica m 2 : s := 2; m 3 : y 2 := 1; m 4 : wait (y 1 = 0) (s 2); m 5 : sección crítica m 6 : y 2 := 0 od funciona? Exactamente por qué? ejecutar : s := 1; y 1, y 2 := 0, 0; [P 1 P 2 ]
Working Hypothesis Por qué nuevas metodologías? Ejemplo: Exclusión mutua P 1 l 0 : loop forever do l 1 : sección no crítica l 2 : y 1 := 1; l 3 : s := 1; l 4 : wait (y 2 = 0) (s 1); l 5 : sección crítica l 6 : y 1 := 0 od P 2 m 0 : loop forever do m 1 : sección no crítica m 2 : y 2 := 1; m 3 : s := 2; m 4 : wait (y 1 = 0) (s 2); m 5 : sección crítica m 6 : y 2 := 0 od ejecutar : s := 1; y 1, y 2 := 0, 0; [P 1 P 2 ] funciona?
Working Hypothesis Por qué nuevas metodologías? Ejemplo: Exclusión mutua P 1 l 0 : loop forever do l 1 : sección no crítica l 2 : y 1 := 1; l 3 : s := 1; l 4 : wait (y 2 = 0) (s 1); l 5 : sección crítica l 6 : y 1 := 0 od P 2 m 0 : loop forever do m 1 : sección no crítica m 2 : y 2 := 1; m 3 : s := 2; m 4 : wait (y 1 = 0) (s 2); m 5 : sección crítica m 6 : y 2 := 0 od funciona? Exactamente por qué? ejecutar : s := 1; y 1, y 2 := 0, 0; [P 1 P 2 ]
Estrategia del curso Working Hypothesis Presentar con cada concepto de programación concurrente y distribuida, sus modelos y tecnologías
Estrategia del curso Working Hypothesis Para los modelos Presentar con cada concepto de programación concurrente y distribuida, sus modelos y tecnologías Formalizarlos en un lenguaje de núcleo extendible, el Kernel Oz
Estrategia del curso Working Hypothesis Para los modelos Presentar con cada concepto de programación concurrente y distribuida, sus modelos y tecnologías Formalizarlos en un lenguaje de núcleo extendible, el Kernel Oz Para las técnicas Programarlas en el lenguaje de núcleo, construir aplicaciones
El Lenguaje de núcleo Working Hypothesis Lenguaje de programación minimal: con el mínimo de construcciones necesarias para representar un concepto
El Lenguaje de núcleo Working Hypothesis Lenguaje de programación minimal: con el mínimo de construcciones necesarias para representar un concepto Expresivo
El Lenguaje de núcleo Working Hypothesis Lenguaje de programación minimal: con el mínimo de construcciones necesarias para representar un concepto Expresivo Implementable e implementado
El Lenguaje de núcleo Working Hypothesis Lenguaje de programación minimal: con el mínimo de construcciones necesarias para representar un concepto Expresivo Implementable e implementado Simple
El Lenguaje de núcleo Working Hypothesis Lenguaje de programación minimal: con el mínimo de construcciones necesarias para representar un concepto Expresivo Implementable e implementado Simple Modular (o incrementable )
El Lenguaje de núcleo Working Hypothesis Lenguaje de programación minimal: con el mínimo de construcciones necesarias para representar un concepto Expresivo Implementable e implementado Simple Modular (o incrementable ) Reaĺısticamente cercano a lenguajes existentes
El Lenguaje de núcleo Working Hypothesis Lenguaje de programación minimal: con el mínimo de construcciones necesarias para representar un concepto Expresivo Implementable e implementado Simple Modular (o incrementable ) Reaĺısticamente cercano a lenguajes existentes Semántica precisa Nombre de moda: framework
Working Hypothesis El KL Oz: modelo declarativo < st > ::= < st 1 > < st 2 > secuencia de comandos local < var > in < st > end variable local if < var > then < st 1 > condicional else < st 2 > end case < var > of casos < patron > then < st 1 > [ ] < patron k > then < st k > else < st > end {< var > < arg 1 >... < arg n > } llamado a procedimiento Por qué no hay declaración de procedimientos?
Working Hypothesis El KL Oz: modelo declarativo < st > ::= < st 1 > < st 2 > secuencia de comandos local < var > in < st > end variable local if < var > then < st 1 > condicional else < st 2 > end case < var > of casos < patron > then < st 1 > [ ] < patron k > then < st k > else < st > end {< var > < arg 1 >... < arg n > } llamado a procedimiento Por qué no hay declaración de procedimientos? son valores: < valor >::=< numero > < registro > < proced > < proced >::= proc { $ < arg 1 >... < arg n >} < st > end
Working Hypothesis Por qué KL en el curso Por ser dispositivo de cómputo: refuerza conceptos teóricos viendo su realización práctica es a la vez riguroso, simple y práctico. Puede cubrir varios paradigmas de programación Puede aumentarse para distintos modelos de computación: Programación concurrente Programación distribuida
Working Hypothesis Modelos de computación (versión PVR&SH) Declarativo ((, un poco) Abstracción procedimental y recursión Evaluación perezosa Programación de alto orden Lenguajes: ML ( caml) Estado expĺıcito (imperativo) Funciones con memoria Tipos abstractos de datos Lenguajes: C Concurrente declarativo o dirigido por datos ( ) Programación multi-hilos ( ) Flujos (streams) ( ) Sincronización de procesos ( )
Modelos (2) Working Hypothesis Concurrencia por paso de mensaje ( ) Asincronía ( ) Puertos ( ) Agentes ( ) Lenguajes: Earlang ( ) Orientado-objetos Herencia Clase, objeto Lenguajes: Java, Eiffel, C++, et al. Concurrencia de estado compartido ( ) Candados ( ) Monitores ( ) Transacciones ( ) Lenguajes: Java concurrente ( )
Modelos (3) Working Hypothesis Programación distribuida ( ) Distribucón de datos ( ) istribución de estado ( ) Patrones de programación distribuida ( ) Protocolos distribuidos ( ) Manejo de fallas ( ) aspectos de seguridad ( ) Movilidad (?)
Objetivos generales Working Hypothesis Saber diseñar programas concurrentes y distribuidos Poder razonar formalmente sobre un programa concurrente o distribuido Conocer cómo verificarlos Poder implementar un programa concurrente o distribuido usando el lenguaje de núcleo
Working Hypothesis Programa concurrente vs secuencial Secuencial: Observables: Parejas de estados iniciales y finales i.e. Valores de las variables de entrada/salida El cómo se llega al estado final no importa Hay un solo camino posible al estado final Concurrente: Estados intermedios son tan importantes como los finales (sincronización) Observables: Conjunto de variables que ocurren en un componente Conjunto de variables con las que se comunica
Working Hypothesis Semántica de la concurrencia traza: una secuencia particular de transiciones atómicas de estado σ 0 α 1 σ 1 α 2... α i σ i α i+1 σ i+1 σ i : Estados α i : acciones atómicas α 1 α 2... es un intercalamiento (interleaving). Corresponde a una historia del proceso Semántica de un programa: conjunto de todas sus historias posibles
Working Hypothesis Cómo razonar sobre prog. concurrentes? Inspeccionar cada historia?
Working Hypothesis Cómo razonar sobre prog. concurrentes? Inspeccionar cada historia? son demasiadas!!
Working Hypothesis Cómo razonar sobre prog. concurrentes? Inspeccionar cada historia? son demasiadas!! Mejor: Representar conjuntos enteros de trazas por sus propiedades un predicado representa un conjunto de estados Un programa es una relación entre predicados
Working Hypothesis Cómo involucrar sincronización? La comunicación permite a un proceso influir sobre otro Posibilidades: Variables compartidas Paso de mensajes (canales compartidos) Esquemas de sincronización: Exclusión mutua Sincronización condicional Comunicación síncrona
Ejemplo Working Hypothesis ENVIA BUFFER RECIBE Exclusión mutua entre envío y recepción Sincronización condicional: Evitar que el mismo mensaje se envíe dos veces. Protocolo de comunicación: sincronía.
Working Hypothesis Semántica operacional del KL Las variables son de asignación única La asociación de variables con valores se mantiene en el almacén ( store ) El store está compuesto de entidades: variables con sus valores.
Working Hypothesis Identificadores y variables Los identificadores son las variables del usuario en un programa Un identificador referencia una entidad del store
Working Hypothesis Tipos en el modelo declarativo
Working Hypothesis Máquina abstracta de KL Un store de asignación única σ: conjunto de variables x 1,..., x k Un Ambiente E: función de identificadores a variables del store { x 1 x 1,... x n x n, } Una Instrucción Semántica: pareja ( s, E) s: instrucción E: ambiente Un estado de ejecución: pareja (ST, σ) ST : pila de instrucciones semánticas Una computación: secuencia de estados de ejecución, a partir de un estado inicial (ST 0, σ 0 ) (ST 1, σ 1 ) (ST 2, σ 2 )...
Working Hypothesis Ejecución de un programa El estado de ejecución inicial es [( s, )], ). La instrucción semántica inicial es ( s, ) con un ambiente vacío, y el store inicial es vacío En cada paso de ejecución, el primer elemento de ST se saca de la pila y la ejecución prosigue según la forma del elemento El estado final (si existe) es en el que la pila semántica está vacía. Una pila semántica puede estar en uno de los estados: corriendo: ST puede hacer un paso de ejecución terminado: ST es vacío suspendido: ST no es vacío, pero no puede ejecutar un paso
Working Hypothesis Ejemplo: instrucción local Instrucción semántica: (local x in s end, E) La ejecución consiste de las acciones siguientes: Crear una variable x nueva en el store Agregar a la pila ( s, E + { x x})
Ejemplo: instrucción if Working Hypothesis Instrucción semántica: (if x then s 1 else s 2 end, E) Esta instrucción tiene una condición de activación: E( x ) debe estar determinado, i.e. ligado a número, registro o procedimiento La ejecución consiste de las acciones siguientes: Si la condición de activación se cumple, entonces si E( x ) no es un booleano, levante condición de error si E( x ) es verdadero, agregar a la pila ( s 1, E) si E( x ) es falso, agregar a la pila ( s 2, E) Si la condición de activación no se cumple, se suspende la ejecución Si otra actividad hace la condición de activación cierta, la ejecución puede continuar. Esto permite programación de flujo de datos (concurrencia declarativa)
Working Hypothesis Ejemplo: procedimientos Un valor procedimental es una pareja: (proc {$ y 1... y n } s end, CE) donde CE (el ambiente contextual) es el ambiente en el que se definió el procedimiento En un llamado a procedimiento ({ x x 1... x n }, E): Si E( x ) es de la forma (proc { y 1... y n } s end, CE), entonces agregue a la pila ( s, CE + { y 1 E( x 1 ),..., y n E( x n )}) Esto permite programación de alto orden como en lenguajes funcionales
Working Hypothesis Importancia del modelo declarativo Un programa declarativo puede particionarse en componentes que pueden escribirse, chequearse y probar su corrección independientemente de los otros Hay técnicas simples de razonamiento para construir programas
tarea Working Hypothesis Asegurar conocimientos básicos de Mozat: leer libro PVR, cap 2 (hasta 2.7 ) Escriba la ejecución formal del programa local Op W in proc {Op X Y F R} if X > Y then R = {F X Y }else R = {F Y X } end end {Op 7 5 fun {$ X Y } X Y end W } end
Working Hypothesis Primeros programas en Oz (archivo primeros.oz)