Paradigmas de programación, concurrencia y coordinación

Enviado por Programa Chuletas y clasificado en Informática y Telecomunicaciones

Escrito el en español con un tamaño de 8,53 KB

Paradigmas de programación

1. Paradigma: es un conjunto de características comunes a varios lenguajes o que diferencian un cierto lenguaje de los demás. Una metodología no es un paradigma. Utilidad:

  • Establecer clasificaciones: Ayuda a comprender la evolución, relaciones y características de los lenguajes de programación.
  • Describir lenguajes: En base a los paradigmas que cumplen.
  • Seleccionar el lenguaje para utilizar en un desarrollo: Basándose en las necesidades del proyecto enunciadas como paradigmas.
  • Establecer características de un nuevo lenguaje: Planificar sus características para que se ajuste a lo deseado.

Niveles de cumplimiento:

  • Obligatorio (siempre): Será imposible no seguir el paradigma porque no hay construcciones en el lenguaje que permitan salir de la norma que define el paradigma.
  • Soportado (Fácil): Cuando es la recomendación más común para el lenguaje, cuando la programación habitual lo sigue e incluso resulta complejo y difícil no cumplir el paradigma.
  • Permitido (difícil): Es programar siguiendo el paradigma, pero no es sencillo o cómodo porque el lenguaje no favorece su utilización.
  • No permitido (imposible): Un PdP no puede ser utilizado o conseguido con este lenguaje porque las construcciones del mismo no lo permiten.

Características de los Pdp:

Se agrupan en subconjuntos:

-Según su clasificación:

  • Paradigmas generales: Establecen una partición sobre el total de los lenguajes de programación. No cumplir el paradigma tiene relevancia. Ej estructurado/No estructurado.
  • Paradigmas complementarios: Pares de paradigmas con la particularidad de que no cumplir uno implica cumplir el otro. Ej: Paradigma imperativo y paradigma declarativo.
  • Paradigmas específicos: Establecen una partición que afecta a todos los lenguajes. No cumplir el paradigma no tendrá relevancia para la caracterización de un lenguaje. Ej: Programación en tiempo real.

-Según su evolución:

  • Primera línea evolutiva, el control de la memoria. Ej imperativo -> Declarativo.
  • Segunda línea evolutiva, la estructura del código.
  • Tercera línea evolutiva, número de tareas a la vez.

-Según relación con el Hw: Podemos clasificar los paradigmas en función en su distancia al Hw.



Concurrencia

2. Concurrencia: Notaciones y técnicas usadas para expresar en programas la posibilidad potencial de ejecución simultánea de varios algoritmos y resolver los problemas de sincronización y comunicación derivados de realizar dicha implementación.

  • Optimizar el uso de algunos recursos (CPU más rápida que las unidades E/S)
  • Realizar un reparto más justo de los recursos (Un programa no tendrá que esperar a otro para comenzar)
  • Simplificar el desarrollo (Un programa que se puede dividir en tareas que cooperan, es más sencillo de codificar)

Beneficios de los hilos:

  • Aprovecha múltiples CPU (Mayor rendimiento)
  • Mejora el rendimiento incluso en sistemas con una sola CPU
  • Simplifica el modelado de los programas
  • Permite atender varias solicitudes simultáneas con un solo programa activo
  • Facilita la gestión de eventos asíncronos.

Riesgos de hilos:

  • Seguridad: El acceso simultáneo a elementos compartidos puede ocasionar inconsistencia por condiciones de carrera. Se evita garantizando el acceso a variables en exclusión mutua (synchronized).
  • Interbloqueo: Si hay varios recursos y varios hilos que las necesiten.
  • Inanición (starvation): Cuando un hilo entra en un estado en el cual es permanente, incapaz de progresar.
  • Escaso rendimiento: Un sistema mal diseñado puede tener mayor coste en concurrencia.

HW y SO: Niveles de implementación

Nivel de operación (CPU-Hardware): Procesamiento simultáneo de varios bits por operaciones aritméticas y lógicas dentro del procesador. Duplicidad de los componentes.

Nivel de instrucción (CPU-Hardware): Ejecución simultánea de varias instrucciones gracias a varios procesadores o un procesador diseñado para ejecutar varias iteraciones. (Pipelining)

Nivel de programa (Cooperación-software): Realización simultánea de varias subtareas. Existencia de un software adecuado para la concurrencia.

Nivel de aplicaciones (Competencia-Software): Ejecución simultánea de varios programas.

Hardware concurrente:

SISD: 1CU+1ALU capaz de ejecutar una instrucción por vez y esta aplicada sobre un dato único

SIMD: 1CU+nALUs Capaz de ejecutar una instrucción sobre un gran número de datos.

MISD: Secuencia de datos se transmite a una línea de procesadores, cada uno controlado por CU propia.

MIMD: n CU + n ALUs Varios procesadores. HW realmente concurrente: Ejecución simultánea de varias instrucciones con diferentes datos.

  • Monoprocesador: concurrencia simulada que mejora el rendimiento del conjunto
  • Multiprocesador: los procesadores comparten una memoria común. Los procesos se ejecutan en concurrencia física. El programa concurrente se ejecuta más eficientemente.
  • Multicomputador: cada procesador tiene una memoria local. Los procesos se ejecutan con concurrencia física.
  • Distribuido: cada computador es independiente del resto. Se comunican a través de LAN o WAN.

Proceso vs Hilo: Los procesos son entidades independientes para el SO, tienen su propia memoria, código y montículo. Los hilos comparten memoria, código y montículo. Lo único que no comparten es el puntero de instrucción.

Redes petri: Son una herramienta de modelado muy efectiva para la representación y el análisis de procesos concurrentes. Las redes son grafos orientados con dos clases de nodos (Lugares y transiciones). Extensiones:

-Red de Petri Temporizada: introduce el tiempo, para modelar el comportamiento de los sistemas dinámicos.

-Red de Petri Estocástica: especifica el comportamiento temporal con variables aleatorias exponenciales.

-Red de Petri Coloreada (CPN): permite modelar sistemas concurrentes descritos mediante flujos de datos.



Coordinación

3. Coordinación: Conjunto de secuencias ejecutadas simultáneamente que cooperan para un objetivo común. Es la clave para un programa concurrente. Se consigue usando variables compartidas.

-Dos modelos puros:

  • Comunicación: Intercambio de datos en variables compartidas sin controles.
  • Sincronización: Detención y reanudación de procesos y su relación temporal.

-Un modelo mixto:

  • Comunicación Sincronizada: Intercambio de información con control del momento en que se realiza para asegurar su integridad.

Exclusión mutua: Permite el acceso a un solo hilo a la vez. Es utilizada con (synchronized) para conseguir la entrada ordenada de los hilos.

Condición de carrera: Cuando varios hilos compiten por acceder al procesador o a las variables compartidas y su resultado depende del orden de ejecución de los hilos.

Sección crítica (SC): Fragmento de código donde la corrección de un programa se ve comprometida por el uso de variables compartidas. La solución es asegurar la ejecución en exclusión mutua de toda SC sobre una misma variable compartida.

Locks: Nos permiten acceder a un recurso (SC) en exclusión mutua.

  • Explícitos: Las operaciones de "Poner" (Lock) y "quitar" (Unlock) el cerrojo se indican expresamente. Se definen con ReentrantLock
  • Implícitos: Las operaciones son intrínsecas. Cláusula synchronized.

Condition: Se usa para resolver problemas de comunicación. Un objeto condition está ligado a un objeto Lock. Se puede crear un condition invocando el método newCondition() sobre un objeto Lock.

Thread-safe: El concepto thread-safe se refiere cuando el comportamiento de un programa no se ve interferido o modificado por otros hilos de forma concurrente gracias al uso de la exclusión mutua sobre variables compartidas para resolver problemas de condiciones de carrera.

public class Suma extends Thread{

private int numero;

public synchronized int getNumero(){

return numero++;

}

}

Entradas relacionadas: