No es un bug, es una característica no documentada

13/10/15

Procesos y servicios. Programación concurrente

Recordemos dos definiciones antes de seguir con la programación concurrente.

Programa. Conjunto de instrucciones que se aplican a un conjunto de datos de entrada para obtener una salida.
Proceso. Un programa en ejecución. La actividad asíncrona susceptible de ser asignada a un procesador. Una unidad de actividad que se caracteriza por la ejecución de una secuencia de instrucciones, un estado actual y un conjunto de recursos del sistema asociados.

Ahora ya sí, podemos avanzar con este concepto.

¿Qué es la programación concurrente?

Es la existencia simultánea de varios procesos en ejecución. Es la disciplina que se encarga del estudio de las notaciones que permiten especificar la ejecución concurrente de las acciones de un programa, así como las técnicas para resolver los problemas inherentes a la ejecución concurrente (comunicación y sincronización).

Beneficios

è Mejor aprovechamiento de la CPU. Un proceso puede aprovechar ciclos de CPU mientras otro realiza una operación de entrada / salida.
è Velocidad de ejecución. Al subdividir un programa en procesos, estos se pueden “repartir” entre procesadores o gestionar en un único procesador según importancia.
è Solución a problemas de naturaleza concurrente. Existen algunos problemas cuya solución es más fácil utilizando esta metodología.
·         Sistemas de control. Son sistemas en los que hay captura de datos, normalmente a través de sensores, análisis y actuación en función del análisis. Un ejemplo son los sistemas en tiempo real
·         Tecnologías web. Los servidores web son capaces de atender múltiples peticiones de usuarios concurrentemente, también los servidores de chat, correo, los propios navegadores web, etc.
·         Aplicaciones basadas en GUI. El usuario puede interactuar con la aplicación mientras la aplicación está realizando otra tarea. Por ejemplo el navegador web puede estar descargando un archivo mientras el usuario navega por las páginas.
·         Simulación. Programas que modelan sistemas físicos con autonomía.
·         Sistemas gestores de bases de datos. Los usuarios interactúan con el sistema, cada usuario puede ser visto como un proceso.

Problemas inherentes

è Exclusión mutua. En programación concurrente es muy típico que varios procesos accedan a la vez  a una variable compartida para actualizarla. Esto se debe evitar, ya que puede producir inconsistencia de datos. Uno puede estar actualizando la variable a la vez que otro la puede estar leyendo. Por ello es necesario conseguir la exclusión mutua de los procesos respecto a la variable compartida. Para ello se propuso la región crítica.
Cuando dos p más procesos comparten una variable, el acceso a dicha variable debe efectuarse siempre dentro de una región crítica asociada a la variable. Solo uno de los procesos podrá acceder para actualizarla y los demás deberán esperar. El tiempo de estancia es finito.
Ejemplo:

int var = 7;
while(var <= 100){
     printf(“%i”, var);
     var++;
}

Si mientras sale ese proceso entra otro y aumentar var en 71 (es un decir), el primer proceso ya no se llegará a ejecutar 93 veces, porque la variable ha sido alterada por otro proceso. Este trozo de código es la región crítica.
è Condición de sincronización. Hace referencia a la necesidad de coordinar los procesos con el fin de sincronizar sus actividades. Puede ocurrir que un proceso P1 llegue a un estado X que no pueda continuar su ejecución hasta que otro proceso P2 haya llegado a un estado Y de su ejecución. La programación concurrente proporciona mecanismos para bloquear procesos a la espera de que ocurra un evento y para desbloquearlos cuando este ocurra.

Además, dentro de la programación concurrente tenemos otro tipo de programación.

Programación paralela


¿Qué es la programación paralela?

El procesamiento paralelo permite que muchos elementos de procesos independientes trabajen simultáneamente para resolver un problema. Estos elementos pueden ser un número arbitrario de equipos conectados por una red, un único equipo con varios procesadores o una combinación de ambos.

Ventajas

è Proporciona ejecución simultánea de tareas.
è Disminuye el tiempo total de ejecución de una aplicación.
è Resolución de problemas complejos y de grandes dimensiones.
è Utilización de recursos no locales, por ejemplo los recursos que están en una red distribuida, una WAN o la propia red Internet.
è Disminución de costos, en vez de gastar en un supercomputador muy caro se pueden utilizar otros recursos más baratos disponibles remotamente.

Inconvenientes

è Los compiladores y entornos de programación para sistemas paralelos son más difíciles de desarrollar.
è Los programas paralelos son más difíciles de escribir.
è El consumo de energía de los elementos que forman el sistema.
è Mayor complejidad en el acceso a los datos.
è La comunicación y la sincronización entre diferentes subtareas.

Asimismo también dentro de la programación paralela tenemos otro tipo de programación.

Programación distribuida


Un sistema distribuido es aquel en el que los componentes hardware o software, localizaos en computadores unidos mediante una red, comunican y coordinan sus acciones mediante el paso de mensajes.

Consecuencias

è Concurrencia. Lo normal en una red de ordenadores es la ejecución de programas concurrentes.
è Inexistencia de reloj global. Cuando los programas necesitan cooperar coordinan sus acciones mediante el paso de mensajes.
è Fallos independientes. Cada componente del sistema puede fallar independientemente, permitiendo que los demás continúen su ejecución.

Modelos de programación para la comunicación

è Sockets. Proporcionan los puntos externos para la comunicación entre procesos. Es actualmente la base de la comunicación. Pero al ser de muy bajo nivel de abstracción, son adecuados a nivel de aplicación. Posteriormente veremos su tratamiento en Java.
è Llamada de procedimientos remotos o RPC (Remote Procedure Call). Permite a un programa cliente llamar a un procedimiento de otro programa en ejecución en un proceso servidor. El proceso servidor define en su interfaz de servicio los procedimientos disponibles para ser llamados remotamente.
è Invocación remota de objetos. El modelo de programación basado en objetos ha sido extendido para permitir que los objetos de diferentes procesos se comuniquen uno con otro por medio de una invocación a un método remoto o RMI (Remote Method Invocation). Un objeto que vive en un proceso puede invocar métodos de un objeto que reside en otros procesos. Java RMI extiende el modelo de objetos de Java para proporcionar soporte de objetos distribuidos en lenguaje Java (si quieremos un intermediario entre servidor – cliente independientemente del lenguaje del objeto, usaremos CORBA).

Ventajas

è Se puede compartir recursos y datos
è Capacidad de crecimiento incremental
è Mayor flexibilidad al poderse distribuir la carga de trabajo entre diferentes ordenadores.
è Alta disponibilidad
è Soporte de aplicaciones inherentemente distribuidas
è Carácter abierto y heterogéneo.

Inconvenientes

è Aumento de la complejidad, se necesita un nuevo tipo de software.
è Problemas con las redes de comunicación: pérdida de mensajes, saturación del tráfico.
è Problemas de seguridad como por ejemplo ataques de denegación de servicio en la que se bombardea un servicio con peticiones inútiles de forma que un usuario interesado en usarlo no pueda emplearlo.



2 comentarios: