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.
Excelente artículo. Gracias
ResponderEliminarGracias a ti por comentar
Eliminar