UNIDAD III

Programación Concurrente

Profesor Miguel Cantillana

INS240 – Lenguajes de Programación
Ingeniería en Computación e Informática
Semestre 2017-1

Conceptos de Programación Concurrente

Introducción

Conceptos Fundamentales

Definición: Se habla de concurrencia cuando ocurren varios sucesos de manera contemporánea.


En base a esto, la concurrencia en computación está asociada a la “ejecución” de varios procesos que coexisten temporalmente.

Programación Concurrente

Para definirla correctamente, debemos diferencias entre programa y proceso.


Programa: Conjunto de sentencias/instrucciones que se ejecutan secuencialmente. Se asemeja al concepto de clase dentro de la POO. Es por tanto un concepto estático.


Proceso: Básicamente, se puede definir como un programa en ejecución. Líneas de código en ejecución de manera dinámica. Se asemeja al concepto de objeto en POO.

Concurrencia

La concurrencia aparece cuando dos o más procesos son contemporáneos. Un caso particular es el paralelismo (programación paralela).

Concurrencia (ii)

Los procesos pueden “competir” o colaborar entre sí por los recursos del sistema. Por tanto, existen tareas de colaboración y sincronización.


La programación concurrente se encarga del estudio de las nociones de ejecución concurrente, así como sus problemas de comunicación y sincronización.

¿Cuales son sus beneficios?

  • Velocidad de ejecución. Al subdividir un programa en procesos, éstos se pueden “repartir” entre procesadores o gestionar en un único procesador según importancia.
  • Solución a problemas de esta naturaleza. Existen algunos problemas cuya solución es más fácil utilizando esta metodología.
    • Sistemas de control: Captura de datos, análisis y actuación (p.ej. sistemas de tiempo real).
    • Tecnologías web: Servidores web que son capaces de atender varias peticiones concurrentemente, servidores de chat, email, etc.
    • Aplicaciones basabas en GUI: El usuario hace varias peticiones  a la aplicación gráfica (p.ej. Navegador web).

¿Cuales son sus beneficios?

Conceptos

  • El concepto fundamental de la programación concurrente es la noción de Proceso.
  • Proceso: Cálculo secuencial con su propio flujo de control.
  • La concurrencia en software implica la existencia de diversos flujos de control en un mismo programa colaborando para resolver un problema.

Procesos vs. Hilos

  • En el contexto del Sistema Operativo, un Proceso es una instancia de un Programa que está siendo ejecutado en el ordenador.

      Proceso = Código de programa + Datos + Recursos

  • Un S.O. admite concurrencia si es capaz de manejar diversos procesos simultáneamente.
  • En el contexto de un Programa concurrente, un Hilo (Thread) es cada uno de los flujos secuenciales de control independientes especificados en el programa.

Procesos Secuenciales

Un proceso tradicional, correspondiente a un programa
secuencial, es un proceso que posee un único hilo de control.

Procesos Concurrentes

Un programa concurrente da lugar, durante su ejecución, a un proceso con varios hilos de ejecución.

Concurrencia Software vs. Paralelismo Hardware

La concurrencia software es un concepto lógico, no implica la existencia de paralelismo en el hardware:

 

  • Las operaciones hardware ocurren en paralelo si ocurren al mismo tiempo.
  • Las operaciones (software) en un programa son concurrentes si pueden ejecutarse en paralelo, aunque no necesariamente deben ejecutarse así.

Tipos de concurrencia

  • Concurrencia Física: Existe más de un procesador y varias unidades (hilos) de un mismo programa se ejecutan realmente de forma simultánea.
  • Concurrencia Lógica: Asumir la existencia de varios procesadores, aunque no existan físicamente. El implementador de tareas del lenguaje se encargará de “mapear” la concurrencia lógica sobre el hardware realmente disponible.
  • La concurrencia lógica es más general, pues el diseño del programa no está condicionado por los recursos de computación disponibles.

 

 

Arquitecturas Multiprocesador: Revisión histórica

  • Años 50: Primeras máquinas con varios procesadores
    • Un procesador de propósito general y varios procesadores para controlar la E/S.
    • Permitían ejecutar un programa mientras se realizaba E o S para otros programas.
    • No se puede hablar de ejecución concurrente de programas
  • Años 60 (inicio): Primeras multiproc. reales
    • El programador de tareas del SO distribuía programas entre los procesadores a partir de una cola de trabajos.
    • Permitían concurrencia a nivel de programas.

Arquitecturas Multiprocesador (2)

  • Años 60 (mitad): Ordenadores con hardware específico
    múltiple
    :
    • Estas unidades ejecutan instrucciones procedentes de un único flujo de instrucciones (programa).
    • Los compiladores determinaban qué instrucciones podían ejecutarse concurrentemente.

Arquitecturas Multiprocesador: Categorías

  • SIMD (Single Instruction Múltiple Data):
    • Pueden ejecutar simultáneamente la misma instrucción sobre diferentes conjuntos de datos.
    • Cada procesador tiene su propia memoria local.
    • Hay un procesador que controla el trabajo del resto.
    • Como se ejecuta la misma instrucción no es preciso ningún tipo de sincronización entre tareas.
    • Máquinas típicas: los procesadores vectoriales
      • Específicas para trabajar con datos almacenados en arrays.
      • Aplicación en cálculo científico.

SIMD

Arquitecturas Multiprocesador: Categorías (2)

  • MIMD (Multiple Instruction Multiple Data)
    • Cada procesador ejecuta su propio flujo de instrucciones.
    • Es preciso poder sincronizar tareas.
    • Dos tipos de configuración:
      • Memoria compartida.
      • Memoria distribuida.
    • Hay que sincronizar el acceso a los datos.
    • Soportan concurrencia a nivel de hilos dentro del programa.

MIMD

Concurrencia en un Programa

  • Desde el punto de vista de la programación, interesa la

concurrencia lógica que puede existir en el interior de un programa.

  • Un Lenguaje de Programación será concurrente si posee las estructuras necesarias para definir y manejar diferentes tareas (hilos de ejecución) dentro de un programa. Ejemplos: Java, Ada
  • El compilador y el SO serán los responsables de “mapear” la concurrencia lógica del programa sobre el hardware disponible.

Sincronización de tareas

  • La Sincronización es el mecanismo que controla el orden en que se ejecutan las tareas.
  • Tipos de Sincronización:
    • Cooperación:La tarea A debe de esperar que la tarea B finalice alguna actividad para poder continuar con su ejecución.
    • Competición: La tarea A necesita acceder a un dato x mientras la tarea B está accediendo al mismo. La tarea A debe de esperar a que la tarea B finalice su uso de x para poder continuar

Necesidad de Sincronización 

  • Ejemplo de Competición:
    • Sea un dato TOTAL que inicialmente tiene el valor 3
      • La tarea A realiza: TOTAL++;
      • La tarea B realiza: TOTAL *= 2;
    • Cada tarea completa su operación sobre TOTAL realizando los siguientes pasos:
      • Recuperar el valor de TOTAL
      • Realizar una operación aritmética
      • Almacenar el nuevo valor de TOTAL

Sincronización para Competición

  • Si no existe sincronización entre las tareas A y B, se pueden dar cuatro resultados diferentes (TOTAL = 3):
    • Correctos:
      • La tarea A completa su operación antes de que empiece B: Resultado final, TOTAL = 8
      • La tarea B completa su operación antes de que empiece A: Resultado final, TOTAL = 7
    • Incorrectos:
      • Las tareas A y B recuperan el valor de TOTAL sin que ninguna haya llegado a almacenar el nuevo valor:
        • Resultado final, TOTAL = 6. Si la última en finalizar es B.
        • Resultado final, TOTAL = 4. Si la última en finalizar es A.

Sincronización (Ejemplo)

Sincronización
(Ejemplo: A antes que B)

Sincronización
(Ejemplo: A antes que B)

Sincronización
(Ejemplo: A antes que B)

Sincronización

(Ejemplo: A antes que B)

Sincronización

(Ejemplo: A antes que B)

Sincronización

(Ejemplo: A antes que B)

Sincronización
(Ejemplo: B interfiere con A )

Sincronización
(Ejemplo: B interfiere con A )

Sincronización
(Ejemplo: B interfiere con A )

Sincronización
(Ejemplo: B interfiere con A )

Sincronización
(Ejemplo: B interfiere con A )

Sincronización
(Ejemplo: B interfiere con A )

Sincronización
(Ejemplo: B interfiere con A )

Sincronización para Competición (ejemplo)

Diseño de lenguajes Concurrentes

Los principales conceptos que debe incorporar un lenguaje de programación que soporte Concurrencia son:

  • ¿Cómo se soporta la sincronización para Cooperación?
  • ¿Cómo se soporta la sincronización para Competición?
  • ¿Cómo y cuándo se inicia y finaliza la ejecución de tareas?
  • ¿Las tareas se crean estática o dinámicamente?

Concurrencia en Python

UNAB: LP10

By Miguel Cantillana

UNAB: LP10

Clase 10

  • 590