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
- Sea un dato TOTAL que inicialmente tiene el valor 3
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.
- Las tareas A y B recuperan el valor de TOTAL sin que ninguna haya llegado a almacenar el nuevo valor:
-
Correctos:
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