Logo Studenta

concurrencia y exc

¡Este material tiene más páginas!

Vista previa del material en texto

Sistemas Operativos
INF - 151
MODULO II. PROCESOS
2.3 Concurrencia y Exclusión Mutua
Resumen preparado por Miguel Cotaña12/10/07
2
El diseño de SO están relacionados con la 
gestión de procesos e hilos:
Multiprogramación. Gestión de múltiples 
procesos dentro de un sistema 
monoprocesador.
Multiprocesamiento. Gestión de múltiples 
procesos dentro de un multiprocesador.
Procesamiento distribuido. Gestión de 
múltiples procesos que ejecutan sobre 
múltiples sistemas de cómputo distribuidos.
3
Principios de concurrenciaPrincipios de concurrencia
Según el diccionario, concurrencia es: “El 
Acaecimiento o concurso de varios sucesos 
en un mismo tiempo”
Concurrencia es el conjunto de actividades 
que se desarrollan de forma simultánea
En computación cada una de esas actividades 
se suele llamar proceso
4
Comunicación entre procesos.
Compartición y competencia por los 
recursos.
Sincronización de la ejecución de varios
procesos.
Asignación del tiempo de procesador a los 
procesos.
5
• Puede haber múltiples 
procesos en ejecución 
que correspondan al 
mismo programa
– Ejemplo: Un servidor 
de aplicaciones donde 
reside un navegador 
de Internet y existen 
varios usuarios 
ejecutando ese 
navegador
Programa y procesoPrograma y proceso
6
Dos procesos serán concurrentes cuando 
exista solapamiento (intercalado) en la 
ejecución de sus instrucciones
Tres procesos (independientes) 
concurrentes ejecutándose al mismo 
tiempo sobre el sistema operativo (cada 
proceso corresponde a una instancia del 
programa del navegador) 
7
• Un Programa al 
ponerse en ejecución, 
puede dar lugar a más 
de un proceso, c/u de 
ellos ejecutando una 
parte del programa
Por ejemplo: 
El programa del 
navegador de Internet 
formado por n 
procesos: uno que 
controla las acciones 
del usuario con la 
interfaz, otro que hace 
las peticiones al 
servidor, etc.
8
• El Proceso p1.1 y el 
Proceso p1.2 
pueden estar 
colaborando para 
hacerle la vida más 
fácil al usuario
• El proceso p1.2 y el 
proceso p2.2 
pueden estar 
compitiendo para 
acceder a disco
9
En un sistema multiprogramado único, los 
procesos se entrelazan en el tiempo para 
ofrecer la apariencia de ejecución simultánea
Proceso 1
Proceso 2
Proceso 3
tiempo
Intercalado (multiprogramación, un procesador)
bloqueando ejecutando
10
En un sistema de múltiples procesadores no 
sólo es posible entrelazar la ejecución de 
múltiples procesos sino también solaparlas
Proceso 1
Proceso 2
Proceso 3
tiempo
Intercalado y solapamiento (multiproceso; 2 procesadores)
11
El entrelazado y el solapamiento son 
técnicas que pueden verse como ejemplos 
de procesamiento concurrente. En el caso de 
un monoprocesador, los problemas surgen 
de una característica básica de los sistemas 
multiprogramados: no puede predecirse la 
velocidad relativa de ejecución de los 
procesos. Ésta depende de la actividad de 
los otros procesos, de la forma en que el SO 
maneja las interrupciones y de las políticas 
de planificación del SO.
12
Se plantean las siguientes dificultades:
1) La compartición de recursos globales está
cargada de peligros. Por ejemplo, si 2 
procesos utilizan ambos la misma variable 
global y ambos realizan lecturas y 
escritura sobre esa variable, entonces el 
orden en que se ejecuten las lecturas y 
escrituras es crítico
13
2) Para el SO es complicado gestionar la 
asignación de recursos óptimamente. Por 
ejemplo, un proceso puede solicitar el uso 
de un canal concreto de E/S, y serle 
concedido el control, y luego ser 
suspendido justo antes de utilizar ese 
canal.
3) Llega a ser muy complicado localizar 
errores de programación.
14
void echo()
{
ent = getchar();
sal = ent;
putchar(sal); 
}
En un sistema multiprocesador, también se 
presentan todas las dificultades 
mencionadas
15
Es necesario proteger las variables globales 
compartidas (así como otros recursos 
globales compartidos) y que la única manera 
de hacerlo es controlar el código que accede 
a la variable
Hemos ido suponiendo de que se trata de un 
SO multiprogramado para un 
monoprocesador. En un sistema 
multiprocesador, aparecen los mismos 
problemas de recursos compartidos 
protegidos, y funcionan las mismas 
soluciones.
16
Supóngase que no hay mecanismo para 
controlar los accesos a la variable global 
compartida:
Proceso P1 Proceso P2
. .
ent = getchar(); . .
. ent = getchar();
sal = ent; sal = ent;
putchar(sal); .
. putchar(sal);
. .
17
En el caso de un sistema monoprocesador, el 
motivo por el que se tiene un problema es 
que una interrupción puede parar la 
ejecución de instrucciones en cualquier punto 
de un proceso. 
En un sistema multiprocesador, se tiene el 
mismo motivo y, además, puede suceder 
porque 2 procesos pueden estar ejecutando 
simultáneamente y ambos intentando 
acceder a la misma variable global. Sin 
embargo, la solución es la misma: controlar 
los accesos a los recursos compartidos.
18
Condición de carreraCondición de carrera
Una condición de carrera sucede cuando 
múltiples procesos o hilos leen y escriben 
datos de manera que el resultado final 
depende del orden de ejecución de las 
instrucciones en los múltiples procesos.
Ejemplo1: Considere los procesos P1 y P2, 
que comparten las variables globales b y c, 
con valores iniciales b=1 y c=2. En algún 
punto de su ejecución, P1 ejecuta b=b+1 y 
en algún punto de su ejecución, P2 ejecuta 
c=b+c
19
Interacción de procesosInteracción de procesos
Podemos clasificar las formas en que los 
procesos interaccionan en base al grado en 
que perciben la existencia de cada uno de 
los otros:
Procesos que no se perciben entre sí.
Son procesos independientes que no se 
pretende que trabajen juntos. Aunque los 
procesos no estén trabajando juntos, el SO 
necesita preocuparse de la competencia
por recursos.
20
Procesos que se perciben indirectamente 
entre sí. Son procesos que no están 
necesariamente al tanto de la presencia de los 
demás mediante sus respectivos ID de 
procesos, pero que comparten accesos a algún 
objeto, como un buffer de E/S. Tales procesos 
exhiben cooperación en la compartición del 
objeto común
Procesos que se perciben directamente 
entre sí. Capaces de comunicarse entre sí vía 
el ID del proceso. Tales procesos exhiben 
cooperación.
21
Competencia entre procesos por recursosCompetencia entre procesos por recursos
Los procesos concurrentes entran en 
conflicto entre ellos cuando compiten por el 
uso del mismo recurso.
No existe intercambio de información entre 
los procesos en competencia.
Si 2 procesos desean ambos acceder al 
mismo recurso único, el SO reservará el 
recurso para uno de ellos y el otro tendrá
que esperar. Por tanto, el proceso al que se 
le deniega el acceso será ralentizado
22
En el caso de procesos en competencia, 
deben afrontarse 3 problemas de control:
Exclusión mutua
Interbloqueo
Inanición
Recurso crítico
Sección crítica
23
Suponiendo que 2 o más procesos 
requieren acceso a un recurso 
(impresora) único no compartible. 
Durante la ejecución, cada proceso 
estará enviando mandatos al dispositivo 
de E/S, recibiendo información de 
estado, enviando o recibiendo datos. Tal 
recurso es un recurso crítico, y a la 
porción del programa que lo utiliza 
como la sección crítica del programa
24
La aplicación de la exclusión mutua crea 
2 problemas: interbloqueo e inanición.
El interbloqueo se define como:
“El Bloqueo permanente de un 
conjunto de procesos que ya sea, 
compiten por los recursos del sistema 
o bien se comunican unos con otros”.
25
Situación en la que se encuentran un 
conjunto de procesos, (al menos dos), 
tal que cada proceso del conjunto 
espera la ocurrencia de un evento que 
sólo puede ser provocado por otro 
proceso del mismo conjunto.
Todos los interbloqueos suponen 
demandas contradictorias de recursos 
por parte de 2 o más procesos.
26
Un conjunto de procesos está en bloqueo 
mutuo/interbloqueo si cada proceso del 
conjunto está esperando un evento quesólo 
otro proceso del conjunto puede causar.
Los bloqueos ocurren en entornos 
multiprogramación, cuando varios procesos 
compiten por un número limitado de recursos.
El bloqueo ocurre cuando un proceso 
monopoliza el acceso a un recurso y requiere 
otro recurso que ha sido ya asignado a un 
segundo proceso, que a su vez necesita el 
recurso monopolizado por el primer proceso.
27
Ejemplos:
• Ley del estado de Kansas: “Si dos trenes 
se aproximan uno al otro en un cruce, 
ambos harán alto total y ninguno 
arrancará de nuevo hasta que el otro se 
haya ido”
• 2 personas llamándose por teléfono 
mutuamente
28
29
30
Recursos: 
Son los objetos otorgados/usados por los 
procesos en un instante dado.
Secuencia de eventos necesarios para utilizar 
un recurso:
1. Solicitar el recurso
2. Utilizar el recurso
3. Liberar el recurso
31
De acuerdo a su estructura real hay 2 tipos:
Físicos (dispositivos de HW): Memoria, 
dispositivos. etc.
Lógicos (elemento de información): 
archivos, semáforos, cerrojos, mensajes, 
señales, etc.
De acuerdo a su uso hay 2 tipos:
Reutilizables
Consumibles
32
Recursos Reutilizables:Recursos Reutilizables:
Es aquél que puede ser usado por un 
proceso y no se agota con el uso.
Los procesos obtienen recursos que 
liberan posteriormente para que otros 
procesos las reutilicen.
Ejemplo:
Procesadores, canales E/S, memoria 
principal y secundaria, archivos, BD, etc,
33
Recursos ConsumiblesRecursos Consumibles
Es aquél que puede ser creado 
(producido) y destruido (consumido).
Ej: Interrupciones, señales, mensajes, 
etc.
34
Un ejemplo de inanición:
Suponiendo 3 procesos (P1,P2, P3) requieren 
todos accesos periódicos al recurso R. Si P1 
está en posesión del recurso y P2 y P3 están 
ambos retenidos, esperando por ese recurso. 
Cuando P1 termine su sección crítica, debería 
permitírsele acceso a R a P2 o P3. Suponiendo 
que el SO le concede acceso a P3 y que P1 
solicita acceso otra vez antes de completar su 
sección crítica. Si el SO le concede acceso a P1 
después de que P3 haya terminado, y 
posteriormente concede alternativamente 
acceso a P1 y P3, entonces a P2 puede 
denegársele indefinidamente el acceso al 
recurso, aunque no suceda interbloqueo
35
En términos abstractos la exclusión 
mutua, se puede ilustrar:
/*PROCESO 1 */
Void P1
{
while (true)
{
/* código anterior */;
entrarcritica (Ra);
/* sección crítica */;
salircritica (Ra);
/* código posterior */;
}
}
/*PROCESO 2 */
Void P1
{
while (true)
{
/* código anterior */;
entrarcritica (Ra);
/* sección crítica */;
salircritica (Ra);
/* código posterior */;
}
}
/*PROCESO n */
Void P1
{
while (true)
{
/* código anterior */;
entrarcritica (Ra);
/* sección crítica */;
salircritica (Ra);
/* código posterior */;
}
}
36
Cooperación entre procesos vía comparticiónCooperación entre procesos vía compartición
Cubre procesos que interaccionan con otros 
procesos sin tener conocimiento explícito de 
ellos.
Por ejemplo, múltiples procesos pueden tener 
acceso a variables compartidas o a BD. Los 
procesos pueden usar y actualizar los datos 
compartidos sin referenciar otros procesos 
pero saben que otros procesos pueden tener 
acceso a los mismos. Así, los procesos deben 
cooperar para asegurar que los datos 
compartidos son manipulados 
adecuadamente.
37
Tomando en cuanta que los datos están 
contenidos en recursos (dispositivos, 
memoria), los problemas de exclusión 
mutua, interbloqueo e inanición están 
presentes de nuevo. La única diferencia 
es que los datos individuales pueden ser 
accedidos de dos maneras diferentes, 
lectura y escritura, y sólo las operaciones 
de escritura deben ser mutuamente 
exclusivas
38
Por encima de estos problemas, surge un 
nuevo requisito: el de la coherencia de 
datos
Ejemplo: P1 y P2 que comparten datos a 
y b que deben cumplir a=b
P1 P2
(I11) a = a + 1; (I21) b = b * 2;
(I12) b = b + 1; (I22) a = a * 2;
Supóngase ahora la secuencia de ejecución 
siguiente: (I11, I21 I12 I22)
“Sí el estado es inicialmente consistente, cada 
proceso tomado por separado dejará los datos 
compartidos en un estado consistente”.
39
Cooperación entre procesos vía comunicaciónCooperación entre procesos vía comunicación
En los 2 casos tratados, cada proceso tiene su 
propio entorno aislado que no incluye a los 
otro procesos. Las interrelaciones entre los 
proceso son indirectas. En ambos casos hay 
cierta compartición. En el caso de la 
competencia hay recursos compartidos sin ser 
conscientes de los otros procesos. En el 
segundo caso, hay compartición de valores y 
aunque cada proceso no es explícitamente 
consciente de los demás procesos, es 
conciente de la necesidad de mantener la 
integridad de datos.
40
Cuando los procesos cooperan vía 
comunicación, en cambio, los diversos 
procesos involucrados participan en un 
esfuerzo común que los vincula a todos ellos. 
La comunicación proporciona una manera de 
sincronizar o coordinar actividades varias.
Típicamente, la comunicación se fundamenta 
en mensajes de algún tipo. Las primitivas de 
envío y recepción de mensajes deben ser 
proporcionadas como parte del lenguaje de 
programación o por el núcleo del SO.
41
Requisitos para la exclusión mutuaRequisitos para la exclusión mutua
Cualquier mecanismo o técnica que vaya a 
proporcionar exclusión mutua debería 
contemplar los siguientes requisitos:
1. La exclusión mutua debe hacerse cumplir: 
sólo se permite un proceso al tiempo 
dentro de su sección crítica, de entre 
todos los procesos que tienen secciones 
críticas para el mismo recurso compartido.
2. Un proceso que se pare en su sección no 
crítica debe hacerlo sin interferir con otros 
procesos.
42
3. No debe ser posible que un proceso que 
solicite acceso a una sección crítica sea 
postergado indefinidamente: ni 
interbloqueo ni inanición.
4. Cuando ningún proceso esté en una 
sección crítica, a cualquier proceso que 
solicite entrar en su sección crítica debe 
permitírsele entrar sin demora.
5. No se hacen suposiciones sobre las 
velocidades relativas de los procesos ni 
sobre el número de procesadores.
6. Un proceso permanece dentro de su 
sección crítica sólo por un tiempo finito.
43
Exclusión mutua: soporte hardwareExclusión mutua: soporte hardware
En una máquina monoprocesador, los 
procesos concurrentes no pueden solaparse, 
sólo pueden entrelazarse. Es más, un 
proceso continuará ejecutando hasta que 
invoque un servicio del SO o hasta que sea 
interrumpido. Por tanto, para garantizar la 
exclusión mutua, basta con impedir que un 
proceso sea interrumpido
Deshabilitar interrupcionesDeshabilitar interrupciones
44
Un proceso puede cumplir la exclusión 
mutua, de la siguiente forma:
While (true)
{
/*deshabilitar interrupciones */;
/*sección crítica */;
/*habilitar interrupciones */;
/*resto */;
}
45
A un nivel de hardware, el acceso a una 
posición de memoria excluye cualquier otro 
acceso a la misma posición. Con este 
fundamento, los diseñadores de 
procesadores han propuesto varias 
instrucciones máquina que llevan a cabo 2 
acciones atómicamente, como leer y 
escribir o leer y comprobar, sobre una 
única posición de memoria con un único ciclo 
de búsqueda de instrucción.
Instrucciones máquina especialesInstrucciones máquina especiales
46
Durante la ejecución de la instrucción, el 
acceso a la posición de memoria se le 
bloquea a toda otra instrucción que 
referencie esa posición. Típicamente, estas 
acciones se realizan en un único ciclo de 
instrucción.
Se consideran:
Instrucción Test and Set
Instrucción Exchange
47
Instrucción Test and Set (comprueba y 
establece). Esta instrucción puede definirse 
como: boolean testset (int i)
{
if (i==o)
{
i=1;
return true;
} 
else
{
return false;
}
}
48
/* programa exclusión mutua */
const int n= /* número de procesos */;
int cerrojo;
void P(int i)
{
while (true)
{
while (!testset (cerrojo))
/* no hacer nada */;
/* sección crítica */;
cerrojo=0;
/* resto */
} 
void main()
{
cerrojo=0;
paralelos(P(1), P(2),…..,P(n));
}
49
Instrucción Exchange. La instrucción 
exchange (intercambio) puede definirse 
como:
void exchange (int registro, int memoria)
{
int temp;
temp = memoria;
memoria = registro;
registro = temp;
}
50
/* programa exclusión mutua */
const int n= /* número de procesos */;
int cerrojo;
void P(int i)
{
int llavei = 1;
while (true)
{
do exchange (llavei, cerrojo)
while (llavei !=0);
/* sección crítica */;
exchange (llavei, cerrojo);
/* resto */
} 
} 
void main()
{
cerrojo=0;
paralelos (P(1), P(2),…..,P(n));
}
51
Propiedades de la solución instrucción 
máquina. El uso de una instrucción 
máquina especial para conseguir exclusión 
mutua tiene ciertas ventajas:
Es aplicable a cualquier número de 
procesos sobre un procesador único o 
multiprocesador de MP compartida.
Es simple y, por tanto, fácil de verificar.
Puede ser utilizado para dar soporte a 
múltiples secciones críticas: cada sección 
crítica puede ser definida por su propia 
variable.
52
Entre las desventajas serias:
Se emplea espera activa. Mientras un 
proceso está esperando para acceder a una 
sección crítica, continúa consumiendo 
tiempo de procesador.
Es posible la inanición. Cuando un 
proceso abandona su sección crítica y hay 
más de un proceso esperando, la selección 
del proceso en espera es arbitraria.
Es posible el interbloqueo. 
53
SemáforosSemáforos
Una de las soluciones más famosas 
y significantes del problema de 
cooperación entre procesos 
paralelos fue la propuesta de 
Dijkstra. Su solución introdujo un 
nuevo tipo de variables, llamadas 
semáforos, y 2 operaciones 
especiales.
54
La propuesta de Dijkstra es el resultado 
de su crítica a las soluciones con espera 
activa. Y dice, cuando un proceso está
ejecutando las instrucciones de la 
sección crítica, ningún otro puede estar 
en la sección. Además, si alguno quiere 
entrar, tiene que esperar hasta que 
termine la ejecución del proceso en 
turno. 
55
Durante este tiempo nada se puede 
cambiar, entonces no tiene caso que el 
proceso esté esperando, repitiendo 
inútilmente la revisión del valor de una 
variable (o más). Mejor que “descanse”
abriendo la posibilidad de que el tiempo 
de procesador lo aproveche quien lo 
necesite verdaderamente.
La idea básica es la suspensión de los 
procesos que no pueden entrar y su 
reactivación, cuando algún proceso sale 
de la sección.
56
Dos o más procesos pueden cooperar por 
medio de simples señales, tales que un 
proceso pueda ser obligado a parar en un 
lugar específico hasta que haya recibido 
una señal específica. Cualquier requisito 
complejo de coordinación puede ser 
satisfecho con la estructura de señales 
apropiada
57
Para la señalización, se utiliza la variable 
“semáforo”.
Para transmitir una señal vía el semáforo 
s, el proceso ejecutará la primitiva 
semSignal(s).
Para recibir una señal vía el semáforo s, 
el proceso ejecutará la primitiva 
semWait(s); si la correspondiente señal 
no se ha transmitido todavía, el proceso 
se suspenderá hasta que la transmisión 
tenga lugar.
58
Las 3 operaciones son:
1. Un semáforo puede ser inicializado a un valor 
no negativo
2. La operación semWait decrementa el valor 
del semáforo. Si el valor pasa a ser negativo, 
entonces el proceso que está ejecutando 
semWait se bloquea. En otro caso, el proceso 
continúa su ejecución.
3. La operación SemSignal incrementa el valor 
del semáforo. Si el valor es menor o igual 
que cero, entonces se desbloquea uno de los 
procesos bloqueados en la operación 
semWait.
59
Struct semaphore {
int cuenta;
queueType cola;
}
void semWait(semaphore s)
{
s.cuenta--;
if (s.cuenta<0)
{
poner este proceso en s.cola;
bloquear este proceso;
} 
} 
void semSignal(semaphore s)
{
s.cuenta++;
if (s.cuenta <= 0)
{ 
extraer un proceso P de s.cola;
poner el proceso P en la lista de listos;
}
}
D
e
fin
ic
ió
n
 d
e
 p
rim
itiv
a
s
 d
e
l s
e
m
á
fo
ro
60
Un semáforo binario, define 3 operaciones
1. Un semáforo binario puede ser de inicio 0 o 1
2. La operación semWaitB comprueba el valor del 
semáforo. Si el valor es cero, entonces el 
proceso que está ejecutando samWaitB se 
bloquea. Si el valor es 1, entonces se cambia el 
valor a cero y el proceso continúa su ejecución.
3. La operación semSignalB comprueba si hay 
algún proceso bloqueado en el semáforo. Si lo 
hay, entonces se desbloquea uno de los 
procesos bloqueados en la operación 
semWaitB. Si hay bloqueados, entonces el 
valor del semáforo se pone a uno.
61
Struct binary_semaphore {
enum { cero, uno } valor;
queueType cola;
}
void semWaitB(binary_semaphore s)
{
if (s.valor == 1)
s.valor = 0;
else
{
poner este proceso en s.cola;
bloquear este proceso;
} 
} 
void semSignalB(binary_semaphore s)
{
if (esta_vacia(s.cola))
s.valor = 1;
else
{ 
extraer un proceso P de s.cola;
poner el proceso P en la lista de listos;
}
}
D
e
f. d
e
 p
rim
. d
e
l s
e
m
á
fo
ro
 b
in
a
rio
 o
 m
u
te
x
62
El orden en que son extraídos de la cola 
es FIFO: el proceso que lleve más tiempo 
bloqueado es el primero en ser extraído 
de la cola; un semáforo cuya definición 
incluye esta política se denomina 
semáforo fuerte. Un semáforo que no 
especifica el orden en que los procesos 
son extraídos de la cola es un semáforo 
débil.
63
Ejemplo de mecanismo de semáforo fuerte:
DCA
CA
BDCs = 1
s = 0
s = -1
A
B
D
procesador
semáforoCola de bloqueados Cola de listos
Cola de listos
Cola de listos
Cola de bloqueados
Cola de bloqueados
1
2
3
64
CAB
AB C
ABDs = 0
s = -3
s = -2
C
D
D
Cola de bloqueados Cola de listos
Cola de listos
Cola de listos
Cola de bloqueados
Cola de bloqueados
5
6
7
CABs = 0
D
Cola de listosCola de bloqueados
4
65
El problema de la exclusión mutua se puede 
resolver correctamente usando los 
semáforos con sus respectivas operaciones.
Los semáforos fuertes garantizan estar libres 
de inanición, mientras que los semáforos 
débiles no.
Se asumirán semáforos fuertes dado que 
son más convenientes y porque ésta es la 
forma típica del semáforo proporcionado por 
los SO.
Exclusión mutua usando semáforosExclusión mutua usando semáforos
66
/* programa exclusión mutua */
const int n= /* número de procesos */;
semafore s = 1;
void P(int i)
{
while (true)
{
semWait(s);
/* sección crítica */;
semSignal(s);
/* resto */
} 
} 
void main()
{
paralelos (P(1), P(2),…..,P(n));
}
67
En algún sistema están trabajando en 
paralelo N (N>=1) procesos de productores 
y K(K>=1) procesos consumidores. Cada 
proceso productor está preparando una 
porción de datos, mandándola después para 
que la pueda usar alguno de los 
consumidores. Cada proceso consumidor 
recibe una porción de datos y la consume
El problema productor/consumidorEl problema productor/consumidor
68
Productor:
while (true)
{
/*preparación de datos*/;
/*envio de datos*/;
} 
Consumidor:
while (true)
{
/*recepción de datos*/;
/*consumo de datos*/;
} 
69
Es decir, hay uno o más procesos generando 
algún tipo de datos (registros, caracteres) y 
poniéndolos en un buffer. Hay un único 
consumidor que está extrayendo datos de 
dicho buffer de uno en uno. El sistema está
obligado a impedir la superposición de las 
operaciones sobre los datos.
Asumiremos que el buffer es infinito (buffer 
no restringido) y consiste en un vector de 
datos:
70
Productor:
while (true)
{
/*producir dato v */;
b[entra] = v;
entra++;
} 
Consumidor:
while (true)
{
while (entra <= sale)
/*no hacer nada*/;
w = b[sale];
sale++
/*consumir dato w */
} 
71
/* programa productor consumidor con */
/* buffer infinito usando semáforos binarios */
int n;
binary_semaphore s = 1;
binary_semaphore retardo = 0;
void productor()
{
while (true)
{
producir();
semWaitB(s);
anyadir();
n++;
if (n==1) semSignalB(retardo);
semSignalB(s)
} 
} 
72
void consumidor()
{
int m; /* una variable local */ 
semWaitB(retardo);
while (true)
{
semWaitB(s);
extraer();
n--;
m = n;
semSignalB(s);
consumir();
if (m==0) semWaitB(retardo);} 
} 
void main()
{
n = 0;
paralelos (productor, consumidor);
}
73
MonitoresMonitores
Los semáforos proporcionan una 
herramienta potente y flexible para 
conseguir la exclusión mutua y para la 
coordinación de procesos. Sin embargo, 
puede ser difícil producir un programa 
correcto utilizando semáforos. La dificultad 
es que las operaciones semWait y 
semSignal pueden estar dispersas a través 
de un programa y no resulta fácil ver el 
efecto global de estas operaciones sobre 
los semáforos a los que afectan.
74
El monitor es una construcción del 
lenguaje de programación que proporciona 
una funcionalidad equivalente a la de los 
semáforos pero es más fácil de controlar.
La construcción monitor ha sido 
implementada en cierto número de 
lenguajes de programación, incluyendo 
Pascal Concurrente, Pascal-Plus, Modula-2, 
Modula-3 y Java. También ha sido 
implementada como una biblioteca de 
programa.
75
Un monitor es un módulo software 
consistente en uno o más procedimientos, 
una secuencia de inicialización y datos 
locales. Las características son:
Las variables locales de datos son 
solo accesibles por los procedimientos 
del monitor y no por ningún 
procedimiento externo
Un proceso entra en el monitor 
invocando uno de sus procedimientos
Monitor con señalMonitor con señal
76
Sólo un proceso puede estar 
ejecutando dentro del monitor al tiempo; 
cualquier otro proceso que haya 
invocado al monitor se bloquea, en 
espera de que el monitor quede 
disponible
Las 2 primeras características guardan 
semejanza con las de los objetos en 
software OO.
77
/* programa productor consumidor usando monitor */
monitor bufferacotado;
char buffer[N];
int dentro, fuera;
int cuenta;
cond nolleno, novacio;
void anyadir(char x) {
if (cuenta == N)
cwait(nolleno);
buffer[dentro] = x;
dentro = (dentro +1) % N;
cuenta++;
csignal(novacio); } 
Void extraer (char x) {
if (cuenta == 0) 
cwait(novacio);
x = buffer[fuera];
fuera = (fuera + 1) % N;
cuenta--;
csignal(no lleno); } 
{
dentro = 0; fuera = 0; cuenta = 0;
} 
78
void productor()
{
char x;
while (true)
{
producir(x);
anyadir(x);
}
} 
void consumidor()
{
char x;
while (true)
{
extraer(x);
consumir(x);
}
}
Void main()
{
paralelos (productor, consumidor);
} 
79
Paso de mensajesPaso de mensajes
Cuando los procesos interaccionan entre sí, 
deben satisfacerse 2 requisitos 
fundamentales: sincronización y 
comunicación.
Los proceso necesitan ser sincronizados 
para conseguir exclusión mutua.
Los procesos cooperantes pueden necesitar 
intercambiar información. 
Un enfoque que proporciona ambas 
funciones es el paso de mensajes.
80
El paso de mensajes tiene la ventaja 
añadida de que se presta a ser 
implementado tanto en sistemas 
distribuidos como en multiprocesadores de 
memoria compartida y sistemas 
monoprocesador.
La funcionalidad real del paso de mensajes 
se da en forma de un par de primitivas:
send(destino, mensaje)
receive(origen, mensaje)
81
Formato de mensajeFormato de mensaje
S1 R1
S1
Sn
R1
R1
Sn
S1
S1
Sn
R1
Rn
PUERTO
BUZON
PUERTO
BUZON
a) uno a uno
c) uno a muchos
b) Muchos a uno
d) Muchos a muchos