Stallings
Stallings
P() Q()
{ {
A; D;
B; E;
C; }
}
Indicar todas las posibles intercalaciones de los dos procesos anteriores (indicarlo por
medio de trazas de ejecución dadas en términos de sentencias atómicas).
2.- Considere la siguiente función llamada por un pthread_create donde dos hilos
incrementan una variable global.
int cuenta;
void total()
{
int i;
for(i=0;i<1000;i++)
cuenta++;
}
1. Determinar los valores mínimos y máximos que puede tomar la variable cuenta.
Suponga que incrementar una variable en memoria requiere 3 operaciones
a. Carga la variable en un registro
b. Incrementa el registro
c. Carga el registro en la variable
2. Supóngase que se permite ejecutar un número arbitrario de procesos bajo el
apartado (a), ¿qué efecto tendría esa modificación
int bloqueado[2];
int turno;
void P(int id)
{
while(cierto)
{
bloqueado[id]=cierto;
1
while(turno!=id)
{
while(bloqueado[1-id])
{
turno=id;
}
}
/* Sección crítica */
bloqueado[id]=falso;
/* Resto */
}
}
4.- El código que se muestra en la Figura 1 es el intento donde dos procesos P(0) y P(1)
se sincronizan a través de un algoritmo por software empleando variables en memoria
compartida.
Haga un análisis de la ejecución concurrente de los dos procesos en una tabla donde se
muestra la ejecución intercalada de instrucciones de ambos procesos, y muestre si esta
solución funciona o no funciona, en caso de no funcionar explique el por qué.
boolean flag[2];
int turno=0;
P(i)
{
j=1-i;
while(forever)
{
turno=j;
while(flag[j] && turno!=i){};
flag[i]:=true;
CS
flag[i]:=false;
RS
}
}
Figura 1. Código que ejecutan P(0) y P(1)
5.- Compara las definiciones de semáforos enteros donde los semáforos enteros pueden
tomar valores negativos y aquellos donde no toman valores negativos, ¿hay alguna
diferencia en el efecto de las dos definiciones cuando se utilizan para sincronizar
2
procesos? Es decir, ¿es posible sustituir una definición por la otra sin alterar el
significado del programa?
6.- Probar la corrección del algoritmo de Dekker y que se respeta la exclusión mutua.
Pista: demostrar que cuando Pi entra en su sección crítica es cierta la siguiente expresión:
Probar que un proceso que solicita acceso a su sección crítica no será retrasado
indefinidamente. Pista: considérense los siguientes casos: (1) un único proceso
intenta entrar en la sección crítica y (2a) turno=0 y señal[0]=falso y (2b)
turno=0 y señal[0]=cierto.
turno=1-i
turno=(turno+1)%n /*n es el número de procesos*/
Program buffer_limitado;
const tamaño_buffer=...;
var s:semáforo(:=1);
n:semáforo(:=0);
e:semáforo(:=Tamaño_buffer);
procedure productor;
begin
repeat
producir;
wait(e);
wait(s);
añadir;
signal(s);
signal(n);
forever
end;
procedure consumidor;
begin
repeat
3
wait(n);
wait(s);
tomar;
signal(s);
signal(e);
consumir;
forever
end;
begin
parbegin
productor;consumidor
parend
end.
11.- De ser posible implementar semáforos generales por medio de semáforos binarios.
Se pueden usar las operaciones WaitB y SignalB y dos semáforos binarios espera y
exmut. Considere lo siguiente:
Typedef struct {
int Contador;
BinSemaphore espera=0;
} semáforo
BinSemaphore exmut=1;
4
void Wait(semáforo s)
{
WaitB(exmut);
s.contador--;
if(s.contador!=0)
{
SignalB(exmut);
WaitB(s.espera);
}
else
Signal(exmut);
}
void Signal(semáforo s)
{
Waitb(exmut);
s.contador++;
If(s.contador!=0)
SignalB(s.espera);
SinalB(exmut);
}
Plantee una solución que resuelva correctamente con semáforos binarios dicho problema.
5
// Constantes
const int K=2;
const int N=4;
// Variables
int contador;
int bloqueados=0;
binarysem mutex=1;
binarysem retardo=0;
void proceso()
{
1: wait(mutex);
2: if(contador==0)
{
3: bloquados++;
4: wait(retardo);
}
else
5: contador--;
6: signal(mutex);
// Sección crítica
7: wait(mutex);
8: if(bloqueados>0)
{
9: signal(retardo);
10: bloqueados--;
}
11: else
12: contador++;
13: signal(mutex);
}
void main()
{
14: contador=K;
cobegin
{
15: proceso(); proceso(); proceso();proceso();
}
}
6
13.- En el caso del problema del productor consumidor que se muestra en la Figura 2, la
sincronización se hace con un monitor con notificación definido a partir de semáforos.
Para esto fue necesario implantar las funciones:
El problema es que la librería donde se definen esta funciones se extravió, por lo que es
necesario re-definirlas.
Defina utilizando pseudocódigo los semáforos necesarios y estas cuatro funciones para
que a partir de semáforos, agrega_al_buffer() y tomar_del_buffer() se
comporten como procedimientos de un monitor.
int agrega_al_buffer(e)
{
enter_monitor();
while(elementos==MAX_CAPACIDAD)
cwait();
ent++;
end=ent%MAX_CAPACIDAD;
buffer[ent]=e;
elementos++;
cnotify();
leave_monitor();
}
int tomar_del_buffer()
{
enter_monitor();
while(elementos==0)
cwait();
sal++;
sal=sal%MAX_CAPACIDAD;
e=buffer[sal];
elementos-- ;
cnotify();
leave_monitor();
7
return(e);
}
int Productor()
{
int e;
while(forever)
{
e=Produce_elemento();
agrega_al_buffer(e);
}
}
int Consumidor()
{
int e;
while(forever)
{
e=tomar_del_buffer();
consumir(e);
}
}
Figura 2.- Ejemplo del productor consumidor con monitores.
8
18.- El parque jurásico está formado por un museo de dinosaurios y un parque para
excursionistas de safari. Hay m pasajeros y n coches monoplaza. Los pasajeros dan
vueltas por el museo durante un tiempo y después se ponen en fila para dar un paseo en
un coche de safari. Cuando el coche está disponible, carga un pasajero, carga un pasajero
y recorre el parque durante un tiempo aleatorio. Si los n coches están todos dando vueltas
a los pasajeros, los que quieren subir deben esperar; si un coche está listo para recoger
pasajeros, pero no hay ninguno esperando, el coche debe esperar. Use semáforos para
sincronizar los procesos de los m pasajeros con los m coches.
Semaphore coche_vacio=0;
Semaphore tomar_coche=0;
Semaphore coche_lleno=0;
Semaphore pasaje_libre=0;
Pasajero()
{
while(forever)
{
sleep(tiempo_aleatorio);
wait(coche_vacio);
signal(tomar_coche);
wait(coche_lleno);
wait(pasaje_libre);
}
}
Coche()
{
while(forever)
{
signal(coche_vacio);
wait(tomar_coche);
signal(coche_lleno);
sleep(tiempo_aleatorio);
signal(pasaje_libre);
}
}
main()
{
int i;
cobegin
{
for(i=0;i<M;i++) Pasajero();
9
for(i=0;i<N;i++) Coche();
}
}
19.- Demostrar que el paso de mensajes y los semáforos tienen una funcionalidad
equivalente:
Implementando el paso de mensajes por medio de semáforos. Pista: haga uso de
un área de elementos compartidos para contener buzones, cada uno de ellos
formado por un arreglo de espacios para este mensaje.
Implementando un semáforo por medio del paso de mensajes. Pista: cree un
proceso independiente para la sincronización.
/*
This simple code demonstrates CreateEvent, WaitForMultipleObjects
Win32 API functions and event objects.
#include <stdio.h>
#include <conio.h>
#include <time.h>
#include <windows.h>
#include <math.h>
#define NUMTHREADS 4
#define SERIES_MEMBER_COUNT 20000
10
for( int i=0; i<n; i++ )
numerator = numerator*x;
if ( n % 2 == 0 )
return ( - numerator / n );
else
return numerator/n;
}
while(!startall);
sums[threadIndex] = 0;
for(int i=threadIndex; i<SERIES_MEMBER_COUNT;i+=NUMTHREADS)
sums[threadIndex] += getMember(i+1, x);
delete par;
return 0;
}
void main()
{
threadHandles = new HANDLE[NUMTHREADS + 1];
InitializeCriticalSection(&countCS);
sums = new double[NUMTHREADS];
clock_t start,stop;
start=clock();
for(int i=0; i<NUMTHREADS;i++)
{
int * threadIdPtr = new int;
*threadIdPtr = i;
threadHandles[i] = CreateThread(NULL, 0, threadProc,
threadIdPtr, 0, NULL);
11
}
threadHandles[NUMTHREADS] = CreateThread(NULL, 0,
masterThreadProc, NULL, 0, NULL);
WaitForMultipleObjects(NUMTHREADS+1,threadHandles,TRUE,INFINITE);
stop=clock();
delete threadHandles;
DeleteCriticalSection(&countCS);
delete sums;
Interbloqueo
1.- Defina el bloqueo mutuo.
3.- Cite tres ejemplos de bloqueos mutuos no relacionados con un entorno de sistema de
computación.
12
1. Demuestre que las cuatro condiciones necesarias para el bloqueo mutuo se
cumplen en este ejemplo.
2. plantee una regla sencilla que evite los bloqueos mutuos en tal sistema
6.- Resuelva el problema de la cena de los filósofos por medio de monitores en vez de
semáforos.
7.- El garage llamado “Arregla tu Casa” presta herramientas a trabajadores que requieren
hacer reparaciones a su casa.
Para hacer todas las reparaciones a sus casas los trabajadores necesitarán tener en un
momento dado todas las herramientas que se listan a continuación:
Los trabajadores van haciendo sus solicitudes conformen inician las obras y van
requiriendo la herramienta, en una primera solicitud de herramientas solicitan lo
siguiente:
13
a).- Haz una tabla que muestre cuantas herramientas les hace falta a cada uno de los
trabajadores para terminar sus respectivos trabajos.
b).- Supón que una hora más tarde Alberto llega al garage y hace una segunda solicitud:
¿Es posible conceder el préstamo y que el garage siga teniendo las herramientas
disponibles para seguir prestando y asegurar que al menos uno de los trabajadores va a
terminar su trabajo y va a devolver las herramientas?
c).- Supón que en vez de ser Alberto el que llega una hora más tarde es Juan y hace una
segunda solicitud:
¿Es posible conceder el préstamo y que el garage siga teniendo las herramientas
disponibles para seguir prestando y asegurar que al menos uno de los trabajadores va a
terminar su trabajo y va a devolver las herramientas?
d).- ¿Es posible que haya un algoritmo que le permite al administrador del Garage saber
si debe conceder una solicitud?, si es así, diseña un algoritmo.
14