Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Clase 7
U3 Interbloqueos (Deadlocks) I
●
A veces, un proceso bloqueado nunca más
puede cambiar de estado, porque los recursos Proceso 1 Proceso 2
que ha solicitado están en manos de otros
procesos, los cuales están esperando que el
proceso bloqueado realice una determinada esperando por
asignado a
Recurso 2
acción.
– Esta situación se llama un interbloqueo
(Deadlock).
A principios del siglo XX se aprobó esta ley
{ down(&resource1);
down(&resource2);
down(&resource1);
use both resources( );
use resource1( );
up(&resource2);
up(&resource1); up(&resource1);
} }
Libre de bloqueos o con bloqueo potencial
Código typedef int semaphore;
Código typedef int semaphore;
semaphore resource1; semaphore resource1;
libre de semaphore resource2;
con un semaphore resource2;
bloqueos bloqueo
void processA(void) {
potencial void processA(void) {
down(&resource1); down(&resource1);
down(&resource2); down(&resource2);
use both resources(); use both resources();
up(&resource2); up(&resource2);
up(&resource1); up(&resource1);
} }
/* philosopher i loop */
while (TRUE) {
DOWN(chopstick[i]);
DOWN(chopstick[(i+1) mod N]);
eat();
UP(chopstick[i]);
UP(chopstick[(i+1) mod N]);
think(); Código
}
●
Si a este código le agregamos la condición que los semáforos se adquieran en
orden numérico
– Solucionamos los bloqueos ( pero puede haber inanición)
Detección de interbloqueos
Aún si no podemos prevenir los interbloqueos, quizás podamos
detectarlos sistemáticamente.
Además vamos a necesitar un esquema para la
recuperación
O sea:
algoritmos para detectar los bloqueos mutuos
teoría de los grafos
Una manera de deshacer (undoing) lo hecho antes que
ocurriera el bloqueo
Revertir la transacción ("Rollback”).
Grafos
Pedido de un recurso
El proceso tiene un recurso
Código con bloqueo potencial (1)
typedef int semaphore;
semaphore resource1;
semaphore resource2;
void processA(void) {
down(&resource1);
down(&resource2);
use both resources( );
up(&resource2);
up(&resource1);
}
void processB(void) {
down(&resource2);
down(&resource1);
use both resources( );
up(&resource1);
up(&resource2);
}
Código con bloqueo potencial (2)
typedef int semaphore;
semaphore resource1;
semaphore resource2;
void processA(void) {
down(&resource1);
down(&resource2);
use both resources( );
up(&resource2);
up(&resource1);
}
void processB(void) {
down(&resource2);
down(&resource1);
use both resources( );
up(&resource1);
up(&resource2);
}
Código con bloqueo potencial (3)
typedef int semaphore;
semaphore resource1;
semaphore resource2;
void processA(void) {
down(&resource1);
down(&resource2);
use both resources( );
up(&resource2);
up(&resource1);
}
void processB(void) {
down(&resource2);
down(&resource1);
use both resources( );
up(&resource1);
up(&resource2);
}
Código con bloqueo potencial (4)
typedef int semaphore;
semaphore resource1;
semaphore resource2;
void processA(void) {
down(&resource1);
down(&resource2);
use both resources( );
up(&resource2);
up(&resource1);
}
void processB(void) {
down(&resource2);
down(&resource1);
use both resources( );
up(&resource1);
up(&resource2);
}
Recursos con varias instancias
Recursos con varias instancias
¿Hay buenos algoritmos de detección de bloqueos?