Sei sulla pagina 1di 58

Programacin Avanzada

Ing. Humberto Silvera Reynaga

Motivacin de la programacin concurrente


LA CRISIS DEL SOFTWARE.- Conjunto de tpicos relacionados con la problemtica asociada al desarrollo de software: "Construir una aplicacin software es una tarea mucho ms compleja de lo que parece al iniciarla" Aspectos de esta problemtica son: o Resposiveness: No satisfacen las expectativas del usuario. o Reliability: Presentan fallos y su depuracin es muy difcil. o Cost: El costo es difcil de evaluar y mas alto de lo esperado. o Modificability: Son productos muy rgido y difciles de mantener. o Timeless: Requieren para su ejecucin mas tiempo del previsto. o Transportability: Hay problemas para migrar entre plataforma. o Efficiency: Slo utilizan una parte de la capacidad de hardware. Un pequeo paquete con algn millar de lneas de cdigo es asequible mentalmente a un programador, sin embargo, un paquete mediano o grande con cientos de miles de lneas, desborda la capacidad de cualquier programador.

Motivacin de la programacin concurrente


Causas profundas de la crisis del software son: oLa metodologa en cascada que linealiza el proceso de desarrollo. oLa metodologa de modularizacin estructurada hace que el software sea inflexible y difcil de mantener. oLos programadores no tienen formacin en ingeniera software. oLas empresas e instituciones tienen inercia a introducir las innovaciones. oLa estructura secuencial de Von Newmann no se adapta a los problemas que se abordan. El paradigma de diseo estructurado de software es de naturaleza lineal, y es difcil evaluar a nivel de proyecto el efecto posterior de las decisiones que se toman en cada fase del ciclo de vida de un software.

Motivacin de la programacin concurrente


PROGRAMAS Y LNEAS DE FLUJO DE CONTROL Un programa se compone de: oSentencias: Establecen las actividades (operaciones y verificaciones) que ejecuta el sistema. oLnea de flujo de control (Thread): Establece el orden en que se ejecutan las sentencias.

Segn las caractersticas de la lnea de flujo de control los programa se clasifican en: oSecuenciales. oConcurrentes. oTiempo real.

Motivacin de la programacin concurrente


PROGRAMAS SECUENCIALES oEs el estilo de programacin que corresponde al modelo conceptual de Von Newmann. oUn programa secuencial tiene una lnea simple de control de flujo. oLas operaciones de un programa secuencial estn ordenadas de acuerdo con un orden estricto. oEl comportamiento de un programa es solo funcin de las sentencias que lo componen y del orden en que se ejecuta. oEl tiempo que tarda en ejecutarse cada operacin no influye en el resultado de un programa secuencial. oLa verificacin de un programa secuencial es sencilla: Cada sentencia da la respuesta correcta. Las sentencias se ejecutan en el orden adecuado.

Motivacin de la programacin concurrente


PROGRAMAS CONCURRENTES oSon programas que tienen mltiples lneas de flujo de control. oLas sentencias de un programas concurrente se ejecutan de acuerdo con un orden no estricto. oLa secuencializacin de un programa concurrente es entre hitos o puntos de sincronizacin. oUn programa concurrente se suele concebir como un conjunto de procesos que colaboran y compiten entre s. oPara validar un programa concurrente: Las operaciones se pueden validar individualmente si las variables no son actualizadas concurrentemente. El resultado debe ser independiente de los tiempos de ejecucin de las sentencias. El resultado debe ser independiente de la plataforma en que se ejecuta.

Motivacin de la programacin concurrente


PROGRAMAS DE TIEMPO REAL oEl orden de ejecucin de las sentencias est establecido por las lneas de flujo de control y por los eventos externos. oLos eventos externos no estn condicionados por los criterios de sincronizacin establecidos en el programa. oEl tiempo fsico en que se ejecutan las sentencias es parte de la funcionalidad del programa. oLa validacin de los programas de tiempo real es muy compleja, requiere disponer del entorno o de un emulador.

Motivacin de la programacin concurrente


APLICACIONES DE LOS PROGRAMAS CONCURRENTES Aplicaciones clsicas: oProgramacin de sistemas multicomputadores oSistemas operativos oControl y monitorizacin de sistemas fsicos reales Aplicaciones actuales: oServicios WEB. Sistemas multimedia. oClculo numrico. Cdigo mvil. oProcesamientos entrada/salida. Sistemas embebidos. oSimulacin de sistemas dinmicos. Tecnologas de componentes. oInteraccin operador/mquina (GUIs) La naturaleza y los modelos de interaccin entre procesos de un programa concurrente, fueron estudiados y descritos por Dijkstra (1968), Brinch Hansen (1973) y Hoare (1974). Estos constituyeron los principios en que se basaron los S.O. multiproceso (dcada 70 y 80).

Motivacin de la programacin concurrente


VENTAJAS DE LA PROGRAMACION CONCURRENTE oProporciona el modelo ms simple y natural de concebir muchas aplicaciones. oFacilita el diseo orientado a objeto de las aplicaciones, ya que los objetos reales son concurrentes. oHace posible compartir recursos y subsistema complejos. oEn sistemas monoprocesador permite optimizar el uso de los recursos. oFacilita la programacin de tiempo real, ya que se pueden concebir como procesos cuya ejecucin se planifican de acuerdo con la urgencia. oPermite reducir los tiempos de ejecucin sobre plataformas multiprocesadoras. oFacilita la realizacin de programas fiables por despliegue dinmico de los procesos en los procesadores.

Motivacin de la programacin concurrente


CONCEPTO DE SISTEMAS DE TIEMPO REAL Caractersticas esenciales de un sistema de tiempo real: oEl orden de ejecucin de las operaciones depende de: -Los eventos externos que recibe del entorno. -Del tiempo que transcurre. oEl cumplimiento de plazos temporales en las respuestas es parte de la especificacin funcional. oDe acuerdo con la severidad de los requerimientos temporales: -Sistemas de tiempo real estricto (Hard real-time): El incumplimiento de un plazo es un fallo irrecuperable. -Sistemas de tiempo real laxos: (Soft real-time): Los requerimientos temporales se cumplen en promedio.

Motivacin de la programacin concurrente


CARACTERSTICAS DE SISTEMAS DE TIEMPO REAL oNaturaleza empotrada. oFuerte interaccin con el entorno. oRestricciones temporales. oInteracciones asncronas. oNaturaleza reactiva.

Motivacin de la programacin concurrente


ENTORNOS HARDWARE PARA PROGRAMACIN CONCURRENTE oUn programa concurrente correcto debe funcionar en cualquier plataforma. oLa plataforma puede ser importante para establecer los modelos de fallo. oEntornos habituales: -Entorno monoprocesador con multiprogramacin. -Entorno multicomputador con memoria compartida. -Entorno distribuido.

Motivacin de la programacin concurrente


ENTORNO MONOPROCESADOR CON MULTIPROGRAMACIN oLos procesos se ejecutan con concurrencia virtual. oLa aplicacin concurrente no se ejecuta mas eficientemente. oRazones por las que se utiliza: -Optimizar utilizacin de los recursos. -Servir a mltiple usuarios. -Conseguir un diseo mas simple y comprensible.

Motivacin de la programacin concurrente


ENTORNO MULTIPROCESADOR CON MEMORIA COMPARTIDA oLos procesos se ejecutan con concurrencia fsica. oEl programa concurrente se ejecuta mas eficiente. oPueden existir problemas de coherencia entre memorias.

Motivacin de la programacin concurrente


SISTEMA DISTRIBUIDO oExiste concurrencia fsica. oLa comunicacin es por mensajes. oProblemas tpicos: -Comunicacin es costosa. -Coherencia de datos. -Entornos heterogneos.

Motivacin de la programacin concurrente


EJEMPLO DE PROGRAMA CONCURRENTE oSoftware embarcado de control de un coche.

oEl conjunto de tareas hacen uso del 95% de la capacidad del procesador. oNo es posible combinar secuencialmente la tres tareas. EJEMPLO: SOLUCIN SECUENCIAL. oLa solucin requiere segmentar las tareas mas largas en secciones mas breves. oLa solucin es difcil de mantener.

Motivacin de la programacin concurrente


Una solucin posible es descomponer la tarea V_C en cuatro sub-tareas: V_C_1 (de duracin 60 ms), V_C_2 (de duracin 160 ms) y V_C_3 (de duracin 60 ms) y V_C_4 ( de duracin 120 ms) y planificar su ejecucin de acuerdo con el siguiente programa: repeat M_V; P_C; V_C_a; M_V; V_C_b; M_V; P_C; V_C_c; M_V; V_C_d; sleep (40 ms); forever;

Motivacin de la programacin concurrente


EJEMPLO: TAREA APERIDICA oLa tarea C_S tiene la funcin de bloquear el cinturn de seguridad si el sensor de aceleracin supera un umbral: Naturaleza: Aperidica Plazo de respuesta: 30 ms Uso de CPU: 20 ms Intervalo mnimo: 800 ms oIncorporar esta tarea a la estructura secuencial es muy difcil. oLa solucin atender el evento en una rutina de interrupcin.

Motivacin de la programacin concurrente


El programa se plantea como cuatro procesos concurrentes, que solo interaccionan entre s por compartir el mismo recurso de procesamiento. program Control_coche; process P_M_V; (* Proc. medida de velocidad *) begin repeat M_V; sleep(160 ms); forever; end; process P_P_C; (* Proc. control presin carburante*) begin repeat M_V; sleep(300 ms); forever; end;

Motivacin de la programacin concurrente


process P_V_C; (* Proc. control vlvula carburador *) begin repeat M_V; sleep(400 ms); forever; end; process P_C_S; (* Proc. atencin control cinturn*) begin repeat wait evento; C_S; forever; end; begin (* Programa principal *) cobegin P_M_V; P_P_C; P_V_C; P_C_S; coend end.

Motivacin de la programacin concurrente


program Control_coche; process P_MedidaVelocidad; (Proceso de medida de la velocidad) begin repeat M_V; sleep(160 ms); forever; end; process P_PresinCarburante; (Proceso control presin carburante) begin repeat M_V; sleep(300 ms); forever; end; process P_ControlValvulaCarburador; (Proc. control vlvulacarburador) begin repeat M_V; sleep(400 ms); forever; end; process P_ControlCinturon; (Proc. atencin del control del cinturn) begin repeat wait evento; C_S; forever; end; begin (Programa principal) cobegin P_MedidaVelocidad; P_PresionCarburante; P_ControlValvulaCarburador; P_ControlCinturn; coend; end.

Recursos para la concurrencia


Procesos Concurrentes Concepto de proceso Estructura de los procesos Estados de un proceso Gestin de los procesos Plataforma de ejecucin concurrente La concurrencia no es un trmino fcil de definir. Informalmente, un programa concurrente es un programa que ejecuta mas de una actividad simultneamente.

Recursos para la concurrencia


Programas concurrentes y procesos Un programa concurrente se concibe como un conjuntos de thread o hilos de control, cada thread ejecuta una nica actividad secuencial. Cada thread se ejecuta en su propio procesador virtual ejecutando independientemente acciones de acuerdo con la actividad que tiene asociada. Los threads concurrentes intercambian entre s mensajes con informacin y mensajes de sincronismo. Existen tres formas de implementar un programa concurrente: Mediante un lenguaje concurrente (Ada, Java, etc.). A travs de un sistema operativo (UNIX, POSIX, Windows, etc). Apoyndose en un software de comunicaciones (DIS-ADA, MMS, CORBA).

Recursos para la concurrencia


Programa secuencial Programa secuencial P; Q; R; Se interpreta como: Ejecucin P Q R Para todas las ejecuciones vlidas P debe terminar antes de empezar Q y Q debe terminar antes de empezar R. Programa concurrente Programa concurrente cobegin P; Q; R; coend; Se interpreta como: Ejecucin {not(PQ) and not(PR) and not(QP) and not(QR) and not(RP) and not(RQ)} Existe al menos una ejecucin vlida en la que los tres procesos se estn ejecutando simultneamente.

Recursos para la concurrencia


Aspectos de los procesos Cada entorno de programacin concurrente necesita establecer algunas caractersticas sobre sus procesos: Naturaleza de los procesos. Jerarqua de los procesos. Mecanismos de inicializacin. Mecanismos de finalizacin. Formas de declaracin.

Recursos para la concurrencia


Naturaleza de los procesos.- Los procesos pueden ser: Procesos estticos: son instanciados al comienzo del programa. El programador los declara explcitamente. Procesos dinmicos: Son creados durante la ejecucin del programa, en funcin de los datos. En funcin de los procesos en un sistema, se clasifican: Sistema cerrado: Se tiene un conocimiento en tiempo diseo (esttico) sobre los procesos que constituyen el sistema y su actividad. Sistema abierto: El nmero de procesos que constituyen el sistema varia en el tiempo de forma impredecible (en fase de diseo), bien porque crea dinmicamente procesos, porque carga clases desconocidas potencialmente activas, invoca procedimientos externos en otros subsistemas, etc. Crear, instanciar y destruir un proceso son tareas complejas y costosas en tiempo de procesador, los procesos dinmicos no se pueden utilizar en sistemas de tiempo real.

Recursos para la concurrencia


Jerarqua de los procesos Los procesos de un programa se pueden organizar en: Estructura plana: Todos los procesos son equivalentes. Evolucionan y terminan independientemente (procesos UNIX).

Estructura jerarquizada: Entre los procesos existe unas relaciones de dependencia con estructura de rbol. Un proceso no termina hasta que los procesos que dependen de l terminan.

Recursos para la concurrencia


Modo de inicializacin de los procesos Inicializar un proceso es transferirle tras su creacin la informacin que requiere para caracterizarlo individualmente. Existen diferentes estrategias: En UNIX cada proceso es inicialmente una rplica del padre. En Ada o Java en la creacin se establecen unos parmetros de inicializacin, tras la creacin el hijo comunica con el padre y recibe la informacin de inicializacin. Modos de finalizacin de los procesos Existen mltiples formas de terminar un proceso: La lnea de flujo de control alcanza el final (con xito). Se produce una excepcin no atendida (con fallo). Un proceso ejecuta una sentencia self terminate (con fallo). El proceso es abortado por otro proceso (con fallo). Finalizacin coordinada terminate (con xito). No terminan nunca.

Recursos para la concurrencia


Declaracin de procesos concurrentes Declaracin por sentencias estructuradas: cobegin proceso_1, proceso_2, ..., proceso_n coend; Declaracin como componentes de bloque: procedure Padre; process proceso_1; begin ....end; process proceso_2; begin ....end; begin .... end; Bifurcacin (fork) ..... {if (fork() = = 0 ) {.... } /*(Se ejecuta slo en el proceso hijo} else {.... } /*(Se ejecuta slo en el proceso padre y pid_hijo contiene el pid del nuevo proceso hijo} }..... Invocacin no estructurada: exec

Recursos para la concurrencia


Estados de un proceso Un proceso pasa a estar creado cuando se instancia un componente de programa en el que est declarado. El proceso pasa a estado de ejecutable cuando se ejecuta la sentencia (cobegin ... coend) del proceso padre en el que se requiere su ejecucin.
No existe

Creado

Eliminado

Ejecucin

Terminado

El proceso pasa al estado terminado, cuando por causa de concluir su lnea de control de flujo, o por algn tipo de error finaliza su operacin. Cuando la sentencia "cobegin ... coend" a la que pertenece un proceso, concluye como consecuencia de que todos los procesos en ella incluidos han finalizado, el proceso queda eliminado y todos los recursos que le haban sido asignados son retornados al sistema. Por ltimo, el proceso deja de existir cuando concluye el componente software en el que fue definido.

Recursos para la concurrencia


Estados de un proceso en un entorno multiproceso De todos los procesos ejecutables en el procesador solo uno de ellos podr estar haciendo uso de la CPU y se encontrar en un estado ejecucin. Los restantes procesos se Dormido encontrarn en Bloqueado estado suspendido Suspendido (listo para su ejecucin).
No existe

Creado

Eliminado

Listo

Terminado

Ejecucin Ejecutable

El trnsito repetido para cada proceso entre los estados ejecucin y listo es controlado por el planificador de procesos (scheduler). Un programa que se encuentra en ejecucin en la CPU, pasa a estado suspendido por:

Recursos para la concurrencia


Estados de un proceso en un entorno multiproceso Finalizar el tiempo de ejecucin asignado al proceso. El mismo procesador pasa a estado suspendido por un proceso de mayor prioridad. Cuando el Dormido proceso queda Bloqueado a la espera de Suspendido eventos externo
No existe

Creado

Eliminado

Listo

Terminado

Ejecucin Ejecutable

Dormido que corresponde al estado cuando ejecuta una sentencia de suspensin tal como "sleep" o "wait". Estado en espera de un recurso corresponde a un proceso que se encuentra bloqueado en un mutex en espera de recibir el acceso a un recurso.

Recursos para la concurrencia


Gestin de los procesos Los procesos de un programa concurrente son gestionados por el sistema de soporte de tiempo real (RTSS) del sistema operativo. El RTSS debe disponer de un bloque de control de procesos (PCB): Identificador del proceso (PID).- Estructura de datos que identifica de forma nica el proceso. Status del proceso.- Describe el estado en que se encuentra el proceso. Entorno del proceso.- Informacin que requiere el proceso para continuar su ejecucin. Enlaces: Permite la asociacin entre procesos, y su adscripcin a las colas.

Recursos para la concurrencia


Estrategia de implementacin del RTSS El compilador incorpora el RTSS al cdigo ejecutable del programa, se empaqueta (linked) con los cdigos correspondientes a todos los procesos que constituyen el programa. Todos juntos constituyen un programa global que es ejecutado por el sistema operativo como si fuese una aplicacin simple. El compilador introduce en el cdigo sentencias de acceso al S.O. que es el que gestiona los procesos, incorpora al cdigo las llamadas al sistema operativo que se necesitan para realizar las operaciones de interaccin entre procesos y de uso de los recursos que exige el programa concurrente. El primero es el ms simple de realizar, y corresponden muchos de los compiladores de lenguajes de programacin concurrentes, el segundo es mucho ms eficiente, y puede llevar la programacin concurrente hasta su posibilidades ms avanzadas.

Recursos para la concurrencia


Planificacin de los procesos La poltica de planificacin de procesos (Schedulling) es el criterio para elegir el proceso que se ejecuta de entre los suspendidos (listos para la ejecucin). El comportamiento funcional de un programa no debe depender de la poltica de planificacin que impone el RTSS. La poltica de planificacin si influye en la temporizacin del programa. La sincronizacin entre procesos no debe basarse en la poltica de planificacin.
Suspendido

Caractersticas de la poltica de planificacin Capacidad de desalojar el proceso en ejecucin: Ejecutndose Poltica desalojante (preemptive). Poltica no desalojante (non-preemptive) Criterio de seleccin del proceso a ejecutar: Poltica FIFO. -Poltica LIFO. -Poltica Round-Robin Prioridad esttica -Prioridad dinmica.

Recursos para la concurrencia


Caractersticas de la poltica de planificacin Poltica desalojante (pre-emptive): El proceso en ejecucin puede ser desalojado por el RTSS si por el criterio de priorizacin, hay otro proceso de mayor prioridad. Poltica no desalojante (no pre-emptive): En proceso en ejecucin no puede ser desalojado de la CPU hasta que termina, se duerme o se suspende en espera de un evento. Orden FIFO: Se elige el proceso mas antiguo de lista de espera. Orden LIFO: Se elige el proceso mas reciente de la lista de espera. Round Robin: El RTSS asigna a cada proceso una intervalo de tiempo, y sigue su seleccin con una poltica FIFO (terminado el tiempo asignado, el proceso ocupa el ltimo puesto de la cola) Prioridad esttica: Cada proceso tiene una prioridad absoluta (el RTSS selecciona el proceso con mayor prioridad de la lista de espera). Prioridad dinmica: Cada proceso se le asigna una prioridad base y un coeficiente de incremento de la prioridad con el tiempo de espera.

Recursos para la concurrencia


Planificacin de una aplicacin de tiempo real. La planificacin de una aplicacin de tiempo real es el aspecto crtico del diseo de estos sistemas: Existe una estrategia de planificacin que permita realizar todas las tareas previstas cumpliendo cada una de ellas los requerimientos temporales establecidos? cul es la correcta asignacin de prioridades que debe asignarse a los procesos para que los requerimientos temporales se satisfagan?

Interaccin entre procesos de un programa concurrente


Interaccin entre Procesos Concurrentes Modelos de interaccin entre procesos. Problemas de sincronizacin y exclusin mutua. Tipos bsicos de interaccin entre procesos Los procesos de una aplicacin concurrente pueden interaccionar entre s de acuerdo con los siguientes esquemas: Independientes entre s: Interfieren por compartir el procesador. Cooperan entren s: Uno genera una informacin o realiza algn servicio que el segundo necesita. Compiten entre s: Requieren usar recursos comunes en rgimen exclusivo. En el primer caso, entre los procesos no se requiere que exista ningn tipo de interrelacin. Si embargo, en el segundo y en el tercer caso, se necesita disponer de componentes que hagan posible establecer acciones de sincronizacin y de comunicacin entre los procesos.

Interaccin entre procesos de un programa concurrente


Interacciones entre procesos en programacin OO Dentro de la metodologa orientada a objetos, una aplicacin resulta de componer tres tipos de objetos: Objetos activos: Tienen capacidad de realizar actividades autnomas propias (son procesos con thread propio/llevan acabo acciones espontneas autnomas). Objetos neutros: Son objetos que prestan servicios a los objetos activos. Pueden ser usados simultneamente por los objetivos activos sin representar interaccin entre ellos (son libreras pasivas). Objetos pasivos: Son objetos que prestan servicios a los objetos activos. Cuando varios objetos activos tratan de hacer uso de l simultneamente arbitran el acceso de acuerdo con una estrategia propia (se pueden identificar con el concepto de servidor, se introducen los aspectos ms significativos de la programacin concurrente)

Interaccin entre procesos de un programa concurrente


Implementacin de objetos pasivos Los objetos pasivos se construyen en base a procesos internos que implementan su control: El thread de los mismos arbitran el acceso de los objetos activos. No requieren introducir nuevos componentes de programacin. Son poco eficientes ya que requieren mltiples cambios de contexto.

Los objetos pasivos se construyen a partir de componentes de sincronizacin pasivos (tales como semforos, seales, zonas de exclusin mutua, etc.): Requieren la definicin de nuevas primitivas de sincronizacin. Introduce mayor complejidad ya que utiliza componentes de muy diferentes niveles de abstraccin. Son muy eficientes.

Interaccin entre procesos de un programa concurrente


Problemas especficos de programacin concurrentes Actualizaciones concurrentes de variables compartidas: Cuando un proceso modifica una misma variable compartida que no es atmica, mientras que otro proceso concurrente la lee o escribe, el resultado que se obtiene no es seguro.

Sincronizacin en la ejecucin de tareas: La lgica de la aplicacin requiere que un proceso no pueda ejecutar una sentencia determinada hasta que otro proceso haya ejecutado una sentencia de la que depende.

Interaccin entre procesos de un programa concurrente


Actualizacin concurrente de variable "Control de parque pblico": Considrese un parque pblico que dispone de varias puertas de acceso. Cada una de las puertas del parque, est controlada por un torno independiente, que enva un evento propio a una aplicacin de computador que debe contarlas y proporcionar en cualquier instante el nmero total de visitantes dentro. Una solucin concurrente inicial: Los eventos que genera cada torno van a ser gestionados por un proceso independiente. Los procesos de control de los tornos se ejecutan de forma concurrente. En el programa existe una variable global entera cuenta" que representa el nmero el numero de visitantes que ha entrado en el parque.

Interaccin entre procesos de un programa concurrente


Descripcin de la aplicacin parque pblico Interaccin entre procesos Lgica del procedimiento main()

El diagrama de secuencias muestra las interacciones entre los tres objetos que constituyen la aplicacin, y el diagrama de actividad representa las actividades que genera la ejecucin del procedimiento main() que lanza la aplicacin (contienen una misma informacin):

Interaccin entre procesos de un programa concurrente


Descripcin de la aplicacin parque pblico Inicialmente la variable cuenta se inicializa a cero. Se crean y lanzan los dos procesos que gestionan cada uno de los totos. Por cada visitante del parque que llega por un torno el proceso que lo gestiona ejecuta la sentencia cuenta=cuenta+1 sobre una misma variable global. Cuando los procesos que gestionan los tornos terminan (por temporizacin: ha llegado la ora de cerrar; o por cuenta: el parque est lleno) se imprime el valor de la variable cuenta. El ejemplo presenta problemas porque dos procesos concurrentes actualizan de forma no segura la misma variable global cuenta.

Interaccin entre procesos de un programa concurrente


Cdigo de la aplicacin Parque Pblico program Control_parque; var Cuenta : integer; process Torno_1; var n: Integer; begin for n:=1 to 20 do Cuenta:=Cuenta +1; end; process Torno_2; var n: Integer; begin for n:=1 to 20 do Cuenta:=Cuenta +1; end; begin (* Cuerpo del programa principal Control_parque *) Cuenta:=0; cobegin Torno_1; Torno_2; coend; writeln (Total de visitantes: , Cuenta); end;.

Interaccin entre procesos de un programa concurrente


Actualizacin concurrente de una variable compartida (X1) Carga x en acumulador Proceso P Proceso Q (X2) Incrementa acumulador X= x+1 X= x+1 (X3) Almacena acumulador en x
x

Entrelazado de operaciones concurrentes que conduce a error. Valor inicial de x: x=4 (P1) P carga x en su acumulador AcP = 4 x=4 (Q1) Q carga x en su acumulador AcQ = 4 x=4 (Q2) Q incrementa su acumulado AcQ = 5 x=4 (P2) P incrementa su acumulador AcP = 5 x=4 (Q3) Q almacena el acumulador en x AcQ=5 x=5 (P3) P almacena el acumulador en x AcP = 5 x=5 El resultado es incorrecto ya que el resultado debera ser 6 y no 5.

Interaccin entre procesos de un programa concurrente


Sincronizacin: Problema productor-consumidor. Un productor y un consumidor N Productor Consumidor de un dato, lo intercambian a 1 travs de un buffer de capacidad Buffer limitada a N elementos. En este caso se requieren las dos siguientes condiciones de sincronizacin: e (produccin^i consumisin ^i) e (consumisin^i produccin ^(i+N)) En este caso, el problema difiere del problema de "actualizacin concurrente" en que solo uno de los procesos modifica la variable global, mientras que el otro se reduce a leerlo. Sin embargo, para que este proceso opere correctamente es necesario que entre productor y consumidor exista una sincronizacin para que el consumidor no lea el dato de buffer, antes de que el consumidor lo haya depositado.

Interaccin entre procesos de un programa concurrente


Ejemplo de cdigo de programa productor consumidor. program Productor_consumidor; var Buffer: integer; process Productor; process Consumidor; var Dato_entregado: Integer; var Dato_recibido: Integer; begin begin ..... .... Buffer:= Dato_Entregado; Dato_recibido:= Buffer; ..... .... end; end. begin cobegin Productor; Consumidor; coend; end.

Interaccin entre procesos de un programa concurrente


Necesidad de primitivas para programas concurrentes. Es posible superar los problemas sincronizacin y exclusin mutua de la programacin concurrente utilizando lenguajes de programacin secuenciales? La respuesta es si, pero solo de forma poco eficiente. Por ello todos los lenguajes de programacin concurrentes introducen primitivas especficas que permiten resolver los problemas de forma mas eficiente.

Interaccin entre procesos de un programa concurrente


Solucin de la exclusin mtua La solucin de Peterson (1981), presupone: Lecturas concurrentes de una variable son siempre correctas. Si dos procesos P y Q escriben una variable, una de las dos escrituras es correcta (la ltima que se hizo). Si un proceso escribe y otro lee concurrentemente una variable, se lee el valor escrito o el valor previo a la escritura, pero no una mezcla de ambos. Estas suposiciones son razonables para una variable atmica en un sistema monoprocesador. Esqueleto: repeat Protocolo_de_entrada; Seccin_crtica; Protocolo_de_salida Seccin_no_crtica; forever;

Interaccin entre procesos de un programa concurrente


Solucin de Peterson Var Flag1:Boolean:=False; (*P1 anuncia su intencin de entrar en SC*) Flag2: Boolean:= False; (* P2 anuncia su intencin de entrar en SC *) Proc:1..2; (* Procesador que tiene preferencia para acceder a S.C.*) process P1; process P2 begin begin repeat repeat Flag1 := True; Proc :=2; Flag2 := True; Proc :=1; while Flag2 and (Proc = 2) while Flag1 and (Proc = 1) do sleep(0); do sleep(0); (Seccin crtica) (Seccin crtica ) Flag1:= false; Flag2:= false; (Seccin no crtica ) (Seccin no crtica) forever; forever; end; end;

Interaccin entre procesos de un programa concurrente


Solucin de Peterson Se basa en utilizar dos variables booleanas Flag1 y Flag2 que anuncia la intencin de entrar en su zona crtica, y una variable Proc que puede tomar los valores 1..2 y que indica el procesador al que se da prioridad de acceso, y que solo es til cuando hay conflicto en el acceso a la zona crtica. Si solo un proceso desea entrar en la seccin crtica, el Flag contrario ser false y el acceso es inmediato con independencia del valor de Proc. Si ambos tratan de acceder y ambos Flag son true, solo entra la que indique Proc.

Interaccin entre procesos de un programa concurrente


Algoritmo bakery: Programa principal program ControlParquePublico (*Exclusin mutua-algoritmo bakery *) const nTornos=50; var ticket: array[1..nTornos] of integer; cogiendoTicket: array[1.nTornos] of boolean; cuenta, tornoID : integer; process type TipoTorno(id: integer) ....... end; (Def. en la sgt transp.) var torno: array[1..nTornos] of TipoTorno; begin cuenta:=0; (* se inicializa cuenta a 0 *) for tornoID=1 to nTornos do begin (* inicializa var. asociadas a c/torno*) ticket[tornoID]:=0; choosing[tornoID]:=false; end; cobegin (* Se ejecutan concurrentemente los procesos torno*) for tornoID:= 1 to nTornos do torno[tornoID](tornoID); coend; writeln(Total de clientes admitidos: , cuenta); end;

Interaccin entre procesos de un programa concurrente


Algoritmo bakery: Proceso TipoTorno (1)
process type TipoTorno (id: integer); var otroTorno, tornoID, cliente:integer; function max: integer; functionelegido(mio,otro:int):boolean;
(* Retorna el nmero del ticket *) (* Compara el ticket de los tornos otro y yo *)

var i, mayor:integer; begin mayor:=0; for i:=1 to nTornos do if ticket[i]>mayor then mayor:= ticket[i]; max:=mayor+1; end; begin .... end;

begin if(ticket[mio]=0)or(ticket[mio]>ticket[otro]) then elegido:=false; else if (ticket[mio]<ticket[otro]) then elegido:=true; else elegido=(mio<otro); end;

Interaccin entre procesos de un programa concurrente


Algoritmo bakery: Proceso TipoTorno (2) ... begin for cliente :=1 to 20 do begin (* Simula la entrada de 20 visitantes *) eligiendoTicket[id]:=true; (* Requiere un ticket *) ticket[id]:=max; eligiendoTicket[id]:=false; (* Espera a que ningn otro torno est accediendo *) for otroTorno:=1 to nTornos do begin (* Ninguno est cogiendo ticket *) while eligiendoTicket[otroTorno] do null; (* Ningn otro tiene un ticket mas preferente *) while elegido(otroTorno,id) do null; end; (* Incrementa la variable cuenta *) cuenta:=cuenta+1; ticket[id]:=0; (* Anula el ticket *) end; (* for cliente *) end; (* TipoTorno *)

Interaccin entre procesos de un programa concurrente


Algoritmo bakery Para el caso general de exclusin mutua, en el que hay que sincronizar a un nmero ilimitado de cliente, se han propuesto algunos algoritmos (Dijkstra 1968, Eisenberg and McGuire, 1972, etc.) En este ejemplo se muestra el algoritmo de bakery propuesto por Lamport, 1974. Un nmero arbitrario de tornos actualizan concurrentemente una variable cuenta, incrementndola en 1. El algoritmo se basa en que antes de actualizar la variable, el proceso cliente toma un ticket con un entero que es nico. El proceso no actualiza la variable si existe algn otro cliente con un nmero en el ticket inferior al suyo. Como la bsqueda del ticket puede fallar porque no es seguro, en el caso de que tengan igual nmero se decide por el valor del indentificador del proceso. Esto supone que el algoritmo no es imparcial, sino que favorece al que tiene identificadores mas bajos.

Interaccin entre procesos de un programa concurrente


Algoritmo bakery Significado de las variables definidas en el programa principal: nTornos: integer=50 Nmero de tornos que tiene el parque. ticket: Array que contiene el ticket que es establecido por cada proceso torno antes de realizar la actualizacin concurrente cogiendo: array de booleanos que se utilizan para proteger cada proceso mientras que coge el valor del tickets cuenta: Acumula el nmero de visitantes que ha tenido el parque. torno: Array de procesos tipo TipoTorno. Significado de las variables definidas en el proceso tipo torno 1: function max(): integer => Retorna el entero que corresponde al ticket, buscando el entero mas alto asignado a los ticket actualmente asignados. function elegido(otro,yo:integer): boolean => Retorna True si el torno de identificador yo tiene el ticket mas bajo que el identificado con otro.

Interaccin entre procesos de un programa concurrente


Algoritmo bakery Significado de las variables definidas en el proceso tipo torno 2: El loop simula la entrada de 20 visitante por el bucle. Para cada cliente: Elige un ticket Espera hasta que ningn otro torno est cogiendo un ticket Espera hasta que ningn otro torno tenga un ticket mas preferente que el propio Incrementa la cuenta Anula el ticket

Potrebbero piacerti anche