110 likes | 409 Views
PROGRAMACION CONCURRENTE. Los elementos que constituyen un programa concurrente son módulos independientes denominados tareas o procesos. La programación concurrente se encarga fundamentalmente de temas vinculados a la comunicación y sincronización de procesos.
E N D
PROGRAMACION CONCURRENTE Los elementos que constituyen un programa concurrente son módulos independientes denominados tareas o procesos. La programación concurrente se encarga fundamentalmente de temas vinculados a la comunicación y sincronización de procesos. La comunicación permite que los procesos cooperen entre sí en la ejecución de un objetivo global, en tanto que la sincronización permite que un proceso continúe su ejecución después de que un determinado evento ha ocurrido. La comunicación entre tareas o procesos se puede realizar básicamente de dos maneras: a) comunicación a través de un área común de memoria, o b) comunicación mediante el intercambio de mensajes. En el caso a) es necesario contar con mecanismos de sincronización para garantizar la consistencia de los datos almacenados como por ejemplo semáforos, monitores, etc. En el caso b) las variables son locales. Un mensaje al llegar a su destino sólo es entregado a su tarea cuando ésta lo requiere. Si lo requiere y aún no está disponible la tarea debe suspenderse y esperar la llegada del mensaje.
Un grafo de precedencia es un grafo sin ciclos donde cada nodo representa una única sentencia. Un arco que parte del nodo S1 hacia el S2 indica que S2 puede ser ejecutado sólo si S1 ha completado su ejecución. GRAFO DE NO PRECEDENCIA GRAFO DE PRECEDENCIA
Dos sentencias cualesquiera Si y Sj pueden ejecutarse concurrentemente produciendo el mismo resultado que si se ejecutaran secuencialmente sí y sólo sí se cumplen las siguientes condiciones: 1. R (Si) ¿ W (Sj) = (Ø). 2. W (Si) ¿ R (Sj) = (Ø). 3. W (Si) ¿ W (Sj) = (Ø). Estas condiciones se conocen con el nombre de Condiciones de Bernstein.
CORRUTINAS La transferencia de control es la instrucción RESUME. Este mecanismo implementa la sincronización entre tareas para un único procesador, luego sirven para un ambiente de multiprogramación, y no para el caso de procesamiento en paralelo, ya que este sistema permite la ejecución de una rutina a la vez. Las corrutinas mantienen su estado anterior de ejecución, esto es, los resultados o modificaciones realizados durante la última invocación permanecen para la próxima vez que se la utilice (debido a que cuentan con una memoria local que permanece).
INSTRUCCIONES FORK Y JOIN S1; count := 2; fork L1; - - - - - S2; go to L2; L1: S3; L2: join count; S4; - - - - - S1; fork L1; S2; - - - go to L2 L1: S3; L2: join; S4;
S1; cuenta = 3; fork L1; S2; S4; fork L2; S5; go to L3; L2 : S6; go to L3; L1: S3; L3: join cuenta; S7;
Instrucción Cobegin/Coend expresada mediante Fork/Join COBEGIN S1; S2; ..............; SN COEND cuenta = n; fork L2; fork L3; ... fork Ln; S1; go to Lj; L2: S2; go to Lj; ... ... Ln: Sn; Lj: join cuenta;