Tema 1: Principios generales de la Concurrencia

Definición

Se da cuando cuando dos o más procesos existen simultáneamente. Distinguir entre existencia y ejecución simultánea (paralelismo).

Un proceso es un programa en ejecución. Formado por:

  • El código que ejecuta el procesador.
  • El estado, valores de los registros de la CPU.
  • La pila de llamadas.
  • La memoria de trabajo.
  • Información de la planificación.

Una hebra/hilo es una secuencia de instrucciones dentro de un proceso, que ejecuta sus instrucciones de forma independiente.

Un proceso puede tener varias hebras.

Estas hebras NO comparten:

  • La pila (cada una posee la suya).
  • El contador de programa.

SI comparten:

  • Memoria de procesos (datos).
  • Recursos del sistema.

Concurrencia vs. Paralelismo

La concurrencia es más general que el paralelismo. Las soluciones que la P.Concurrente da para la sincronización y comunicación son válidas para programas paralelos con memoria común.

Se tiene paralelismo cuando se produce la ejecución simultánea de dos procesos concurrentes.

  • Algoritmos paralelos.
  • Métodos de programación paralela.
  • Procesamiento paralelo.
  • Arquitectura paralela (procesador multinúcleo).

La concurrencia se encuentra presente en el hardware, en el SO y el software, y en la modelación de casos reales mediante programas.

Sistema concurrente

Sistema informático donde la concurrencia juega un papel importante.

Distinguir entre sistemas inherentemente(deben ser concurrentes si o si) concurrente y potencialmente(pueden ser concurrentes).

Programación concurrente

Conjunto de notaciones y técnicas utilizadas para describir mediante programas el paralelismo potencial de los problemas, resolviendo los problemas de sincronización y comunicación que pueden plantearse.

Características

  • Mejora de rendimiento
  • Indeterminación, un programa secuencial es determinista y sigue un orden total. Frente a un programa concurrente, que no es determinista , siguiendo un orden parcial. No significa que el programa sea incorrecto.
  • No atomicidad.
  • Velocidad de ejecución de procesos desconocida.
  • Incertidumbre sobre el resultado.
  • Entrelazado, un programa concurrente puede tener varias secuencias de ejecución diferentes. Puede haber entrelazados patológicos que lleven a interbloqueos.
  • Mayor dificultad de verificación de programas.

Speedup

En paralelismo, podemos definir el concepto de speedup como el coeficiente entre el tiempo necesario para completar una tarea secuencialmente y el tiempo necesario para hacerlo en paralelo. (Diferencia entre tiempos ya sea concurrente o paralelo).

\(S=\frac{tiempo\ en\ secuencial}{tiempo\ en\ paralelo}\)

Clasificación del speedup

  1. Si \(S < 1\), la paralelización ha hecho que la solución empeore. En este caso mejor no paralelizar.
  2. Si \(1 < S \leq número\ de\ nucleos\), hemos conseguido mejorar la solución en el rango normal. En tareas puramente de cómputo (coef. de bloqueo muy cercano al 0), S debe estar muy próximo al número de nucleos.
  3. Si \(S > número\ de\ nucleos\), hemos conseguido una mejor hiperlineal. Son casos poco comunes y solo se dan para determinados problemas en determinadas arquitecturas de memoria caché.

Condiciones de Bernstein

Permiten determinar si dos conjuntos de instrucciones se pueden ejecutar de forma concurrente.

\(L(S_k) =\) conjunto de lectura, del conjunto de instrucciones \(S_k\).

\(E(S_k) =\) conjunto de escritura, del conjunto de instrucciones \(S_k\).

Dos conjuntos de instrucciones \(S_i\) y \(S_j\) se pueden ejecutar de forma concurrente si:

  • \(L(S_i)\cap E(S_j) = \emptyset \)
  • \(E(S_i)\cap L(S_j) = \emptyset \)
  • \(E(S_i)\cap E(S_j) = \emptyset \)

Interbloqueo

Situación en la que todos los procesos quedan a la espera de una situación que nunca se dará.

Hipótesis de progreso finito

  • No se puede hacer ninguna suposición acerca de las velocidades absolutas o relativas de ejecución de los procesos o hebras, excepto que es mayor que 0
  • Un programa concurrente se entiende en base a sus componentes (procesos o hebras) y sus interacciones, sin considerar el entorno de ejecución.

Problemas de la concurrencia

Condiciones de concurso

Aparecen cuando varias entidades concurrentes comparten recursos comunes accediendo a ellos simultáneamente. Pueden llevar a problemas graves como sobreescritura de datos, interbloqueos, etc.

Son propias de los sistemas concurrentes. Se caracterizan, a nivel de programación, las zonas de código desde las que las entidades concurrentes acceden a recursos comunes se denominan secciones críticas.

Dado el indeterminismo de los programas concurrentes, la única forma de evitar una condición de concurso será forzar la ejecución aislada de cada sección crítica.

Exclusión mutua

Consiste en evitar la condición de concurso sobre un recurso compartido forzando la ejecución atómica de las secciones críticas de las entidades concurrentes que lo usan. Elimina el entrelazado.

Esto implica detener la ejecución de una entidad concurrente hasta que se produzcan determinadas circustancias: sincronización.

También implica el poder comunicar a otras entidades el estado de una dada: comunicación.

Los lenguajes concurrentes deben permitir ambas.

Beneficios de la exclusión mutua

Dentro de las secciones críticas, no hay entrelazado. Se incrementa el determinismo, ya que se garantiza la ejecución secuencial ("atomicidad"), de las secciones críticas. Permite comunicar a los procesos a través de las secciones críticas. Acota a nivel de código las secciones críticas mediante el uso de protocolos de E/S de las mismas. Pueden generar sobrecargas de ejecución.

Código - precondición - sección crítica - postcondición.

Corrección de Sistemas Concurrentes

Propiedades de corrección

  • De seguridad:

    • Exclusión mutua de las secciones críticas.
    • No existen interbloqueos (deadblock).
  • De vivacidad:

    • No existen interbloqueos activos (liveblock).
    • No existen inanición de procesos.

Especificación y verificación formal de sistemas concurrentes.

  • Lógica temporal, CSP (Hoare), redes de Petri.
  • Metodología gráfica de representación.
  • Admite modelado dinámico de sistemas concurrentes.
  • Permite una verificación matemáticamente sencillas de las propiedades de corrección de un sistema concurrente.

Lenguajes concurrentes

Se consideran lenguajes concurrentes a aquellos que permiten expresar la concurrencia directamente, no siendo necesario el recurso el SO o de bibliotecas específicas.

Incluyen herramientas para sincronizar y comunicar a entidades concurrentes. Ej: C++11, Java.

Técnicas de creación de entidades concurrentes

Manuales:

  • Accediendo directamente al hardware.
  • Usando bibliotecas software (como herencia de la clase Thread, o implementación de la clase Runnable, Java).

Automáticas:

  • Bajo la responsabilidad del SO.
  • Detección del compilador de la concurrencia implícita en un programa secuencial y generación automática de los procesos concurrentes que corresponden.

Modelos de creación de entidades concurrentes

Estático

El número de procesos concurrentes se fijan en tiempo de compilación. No es un método flexible, es seguro, eficaz y limitado.

Dinámico (estándar actual)

Los procesos se crean y destruyen en tiempo de ejecución, es un método flexible, pero menos seguro que el estático. Es usado por los sistemas Unix o Java. Menos estructurado y más dificil de interpretar.

Consideraciones sobre el hardware

Sistemas mono procesador

Son modelos de concurrencia simulado, existe entrelazado entre instrucciones, tiene una arquitectura de memoria común, existe planificación en el acceso al procesador.

Sistemas multiprocesador

  • Fuerte acoplamiento. (Multiprocesadores)
    • Arquitectura de memoria común (UMA)
    • Soluciones propuestas para monoprocesadores admisibles
    • Existe planificación en el acceso a los núcleos
  • Acoplamiento débil. (Sistemas distribuidos)
    • Arquitectura de comunicaciones
    • Memoria no común (NUMA)
    • Necesidad de soluciones ad-hoc

Taxonomía de Flynn

  • SISD
    • Ejecución determinista, antiguo modelo de computación
  • SIMD
    • Ejecución determinista y síncrona (con cerrojos). Muy útil en nubes de datos reticulados.
  • MIMD
    • Ejecución determista/no determinista y síncrona/asíncrona. Multiprocesadores, clusters, multicores... Computadoras actuales.

Implementación de programas distribuidos

Modelo de paso de mensajes

Primitivas de comunicación send/receive, carácter de las primitivas, protocolos de solicitud/respuesta de pocas capas.

Modelo RPC/RMI

Permite al programador invocar procedimientos remotos de forma (idealmente) transparente. Requiere procedimientos de resguardos (stubs).

Modelo de Objetos distribuidos

DCOM (Microsoft), CORBA (OMG), EJB (Sun).

Sistemas de tiempo real

Son sistemas concurrentes caracterizados por la existencia de una ligadura temporal para completar la tarea. Control robótico, teledirección, telemedicina, multimedia...

El programador tiene acceso al reloj y al planificador, pueden ser:

  • Críticos, las tareas deben, necesariamente, satisfacer las restricciones impuestas por la ligadura temporal.
  • No críticos, las tareas intentan satisfacer tales restricciones, pero el diseño no garantiza la consecución de las mismas con total garantía.

Linux RT y JRTS.

Características: predectibilidad, determinismo, certidumbre, control.