Académique Documents
Professionnel Documents
Culture Documents
CONCEPTOS FUNDAMENTALES
1.1 Introduccin
La idea de programacin concurrente siempre estuvo asociada al mundo de los
Sistemas Operativos (SSOO). No en vano, los primeros programas concurrentes
fueron los propios Sistemas Operativos de multiprogramacin en los que un solo
procesador de gran capacidad deba repartir su tiempo entre muchos usuarios.
Para cada usuario, la sensacin era que el procesador estaba dedicado para l.
Durante la dcada de los sesenta y setenta esto fue as. La programacin de
sistemas con capacidades de concurrencia se haca a bajo nivel, en ensamblador,
pues aparte de no disponer de lenguajes de alto nivel con capacidades de
concurrencia, se primaba la supuesta eficiencia del cdigo escrito directamente en
ensamblador. La aparicin en 1972 del lenguaje de alto nivel Concurrent Pascal
[Brinch-Hansen, 1975], desarrollado por Brinch Hansen, se encarg de romper
este mito y abrir la puerta a otros lenguajes de alto nivel que incorporaban
concurrencia.
Desde entonces la programacin concurrente ha ido ganando inters y
actualmente se utiliza muy a menudo en la implementacin de numerosos
sistemas. Tres grandes hitos se nos antojan importantes para que la programacin
concurrente actualmente sea tan importante:
La aparicin del concepto de thread o hilo que hace que los programas
puedan ejecutarse con mayor velocidad comparados con aquellos que
utilizan el concepto de proceso.
La aparicin ms reciente de lenguajes como Java, lenguaje orientado a
objetos de propsito general que da soporte directamente a la programacin
concurrente mediante la inclusin de primitivas especficas.
La aparicin de Internet que es un campo abonado para el desarrollo y la
utilizacin de programas concurrentes. Cualquier programa de Internet en el
que podamos pensar tales como un navegador, un chat, etc, estn
programados usando tcnicas de programacin concurrente.
SISTEMA OPERATIVO
navegador
Internet
SISTEMA OPERATIVO
navegador
Internet
1
En el siguiente captulo se ver que existe un segundo nivel de concurrencia.
Sistemas de control
Son aquellos sistemas en los que hay una captura de datos, normalmente a travs
de sensores, un anlisis de esos datos y una posible actuacin posterior en
funcin del resultado del anlisis. La recoleccin de datos se puede estar haciendo
de diversas entidades fsicas como por ejemplo edificios o estancias dentro de
edificios. No sera tolerable un sistema secuencial que vaya capturando los datos
Tecnologas web
La mayora de los programas relacionados con la web son concurrentes: los
servidores web que son capaces de atender concurrentemente mltiples
conexiones de usuarios; los programas de chat que permiten mantener la
conversacin de varios usuarios; los servidores de correo que permiten que
mltiples usuarios puedan mandar y recibir mensajes al mismo tiempo; los propios
navegadores que permiten que un usuario pueda estar haciendo una descarga
mientras navega por otras pginas, o se ejecuta un applet de Java, etc.
Simulacin
Los programas secuenciales encuentran problemas al simular sistemas en los que
existen objetos fsicos que tienen un comportamiento autnomo independiente. La
programacin concurrente permitir modelar esos objetos fsicos y ponerlos en
ejecucin de forma independiente y concurrente, sincronizndolos de la forma
apropiada.
SGBD
En Sistemas Gestores de Bases de Datos la concurrencia juega un papel muy
importante cuando se va a permitir a varios usuarios interactuar con el sistema.
Cada usuario puede ser visto como un proceso. Obviamente hay que implementar
la poltica adecuada para evitar situaciones en las que dos usuarios modifican al
mismo tiempo un registro. Sin embargo, a varios usuarios que quieran acceder a
un mismo registro para consultarlo y no modificarlo, debe permitrseles un acceso
concurrente.
P1
P2
P3
Figura 3 Concurrencia.
Aparte de la situacin en la que un proceso puede aprovechar ciclos de CPU
mientras otro proceso hace operaciones de entrada/salida, existen otros posibles
beneficios del uso de concurrencia en sistemas monoprocesador:
Variable
compartida MEMORIA comn a
todos los procesos
escribe lee
SISTEMA OPERATIVO
procesador
Figura 5 Paralelismo.
nodo
Variable B
compartida MEMORIA comn a
todos los procesos
paso de mensaje
escribe lee
procesador
SISTEMA OPERATIVO
procesador
procesador
procesador
x:=x+1;
y:=x+2;
Est claro que la primera sentencia se tiene que ejecutar antes que la segunda.
Sin embargo consideremos ahora:
x:=1;
y:=2;
z:=3;
Condiciones de Bernstein
Para poder determinar si dos conjuntos de instrucciones se pueden ejecutar de
forma concurrente, se definen en primer lugar los siguientes conjuntos:
L (Sk) = {a1, a2, ... , an}, como el conjunto de lectura del conjunto de
instrucciones Sk y que est formado por todas las variables cuyos valores
son referenciados (se leen) durante la ejecucin de las instrucciones en Sk.
E (Sk) = {b1, b2, ... , bm}, como el conjunto de escritura del conjunto de
instrucciones Sk y que est formado por todas las variables cuyos valores
son actualizados (se escriben) durante la ejecucin de las instrucciones en
Sk.
1. L(Si) E(Sj) =
2. E(Si) L(Sj) =
3. E(Si) E(Sj) =
S1 a := x+y;
S2 b := z-1;
S3 c := a-b;
S4 w := c+1;
Entre S1 y S4:
Entre S1 y S3:
Entre S2 y S4:
De todo esto se deduce la siguiente tabla en la que puede verse qu pares de
sentencias pueden ejecutarse de forma concurrente:
S1 S2 S3 S4
S1 -- S No S
S2 -- -- No S
S3 -- -- -- No
S4 -- -- -- --
Grafos de precedencia
Se trata de una notacin grfica. Es un grafo dirigido acclico. Cada nodo
representar una parte (conjunto de instrucciones) de nuestro sistema. Una flecha
desde A hasta B representa que B slo puede ejecutarse cuando A haya
finalizado. Si aparecen dos nodos en paralelo querr decir que se pueden ejecutar
concurrentemente.
Para el ejemplo anterior el grafo de precedencia sera el de la Figura 8.
S3
S4
Sentencias COBEGIN-COEND
Todas aquellas acciones que puedan ejecutarse concurrentemente las
introducimos dentro del par cobegin/coend. El ejemplo anterior quedara de la
siguiente forma:
begin
cobegin
a:=x+y;
b:=z+1;
coend;
c:=a-b;
w:=c+1;
end.
i1 i1 i1
i2 i2 i2
programa
i3 i3 i3
i4 i4 i4
i6 i6 i6
i5 i5 i5
i7 i7 i7
begin
cobegin
i1 i2 i3 i4 i5 i6 i7 i1; i2; i3; i4; i5; i6; i7;
coned;
end.
1.6.2 Indeterminismo
Este orden parcial lleva a que los programas concurrentes puedan tener un
comportamiento indeterminista, es decir, puedan arrojar diferentes resultados
cuando se ejecutan repetidamente sobre el mismo conjunto de datos de entrada.
Esto suele llevar a muchas sorpresas cuando uno se inicia en la programacin
concurrente.
Consideremos el siguiente programa en el que dos procesos se ejecutan
concurrentemente para sumar 1 a la variable x. Esa variable x es compartida por
ambos procesos pues ha sido declarada como global. La sintaxis utilizada es la
del lenguaje Pascal-FC.
program Incognita;
var x: integer;
P1 P2
(1) LOAD X R1 (1) LOAD X R1
(2) ADD R1 1 (2) ADD R1 1
(3) STORE R1 X (3) STORE R1 X
x 0 0 0 0 1 1 1
P1 1 2 3
P2 1 2 3
Tiempo
Seccin crtica
x:=x+1
Seccin crtica
x:=x+1
cmara impresora
Hay situaciones en las que un recurso compartido por varios procesos, como
puede ser el buffer o la cola de impresin en nuestro ejemplo, se encuentra en
un estado en el que un proceso no puede hacer una determinada accin con l
hasta que no cambie su estado. A esto se le denomina condicin de
sincronizacin.
La programacin concurrente ha de proporcionarnos mecanismos para
bloquear procesos que no puedan hacer algo en un momento determinado a la
espera de algn evento (p. ej. que el buffer deje de estar vaco), pero tambin
que permita desbloquearlos cuando ese evento haya ocurrido.
Propiedades de seguridad
Exclusin mutua. Hay recursos en el sistema que deben ser accedidos en
exclusin mutua tal y como hemos visto anteriormente. Cuando esto ocurre,
hay que garantizar que si un proceso adquiere el recurso, otros procesos
debern esperar a que sea liberado. De lo contrario, el resultado puede ser
imprevisto. En nuestro ejemplo, el pauelo ha de adquirirse en exclusin
mutua, o lo coge un jugador o lo coge otro. Si lo cogen los dos a la vez
puede llegar a romperse, llevando a un malfuncionamiento del sistema.
Condicin de sincronizacin. Hay situaciones en las que un proceso debe
esperar por la ocurrencia de un evento para poder seguir ejecutndose.
Cuando esto ocurre, hay que garantizar que el proceso no prosigue hasta
que no se produce el evento. De lo contrario, el resultado puede ser
imprevisto. En nuestro ejemplo, un jugador ha de esperar a que digan su
nmero para poder salir corriendo. Si sale corriendo antes llevara a un
malfuncionamiento del sistema.
Interbloqueo. Se produce una situacin de interbloqueo cuando todos los
procesos estn esperando porque ocurra un evento que nunca se
producir. Hay que garantizar que no se producen este tipo de situaciones.
En nuestro ejemplo se producira si un jugador se guarda el pauelo y se va
para su casa. El juez esperara porque le devolvieran el pauelo y los
jugadores esperaran porque el juez dijese su nmero, pero ninguno de
estos eventos va a ocurrir nunca. Se suele conocer tambin con el nombre
de deadlock o abrazo mortal.
Problemas de vivacidad
Interbloqueo activo: El anterior interbloqueo tambin suele conocerse
como pasivo. Se produce una situacin de interbloqueo activo cuando un
sistema ejecuta una serie de instrucciones sin hacer ningn progreso. Hay
que garantizar que no ocurra este tipo de situaciones. En nuestro ejemplo
se producira si dos jugadores, al intentar coger el pauelo, amagan una y
otra vez, pero no se deciden a cogerlo. Mientras que la deteccin de un
intebloqueo pasivo es ms o menos simple, la deteccin de un interbloqueo
activo es muy complicada. Se suele conocer tambin con el nombre de
Resumen
En el presente captulo se han presentado los conceptos fundamentales de la
programacin concurrente. Se ha definido el concepto de proceso, de
concurrencia y de programacin concurrente. Se han visto las distintas
plataformas hardware donde poder ejecutar programas concurrentes:
monoprocesador y multiprocesador y, en funcin de ello, se ha visto la
diferencia por un lado entre multiprogramacin, multiproceso y procesamiento
distribuido y, por otro lado, entre programas concurrentes, paralelos y
distribuidos. El hecho de que dos procesos sean concurrentes no implica
necesariamente que se ejecuten exactamente al mismo tiempo. Eso depender
del hardware subyacente. En cualquier caso, e independientemente del
hardware, los beneficios de la programacin concurrente pueden resumirse en:
mayor velocidad de ejecucin, mejor aprovechamiento de la CPU y soluciones
ptimas a problemas de naturaleza eminentemente concurrente.
Tambin se ha visto en este captulo cmo determinar cundo un conjunto
de instrucciones puede ejecutarse de manera concurrente mediante las
condiciones de Bernstein. Una vez determinado qu se puede ejecutar
concurrentemente, hemos visto cmo especificarlo de dos formas distintas:
mediante el par cobegin/coend y mediante grafos de precedencia.
Los programas concurrentes se caracterizan por un orden parcial en la
ejecucin de sus instrucciones frente al orden total presente en los programas
secuenciales. Este orden parcial nos lleva a un indeterminismo en el resultado
arrojado por la ejecucin de los programas concurrentes. Este indeterminismo
hace que la depuracin y correccin de programas concurrentes no sea una
tarea precisamente trivial.
Dos son los grandes problemas a resolver en problemas de naturaleza
concurrente: el problema de la exclusin mutua y el problema de la condicin
de sincronizacin. Un programa concurrente ser correcto si, adems de
contemplar sus especificaciones funcionales donde irn implcitas condiciones
de exclusin mutua y de sincronizacin, es capaz de evitar que se produzcan
situaciones de interbloqueo y de inanicin de procesos.
Ejercicios resueltos
S1
S2 S3
S4
S5 S6
S7
Solucin:
S1;
cobegin
S3;
begin
S2;
S4;
cobegin
S5;
S6;
coend
end;
coend;
S7;
S2
S1 S3 S4 S6
S5
S7
Solucin:
var f, g: file of T;
r s: T;
count: integer;
begin
abrirLectura (f);
abrirEscritura (g);
leer (f,s);
while not finFichero (f) do begin
s:=r;
cobegin
escribir (g,s);
leer (f,r);
coend
escribir (g,r);
end;
Ejercicios propuestos
Cuestiones breves
1. Cul es la ventaja de la concurrencia en los sistemas monoprocesador?
2. Cules son las diferencias entre programacin concurrente, paralela y
distribuida?
3. Cules son las diferencias entre multiprogramacin, multiproceso y
procesamiento distribuido?
4. Cules son los dos problemas principales inherentes a la programacin
concurrente?
5. Qu es una seccin crtica?
6. Cules son las caractersticas de un programa concurrente?
7. Qu se entiende por un programa concurrente correcto?
S1 S1
S2 S5 S2 S3
S3 S4
S4
S5 S6
S7
S6