Actualizado el 21 de Marzo del 2018 (Publicado el 23 de Febrero del 2018)
675 visualizaciones desde el 23 de Febrero del 2018
44,2 KB
3 paginas
Creado hace 21a (17/03/2004)
Contenidos
(cid:132) El problema de la sección crÃtica
(cid:132) Semáforos
(cid:132) Regiones crÃticas
(cid:132) Monitores
BibliografÃa
(cid:132) Programación Concurrente
(cid:132) J. Palma, C. Garrido, F. Sánchez, A. Quesada, 2003
(cid:132) CapÃtulo 4
(cid:132) Principles of Concurrent and Distributed Programming
(cid:132) M. Ben-Ari. Prentice Hall, 1990
(cid:132) CapÃtulo 4
(cid:132) Sistemas Operativos
(cid:132) A. Silberschatz, P. Galvin. Addison-Wesley, 1999
(cid:132) CapÃtulo 6
© Alexis Quesada Arencibia – José Miguel Santos Espino
ProgramaciónConcurrente
1
© Alexis Quesada Arencibia – José Miguel Santos Espino
ProgramaciónConcurrente
2
Concepto de semáforo
(cid:132) Una variable entera con dos
operaciones atómicas:
(cid:132) Wait(s). si s>0 (cid:198) s:=s-1; si no,
suspende al proceso. (P(s))
(cid:132) Signal(s). si hay procesos
suspendidos, despierta uno; si no,
s:=s+1. (V(s))
Propiedades de los semáforos
(cid:132) wait(s) y signal(s) son instrucciones
atómicas
(cid:132) El semáforo debe tomar un valor inicial
positivo
(cid:132) La operación signal(s) despierta uno de
los procesos bloqueados. La definición
de la operación no especifica qué
proceso es despertado
© Alexis Quesada Arencibia – José Miguel Santos Espino
ProgramaciónConcurrente
3
© Alexis Quesada Arencibia – José Miguel Santos Espino
ProgramaciónConcurrente
4
Semáforos binarios
(cid:132) Un semáforo que pueda tomar cualquier valor
no negativo recibe el nombre de semáforo
general
(cid:132) Un semáforo que sólo puede tomar los
valores 0 y 1 recibe el nombre de semáforo
binario
(cid:132) La definición de las operaciones queda igual
salvo signa(s)
(cid:132) Si hay procesos suspendidos, despierta uno, si no,
s:=1
Invariantes del semáforo
(cid:132) Todo semáforo, al margen de su
implementación, debe cumplir los invariantes:
(cid:132) S >= 0
(cid:132) S = Sinicial + #signals - #waits
(cid:132) #signals es la cantidad de signal ejecutados en S
(cid:132) #waits es la cantidad de waits completados en S
© Alexis Quesada Arencibia – José Miguel Santos Espino
ProgramaciónConcurrente
5
© Alexis Quesada Arencibia – José Miguel Santos Espino
ProgramaciónConcurrente
6
1
Ejercicios
(cid:132) a.-) Resolver el problema de la sección
crÃtica para n procesos con semáforos
Ejercicios
(cid:132) b.-) Resolver diversos problemas de sincronización
(cid:132) b.1.-) Empleando la sentencia concurrente (cobegin, coend)
y semáforos, construir un programa concurrente que se
corresponda con el siguiente grafo de precedencia
A
B
C
D
© Alexis Quesada Arencibia – José Miguel Santos Espino
ProgramaciónConcurrente
7
© Alexis Quesada Arencibia – José Miguel Santos Espino
ProgramaciónConcurrente
8
Ejercicios
Implementación
(cid:132) b.2.-) Supongamos tres procesos concurrentes P1, P2 y P3 con
el código que se muestra en las figuras. Se pide:
(cid:132) 1.- Introducir las modificaciones necesarias para que d se ejecute
(cid:132) 2.- Introducir las modificaciones necesarias para que d se ejecute
solo si e o a se han ejecutado
solo si e y a se han ejecutado
Process P1;
begin
repeat
Process P2;
begin
repeat
Process P3;
begin
repeat
a;
b;
c;
d;
e;
f;
forever;
end;
forever;
end;
forever;
end;
(cid:132) Espera activa
wait(s):
loop
exit when s>0;
end loop;
s:=s-1;
signal(s):
s:=s+1;
© Alexis Quesada Arencibia – José Miguel Santos Espino
ProgramaciónConcurrente
9
© Alexis Quesada Arencibia – José Miguel Santos Espino
ProgramaciónConcurrente
10
Implementación
Implementación
(cid:132) Sin espera activa (1)
type semaforo is
record
valor:integer;
L: ListaProceso;
end;
(cid:132) Sin espera activa (2)
type semaforo is
record
valor:integer;
L: ListaProceso;
end;
wait(s):
signal(s):
wait(s):
signal(s):
s.valor:=s.valor-1;
if s.valor<0 then
L.agregar(proceso);
bloquear;
end if;
s.valor:=s.valor+1;
if s.valor<=0 then
L.sacar(proceso);
despertar(proceso);
end if;
if s.valor>0 then
s.valor:=s.valor-1;
else
L.agregar(proceso);
bloquear;
end if;
if not vacia(L) then
L.sacar(proceso);
despertar(proceso);
else
s.valor:=s.valor+1;
end if;
© Alexis Quesada Arencibia – José Miguel Santos Espino
ProgramaciónConcurrente
11
© Alexis Quesada Arencibia – José Miguel Santos Espino
ProgramaciónConcurrente
12
2
Implementación (Nachos)
Semaphore::Semaphore(char* debugName,
int initialValue)
{
name = debugName;
value = initialValue;
queue = new List;
}
Semaphore::~Semaphore()
{
delete queue;
}
void
Semaphore::P()
{
void
Semaphore::V()
{
IntStatus oldLevel = interrupt->SetLevel(IntOff);
while (value == 0) {
queue->Append((void *)currentThread);
currentThread->Sleep();
}
value--;
(void) interrupt->SetLevel(oldLevel);
Thread *thread;
IntStatus oldLevel = interrupt->SetLevel(IntOff);
thread = (Thread *)queue->Remove();
if (thread != NULL)
scheduler->ReadyToRun(thread);
value++;
(void) interrupt->SetLevel(oldLevel);
}
}
Implementación
(cid:132) Aspecto crÃtico de los semáforos:
(cid:132) Operaciones se ejecuten de forma atómica
(cid:132) Entorno uniprocesador:
(cid:132) interrupciones
(cid:132) Entorno multiprocesador
(cid:132) Instrucciones hardware especiales
(cid:132) Solución software (espera activa)
© Alexis Quesada Arencibia – José Miguel Santos Espino
ProgramaciónConcurrente
13
© Alexis Quesada Arencibia – José Miguel Santos Espino
ProgramaciónConcurrente
14
Problemas
(cid:132) Mecanismo de bajo nivel: no estructurado
(cid:132) Aunque entienda perfectamente su uso, un programador
puede olvidar accidentalmente alguna de las operaciones
(signal o wait) o realizarlas sobre semáforos distintos
(cid:132) Uso desordenado de las primitivas podrÃa provocar que no
se consiga la exclusión mutua (signal, wait)
(cid:132) Bloqueos mutuos
(cid:132) El compilador no reconoce qué variables protege un
semáforo, con lo cual no nos ayudarÃa si estamos
utilizando una variable compartida fuera de su SC
Problemas
(cid:132) Tanto la exclusión mutua como la condición
de sincronización se implementan usando el
mismo par de primitivas
(cid:132) DifÃcil identificar el propósito de waity signalen
un código sin mirar el contexto global
(cid:132) Código difÃcil de mantener
(cid:132) Código de sincronización repartido entre los
diferentes procesos
© Alexis Quesada Arencibia – José Miguel Santos Espino
ProgramaciónConcurrente
15
© Alexis Quesada Arencibia – José Miguel Santos Espino
ProgramaciónConcurrente
16
Ejercicios
Ejercicios
(cid:132) Tenemos un sistema con un conjunto de N tareas (procesos):
tarea1, tarea2, ...,tareaN. Cada tarea debe ejecutarse
periódicamente cada cierto intervalo de tiempo. Por ejemplo: la
tarea1 debe ejecutarse cada segundo, la tarea2 cada 10
segundos, etc... Los intervalos de tiempo para cada tarea están
predefinidos y se almacenan como datos del programa (por
ejemplo en un array). Durantes estos intervalos las tareas están
dormidas. Se pide programar un planificador que arranque las
tareas cuando les corresponda.
(cid:132) NOTA: Las tareas ejecutarán un proceso trivial. Tenemos la
sentencia cobegin, coend. El temporizador se puede resolver con
un reloj software (un contador que se va decrementando).
(cid:132) En un sistema concurrente existen dos tipos de procesos, A y B,
que compiten por utilizar cierto recurso. Al recurso se accede
mediante la rutina de solicitarlo, esperar hasta que se pueda
usar, usarlo y luego liberarlo. En cualquier momento puede
haber un máximo de N procesos de cualquier tipo usando el
recurso (N es constante). Por otro lado, para que un proceso de
tipo A pueda entrar a emplear el recurso, debe haber al menos
el doble de procesos de tipo B que procesos de tipo A dentro del
recurso. Diseñe un algoritmo que cumpla con estas reglas de
funcionamiento empleando semáforos.
© Alexis Quesada Arencibia – José Miguel Santos Espino
ProgramaciónConcurrente
17
© Alexis Quesada Arencibia – José Miguel Santos Espino
ProgramaciónConcurrente
18
3
Comentarios de: Tema 2. Semáforos (0)
No hay comentarios