Successfully reported this slideshow.

Bloqueos Mortales

3,236 views

Published on

Bloqueos Mortales

Published in: Technology, Business
  • Be the first to comment

Bloqueos Mortales

  1. 1. Bloqueos Mortales Cecilia Hernández 2007
  2. 2. Bloqueos Mortales <ul><li>Definición </li></ul><ul><ul><li>Un proceso/hebra esta bloqueada cuando esta esperando por un evento que nunca ocurrirá </li></ul></ul><ul><ul><li>Un proceso/hebra que esta en sección critica 1 espera por entrar a sección critica 2, mientras otro proceso/hebra esta en sección critica 2 y quiere entrar a sección critica 1 </li></ul></ul>
  3. 3. Condiciones bajo las cuales se produce bloqueo mortal <ul><li>Exclusión mutua : Sólo un proceso a la vez puede usar el recurso </li></ul><ul><li>No apropiación : Sistema no puede quitar arbitrariamente recurso a proceso </li></ul><ul><li>Retención y espera : Existen procesos que poseen recursos y esperan por otros recursos sin liberar los que tienen </li></ul><ul><li>Espera circular : Existe un conjunto de procesos { P0, P1, …, Pn) tales que Pi está esperando por un recurso retenido por Pi+1 para 0<= i<= n, y Pn está esperando recurso que posee P0 </li></ul>
  4. 4. Grafo de recursos P1 P2 R1 R2 Proceso tiene Recurso Proceso espera Recurso Bloqueo Mortal ocurre cuando hay un ciclo cerrado en el grafo de recursos como se muestra arriba
  5. 5. Grafo de recursos sin ciclo cerrado P1 P2 P3 R1 R2 R3 R4 Hay bloqueo mortal en este grafo?
  6. 6. Grafo de recursos 1 P1 P2 P3 R1 R2 R3 Hay bloqueo mortal en este grafo de recursos?
  7. 7. Grafo de recursos 2 P1 P2 R1 R2 P3 P4 Grafo de recursos con ciclo. Hay bloqueo mortal? Por que?
  8. 8. Usando semáforos Hay bloqueo mortal al invertir operaciones wait sobre semáforos en el consumer? Cuando ocurre? Productor while (true) { /* produce un item en proxProd */ wait(mutex); wait(vacio); buffer[in] = proxProd; in = (in + 1) % N; contador++; signal(mutex); signal(lleno); } Consumidor While(true){ wait(lleno); wait(mutex); proxCons = buffer[out]; out = (out + 1) % N; contador--; signal(mutex); signal(vacio); /* consume proxCons */ } int contador = 0; //indica número de items en buffer char buffer[N]; int in = 0; int out = 0; sem mutex=1; sem vacio = N; sem lleno = 0;
  9. 9. Como enfrentar bloqueos mortales? <ul><li>Prevención : No permitir que bloqueo mortal ocurra </li></ul><ul><ul><li>Proceso/Hebra adquiera todos los recursos a ocupar al inicio </li></ul></ul><ul><ul><ul><li>Problemas? </li></ul></ul></ul><ul><ul><li>Numerar recursos y procesos/hebras los adquieren en secuencia (implica que pueden obtener algunos antes que los necesiten) </li></ul></ul><ul><ul><ul><li>Por que funciona? </li></ul></ul></ul><ul><ul><ul><li>Problemas? </li></ul></ul></ul><ul><li>Detección y corrección </li></ul><ul><ul><li>Periódicamente revisar si hay ciclos y eliminarlos </li></ul></ul>
  10. 10. Caso de Filósofos Comensales <ul><li>Problema de Filósofos comensales </li></ul><ul><ul><li>Cada filósofo tiene su plato de arroz, con 5 palitos </li></ul></ul><ul><ul><li>5 filósofos se sientan a la mesa. Piensan por un rato y cuando les da hambre comen </li></ul></ul><ul><ul><li>Hay sólo 5 palitos en la mesa (cada persona necesita 2 palitos para comer arroz a la manera china) </li></ul></ul><ul><ul><li>Para poder comer cada filósofo tiene que obligatoriamente conseguir dos palitos </li></ul></ul><ul><li>Problema es importante porque introduce posibles problemas de Deadlock(bloqueo mortal) y Starvation(inanición) </li></ul><ul><li>Animación disponible en : </li></ul><ul><ul><li>http://www.doc.ic.ac.uk/~jnm/book/book_applets/Diners.html </li></ul></ul>
  11. 11. Ilustración
  12. 12. Posible solución usando semáforos <ul><li>Problemas </li></ul><ul><ul><li>Produce deadlock </li></ul></ul><ul><ul><li>Si todos simultaneamente toman palito izquierdo, no pueden tomar el palito derecho pues ya esta tomado por su vecino </li></ul></ul><ul><li>Posibles soluciones </li></ul><ul><ul><li>Solo 4 filósofos puedan comer a la vez </li></ul></ul><ul><ul><li>Uno de los filósofos toma primero el tenedor derecho y luego el izquierdo </li></ul></ul><ul><ul><li>Permitir que un filósofo tome sus tenedores sólo si ambos están disponibles (y hacerlo dentro de sección crítica) </li></ul></ul><ul><ul><li>Nota: cuando se evita bloqueo tambien se tiene que tener en cuenta que exista condicion en la cual algun filósofo de muera de hambre </li></ul></ul>semaforo palito[5]; do { … pensar(); … wait(palito[i]); wait(palito[(i+1)%5]; … . comer(); … signal(palito[i]); signal(palito[(i+1)%5]); } while(1);

×