PROGRAMA CONCURRENTE.
Un programa concurrente es un
programa que tiene mas de una linea logica de ejecucion, es decir, es un
programa que parece que varias partes del mismo se ejecutan simultaneamente. Un
ejemplo de de esto es un programa que realice
determinada funcion y, simultaneamente, exponga datos en la pantalla. Un
programa concurrente puede correr en varios procesadores simultaneamente o no.
Esta importancia de la concurrencia es especialmente destacable en sistemas
operatives como Linux, que ademas de concurrentes, presentan unos mecanismos de
concurrencia estables.
El concepto fundamental de la
programacion concurrente es la nocion de proceso. El termino proceso fue
utilizado por primera vez por los diseñadores del sistema Multics en los años
60’s. Desde entonces, el termino proceso, utilizado a veces como sinonimo de
tarea, ha tenido muchas definiciones. A continuacion se presentan algunas:
Un programa en ejecucion.
Aunque se han dado muchas otras
definiciones, no hay una definicion universalmente aceptada, pero el concepto
de “Programa en ejecucion” parece ser el que se utiliza con mas frecuencia. Un
programa es una entidad inanimada; solo cuando un procesador le “infunde vida”
se convierte en la entidad “activa” que se denomina proceso.
Un proceso pasa por una serie de
datos discretos. Se dice que un proceso se esta ejecutando (estado de
ejecucion), si tiene asignada la CPU. Se dice que un proceso esta listo(estado
listo) si pudiera utilizar la CPU en caso de haber una disponible. Un proceso
esta bloqueado (estado bloqueado) si se esta esperando que suceda algun evento
antes de poder seguir la ejecucion.


BLOQUEADO
DESPACHAR EXPIRACION
DE
TIEMPO


DESPERTAR
Los procesos secuenciales se han
usado tradicionalmente para estudiar la concurrencia. ADA, es un lenguaje que
maneja procesos secuenciales.
Tanto sistemas paralelos como distribuidos
son concurrentes; pero un sistema concurrente puede ser no paralelo ni
distribuido, como acontece, por ejemplo, con los sistemas operatives
monoprocesadores y multitarea, que son concurrentes pero no son paralelos ni
distribuidos.
Como ya se menciono los procesos
son concurrentes si existen simultanemente. La concurrencia es el punto clave
de la Multiprogramacion, el Multiproceso y el Proceso distribuido y fundamental
para el diseño de sistemas operativos. La concurrencia comprende un gran numero
de cuestiones diseño, incluyendo la comunicacion entre procesos, comparticion y
competencia por lo recursos, sincronizacion de la ejecucion de varios procesos
y asignacion del tiempo de procesador a los procesos.
La concurrencia puede presentarse
en tres contextos diferentes:
Principios Generales de la concurrencia
En un sistema multiprogramado con
un unico procesador, los procesos se intercalan en el tiempo para dar la apariencia de ejecucion
simultanea
En un sistema con varios procesadores, no solo es posible
intercalar los procesos, sino tambien superponerlos. La intercalacion y la
superposicion representan formas de ejecucion muy diferentes. Ambas tecnicas
pueden contemplarse como ejemplos de proceso concurrente y ambas plantean los
mismos problemas. En el caso de un sistema monoprocesador, los problemas
creados por la multiprogramacion parten del hecho de que la velocidad relativa de ejecucion de los procesos no puede
predecirse.
Los procesos concurrentes pueden
funcionar en forma totalmente independiente unos de otros, o pueden ser
asincronos, lo cual significa que en ocasiones requieren cierta sincronizacion
o cooperacion.
Cuando dos o mas procesos llegan al mismo tiempo a ejecutarse, se dice
que se ha presentado una concurrencia de procesos. Es importante mencionar que
para que dos o mas procesos sean concurrentes, es necesario que tengan alguna
relacion entre ellos como puede ser la cooperacion para un determinado trabajo
o el uso de informacion o recursos compartidos, por ejemplo: en un sistema de
un procesador, la multiprogramacion es una condicion necesaria pero no
suficiente para que exista concurrencia, ya que los procesos pueden ejecutarse
de forma totalmente independiente.
Las interacciones entre procesos
tienen dos formas:
Primero
comunicacion.- Si tenemos varios
procesos ejecutando y queremos que interactuen entre ellos para solucionar un
determinado problema, y por tanto, necesitan intercambiar informacion, es decir
necesitan comunicarse. Esto implica el intercambio de datos entre procesos, ya
sea por medio de un mensaje implicito o a traves de variables compartidas. Una
variable es compartida entre procesos si es visible al codigo de esos procesos.
Mediante la comunicacion se
consigue que la ejecucion de un proceso influya en la ejecucion de otro.
Segundo
sincronizacion.- La sincronizacion
(sinonimo de espera) es habitualmente necesaria cuando dos procesos se comunican
puesto que la velocidad a la que se ejecutan no es predecible. Para que un
proceso se communiqué con otro, aquel debera realizar acciones que sea capaz de
detectar y esto solo funciona si realizar y detectar ocurren en este orden.
Relaciona el seguimiento de un proceso con el seguimiento de otro. En otras
palabras, la sincronizacion implica intercambio de informacion de control entre
procesos.
La necesidad de contar con
comunicacion y sincronizacion puede verse en terminos de competencia y cooperacion
entre procesos. La competencia ocurre cuando el proceso requiere el uso
exclusivo de un recurso, como cuando dos procesos compiten por usar la misma
impresora, o para reservar un asiento en un vuelo. Aqui la sincronizacion es
necesaria para garantizar a un proceso el uso exclusivo de un recurso. La
cooperacion ocurre cuando dos procesos trabajan en distintas partes del mismo
problema y por lo general incluyen a la comunicacion y a la sincronizacion.
La ejecucion concurrente de un proceso genera dos tipos de
correccion: la seguridad y la vida. La seguridad se encarga de obtener la
respuesta “correcta”. La vida tiene que ver con la tasa de avance de un
proceso, es decir, con la velocidad a la cual avanza el calculo.
La competencia por los recursos impone restricciones en el
entrelazamiento de seguimientos.
Existen dos visiones del paralelismo:
El paralelismo se presenta, a su
vez, en dos formas:
En relacion al paralelismo
hardware, Michael Flynn realizo la siguiente clasificacion de arquitecturas de
computadoras de acuerdo a los flujos de datos (data stream) y a los flujos de
instrucciones (instruction stream). El concepto de flujos de datos se refiere
al numero de operandos que se pueden procesar al tiempo y el de flujo de
instrucciones se refiere a cuantos programas se pueden ejecutar al tiempo. De
acuerdo a su clasificacion existen cuatro tipos de computadoras:
COMPUTADORES
|
|
SIMD Vectoriales Paralelos Memoria Compartida Memoria Privada
SISD
![]()
MIMD
![]()


![]()
Arquitectura
![]()
Von Neuman
Cray Illiac IV
![]()
![]()
![]()
![]()
![]()
![]()
![]()
Cyber205 CM-2
![]()
NEC
SX
NYU Hypercube
Ultracomputer Transputer
IBM RP3
![]()
![]()
![]()
![]()
![]()
![]()
![]()
Sequent Estaciones
Encore Firefly de trabajo
en 1 LAN
SIMD MIMD
Requiere menos hardware:1 unidad Requiere menos hardware
de control.
Necesita menos memoria:1 sola copia Necesita memoria para cada uno de los
del programa. Programas.
Adecuada para programas de datos paralelos: Puede ejecutar varias tareas distintas al
se requiere ejecutar el mismo programa sobre mismo tiempo o emular,un procesadorSIMD
un gran numero de datos. Mediante
mecanismos de sincronizacion.
Menor tiempo de arranque para comunicarse Para comunicarse es necesario
usar mecanismos
con los vecinos:debido a que se posee un reloj de sincronizacion.
Global.
Mas costosa: Se requiere diseñar un microchip de Mas barata: se pueden construir usando
Arquitectura. Procesadores
SISD de proposito general a gran
Escala,
los cuales son muy baratos debido a la
Economia
de escala.
Es habitual encontrar en la
bibliografia el termino del programa concurrente en el mismo contexto
que el programa paralelo o distribuido. Existen diferencias sutiles
entre estos dos conceptos:
Cuando se emplea un solo
procesador para la ejecucion de programas concurrentes se habla de seudoparalelismo.
El problema basico en la
escritura de un programa concurrente es identificar que actividades pueden realizarse concurrentemente. Ademas la
programacion concurrente es mucho mas dificil que la programacion secuencuencial
clasica por la dificultad de asegurar que el programa concurrente es correcto.
CARACTERISTICAS DE LA
CONCURRENCIA.
Los procesos concurrentes tienen
las siguientes caracteristicas :
- Los
procesoso que comparten recursos y compiten por el acceso a los mismos.
- Los procesos
que se comunican entre si para
intercambiar datos.
1. 1. Gestion de
recursos: Los recursos compartidos necesitan una gestion especial. Un proceso
que desee utilizar un recurso compartido debe solicitar dicho recurso, esperar
a adquirirlo, utilizarlo y despues liberarlo. Si el proceso solicita el recurso
pero no puede adquirirlo en ese momento, es suspendido hasta que el recurso
este disponible. La gestion de recursos compartidos es problematica y se debe
realizar de tal forma que se eviten situaciones de retraso indefinido ( espera
indefinidamente por un recurso) y de deadlock (bloqueo indefinido o abrazo
mortal).
2. 2. Comunicacion: La
comunicacion entre procesos puede ser sincrona, cuando los procesos necesitan
sincronizarse para intercambiar los datos, o asincrona, cuando un proceso que
suministra los datos no necesita esperar a que el proceso receptor los recoja,
ya que los deja en un buffer de comunicacion temporal.
PROBLEMAS DE LA CONCURRENCIA.
En los sistemas de tiempo
compartido (aquellos con varios usuarios, procesos, tareas, trabajos que
reparten el uso de CPU entre estos) se presentan muchos problemas debido a que
los procesos compiten por los recursos del sistema. Los programas concurrentes
a diferencia de los programas secuenciales tienen una serie de problemas muy
particulares derivados de las caracteristicas de la concurrencia:
Se debe evitar, pues, que dos
procesos se encuentren en su seccion critica al mismo tiempo.
Las tecnicas para prevenir el
deadlock consiste en proveer mecanismos para evitar que se presente una o
varias de las cuatro condiciones
necesarias de deadlock.
Para detectar un deadlock, se
pude usar el mismo algoritmo del banquero, que aunque no dice que hay un deadlock,
si dice cuando se esta en estado inseguro que es la antesala de deadlock. Sin
embargo, para detectar el deadlock se puede usar las graficas de recursos. En
ellas se puede usar cuadrados para indicar procesos y circulos para los recursos, y las flechas para indicar si un
recurso ya esta asignado a un proceso o si un proceso esta esperando un
recurso. El deadlock es detectado cuando se puede hacer un viaje de ida y
vuelta desde un proceso o recurso.
La exclusion mutua necesita ser
aplicada solo cuando un proceso acceda a datos compartidos; cuando los procesos
ejecutan operaciones que no esten en conflicto entre si, debe permitirseles
proceder de forma concurrente. Cuando un proceso esta accesando datos se dice
que el proceso se encuentra en su seccion critica ( o region critica).
Mientras un proceso se
encuentre en su seccion critica, los demas procesos pueden continuar su
ejecucion fuera de su secciones criticas. Cuando un proceso abandona su seccion
critica, entonces debe permitirsele proceder a otros procesos que esperan
entrar en su propia seccion critica ( si hubiera un proceso en espera). La
aplicacion de la exclusion mutual es uno de los problemas clave de la
programacion concurrente. Se han diseñado muchas soluciones para esto: algunas
de software y algunas de hardware, mas de bajo nivel y otras de alto nivel;
algunas que requieren de cooperacion voluntaria, y algunas que demandan una
adherencia rigida a protocolos estrictos.
Estar dentro de una
seccion critica es un estado muy especial asignado a un estado. El proceso
tiene acceso exclusivo a los datos compartidos, y todos los demas procesos que
necesitan accesar a esos datos permanecen en espera. Por tanto, las secciones
criticas deben ser ejecutadas lo mas rapido posible, un programa no debe
bloquearse dentro de su seccion critica, y las secciones criticas deben ser
codificadas con todo cuidado.
Si un proceso dentro de
una seccion criticaa termina, tanto de forma voluntaria como involuntaria,
entonces, al realizar su limpieza de terminacion, el sistema operativo debe
liberar la exclusion mutua para que otros procesos puedan entrar en sus
secciones criticas
Asi para garantizar la exclusion
mutua tenemos las siguientes opciones:
-
-
El algoritmo de Dekker
-
-
El algoritmo de Peterson
-
-
La instruccion hardware TSL : Test & Set Lock
Las soluciones de Deker , Peterson y TSL son
correctas pero emplean espera ocupada. Basicamente lo que realizan es que
cuando un proceso desea entrar en su seccion critica comprueba si esta
permitida la entrada o no. Si no esta permitida, el proceso se queda en un
bucle de espera hasta que se consigue el permiso de acceso. Esto produce un
gran desperdicio de tiempo de CPU, pero pueden aparecer otros problemas como la
espera indefinida.
Una solucion
mas adecuada es la de bloquear o dormir el proceso (SLEEP) cuando esta a la
espera de un determinado evento, y despertarlo (WAKEUP) cuando se produce dicho
evento. Esta idea es la que emplean las siguientes soluciones:
1. 1. Semaforos.-
Esta solucion fue propuesta por Dijkstra [DIJ65]. Un semaforo es una variable
contador que controla la entrada a la region critica. Las operaciones P o
(WAIT) y V (o SIGNAL) controlan,
respectivamente, la entrada y salida de la region critica. Cuando un proceso
desea acceder a su seccion critica realiza un WAIT(var_semaf). Lo que hace esta
llamada es, si var_semaf = = 0 entonces el proceso se bloquea, sino var_semaf =
var_semaf – 1. Al finalizar su region critica, libera el acceso con SIGNAL
(var_semaf), que realiza var_semaf = var_semaf + 1. Las acciones que realizan
de forma atomica, de tal forma que mientras se realiza la operacion P o V
ningun otro proceso pueda acceder al semaforo. Son el mecanismo mas empleado
para resolver la exclusion mutual, pero son restrictivos y no totalmente
seguros (depende de su implementacion), aunque son empleados en ocasiones para
implementar otros metodos de sincronizacion.
2. 2. Regiones
criticas condicionales.- Esta solucion fue
propuesta por HOARE [HOA74] y Brinch Hansen [BRI75] como mejora de los
semaforos. Consiste en definir las variables de una region critica como
recursos con un nombre, de esta forma la seccion critica se precede con el
nombre de recurso que se necesita y opcionalmente una condicion que se debe
cumplir para acceder a la misma. Es un buen mecanismo, pero no suele ser soportado por la mayoria de los
lenguajes de programacion.
3. 3. Monitores.-
Esta solucion tambien fue propuesta por Brinch Hansen [BRI75] y Hoare
[HOA74]. Un monitor es una construccion
de concurrencia que contiene los datos y procedimientos necesarios para
realizar la asignacion de un recurso compartido determinado, o de un grupo de
recursos compartidos. Para cumplir con la funcion de asignacion de recurso, un
procedimiento debe llamar a determinada entrada al monitor. Muchos procesos
pueden tartar de entrar al monitor en
diversos momentos. Pero la exclusion mutual es aplicada rigidamente en los limites
del monitor. Solo se permite la entrada a un proceso a la vez. Los procesos que
deseen entrar cuando el monitor esta en
uno debe esperar. La espera es administrada de forma automatica por el monitor.
Como la exclusion mutual esta garantizada, se evitan los desagradables
problemas de concurrencia ( como los
resultados indeterminados). Los datos contenidos en el monitor pueden ser
globales, para todos los procedimientos dentro del monitor, o locales, para un
procedimiento especifico. Los procesos pueden llamar a los procedimientos del
monitor cuando lo deseen para realizar las operaciones sobre los datos
compartidos, pero no pueden acceder directamente a las estructuras de datos
internas del monitor. Su principal propiedad para conseguir la exclusion mutual
es que solo un proceso puede estar activo en un monitor es cada momento.
4. 4. Paso de
mensajes o transferencia de mensajes.- Es sin duda, el modelo mas empleado
para la comunicacion entre procesos. Para la comunicacion se emplean las
primitives SEND ( para enviar un mensaje) y RECEIVE ( para poner al proceso a
la espera de un mensaje). Su ventaja es que se puede emplear para la
sincronizacion de procesos en sistemas distribuidos. La comunicacion puede ser
asincrona o sincrona. Empleando mensajes se pueden implementar semaforos o
monitores, y viceversa.
CARACTERISTICAS
DE LENGUAJES PARALELOS
Ø Ø
Optimizacion: paralelizacion automatica o no, soporte interactivo
de restructuracion de software.
Ø
Ø
Disponibilidad: escalabilidad, compatibilidad secuencial,
portabilidad.
Ø Ø
Comunicacion: Single assigment, variables compartidas, paso de
mensajes, rpc, dataflow.
Ø Ø
Control de paralelismo: granularidad, explicito o no, paralelismo
de ciclos, paralelismo de tareas.
Ø Ø
Paralelismo de datos: reparticion automatica, SPMD.
Ø Ø
Manejo de procesos: creacion dinamica, hilos, replicacion,
particion de la maquina, balanceo de carga automatico.
C CONCURRENTE
C
CONCURRENTE
|
|
C concurente es el resultado de un esfuerzo de mejoramiento
de C, para que pueda ser utilizado para el desarrollo de programas concurrentes
que puedan correr eficientemente en una sola computadora, en redes de
computadoras distribuidas o en computadoras multiprocesadores. C concurrente es
una extension compatible hacia arribe de C. Esta extensiones incluyen
macanismos para la declaracion y creacion de procesos, para la sincronizacion e
iteracion de procesos y la terminacion de procesos.
La programacion concurrente es esencial para la utilizacion
eficiente de las arquitecturas multiprocesador. Hay veces en donde no es
conveniente y conceptualmente elegante el desarrollo de sistemas en donde
varios eventos ocurren concurrentemente.
Un programa C concurrente consiste de uno o mas procesos.
Los procesos son los bloques de desarrollo de la programacion concurrente. Cada
procesos es un componente secuencial del programa que tiene su propio “control
de flujo”, y su propio stack y registros. En teoria todos los proceso se
ejecutan en paralelo (esto no es cierto si solamente hay un solo procesador).
En alguans implementaciones multiprocesador, cada procesador tiene su propio
calendarizador. Esto depende de la implementacion; una implementacion diferente
podria dedicar un procesador a cada proceso.
Cuando un programa C concurrente empieza su ejecucion, nomas
existe un solo proceso activo. Este proceso es conocido como el proceso main y
llama a la funcion main.
Archivo:
hola.cc
Archivo:
printer1.cc
BIBLIOGRAFIA CONSULTADA v http://itver.edu.mx/so1/definiciones%20de%20proceso.htm El termino “proceso”, fue utilizado
por primera vez por los diseñadores del sistema Multics en los años 60`s. v http://lara.pue.udlap.mx/sist_oper/capitulo5.html En los sistemas de tiempo compartido se presentan muchos
problemas debido a los
procesos que compiten por algun recurso. Aqui se muestran algunos de los
problemas de Concurrencia. v http://agamenon.uniandes.edu.co/~c21437/ma-bedoy/taxonomi.htm Taxonomia de las arquitecturas de
computadoras, la cual se le debe a Flynn. v http://itver.edu.mx/so1/Definiciones%2032.htm Concurrencia de procesos. Definicion
de concurrencia. v http://1ml.ls.fi.upm.es/~angel/concurrente/96notes/nodel15.html Estado de un programa concurrente
v http://www.biocristalografria.df.ibilce.unesp.br/irbis/disertacion/node239.html Concepto de concurrencia
v http://gsyc.escet.urjc.es/simple_com/phd-thesis-es/node53.html
Ejecucion de un programa concurrente
v http://1ml.ls.fi.upm.es/~angel/concurrente/96notes/nodel16.html Concepto de sincronizacion
v http://tiny.uasnet.mx/prof/cln/ccu/mario/sisop/sisop06.htm Concepto de monitores.
v http://fciencias.ens.uabc.mx/notas_cursos/so2/c_concu.html C concurrente. v http://www.geocities.com/SiliconValley/Bay/9418/2_CONCEPTOS.htm Conceptos basicos de paralelismo y concurrencia. v http://research.cem.itesm.mx/jesus/cursos/compd2/s2/node2.html Caracteristicas de los lengiajes paralelos. -Paralelismo
explicito -Paralelismo
implicito v http://www.inf.ufrgs.br/procpar/tools/cc++exeCp.htm Ejemplo de C paralelo.