Semaforos

4,125 views
3,990 views

Published on

Otros Problemas De Semaforos

1 Comment
2 Likes
Statistics
Notes
No Downloads
Views
Total views
4,125
On SlideShare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
155
Comments
1
Likes
2
Embeds 0
No embeds

No notes for slide

Semaforos

  1. 1. Ejemplos De Semaforos 08 De Septiembre del 2009
  2. 2. Base De Datos FILOSOFOS COMENSALES <ul><li>Enunciado Del Problema: </li></ul><ul><li>El número de cada proceso representa su ID y además el numero de bloqueos que el proceso utiliza de la DB. </li></ul><ul><li>Pueden haber varios procesos usando la DB pero la suma de los bloques utilizado no debe ser mayor a 100. </li></ul><ul><li>Pueden haber varios procesos usando la DB pero la suma de los bloques utilizados no debe ser mayor a 100. </li></ul>Proceso 1 Proceso 2 Proceso 3 Proceso 4 Proceso n
  3. 3. Solucion Del Problema: <ul><li>Filosofos Comensales: </li></ul><ul><li>Variables: </li></ul><ul><ul><li>Status[1..N] = ‘P’  --- Hace_Cosas() </li></ul></ul><ul><ul><li>‘ H’  --- Quiere_usarBD() </li></ul></ul><ul><ul><li>‘ C’  --- Usa_BD() </li></ul></ul><ul><li>Suma: Integer  --- La suma de bloques utilizados. </li></ul><ul><li>Semaforos: </li></ul><ul><ul><li>Exc_Mut  -- Recursos Compartidos </li></ul></ul><ul><ul><li>Sem[1..N]  -- Semaforo X Proceso </li></ul></ul><ul><li>Inicializacion: </li></ul><ul><li>suma=0; Is(Exc_Mut,1); </li></ul><ul><li>For i=1 to N{ </li></ul><ul><li>status[i]=‘P’ </li></ul><ul><li>Is(Semaforo;0); </li></ul><ul><li>} </li></ul>
  4. 4. Base De Datos FILOSOFOS COMENSALES Proceso(Integer i){ Repeat Hace_cosas(); Solicita_BD(i); Usa_BD(); Devuelve_BDD(); Hace_MasCosas(); } Solicita_BDD( Integer i){ Down(Exc_Mut); Status[i]=‘h’; test(i); up(Exc_Mut); Down(Exc_Mut); } Devuelve_BDD(Integer i){ Down(Exc_Mut); status[i]=‘P’; suma=suma-i; for j=50 down to 1 test(i); up(Exc_mut); } Test(Integer i){ If(suma+i<=100 and status[i]=‘h’) suma=suma+i; status[i]=‘c’; up(Sem[i]); }
  5. 5. Fumadores <ul><li>Enunciado Del Problema: </li></ul><ul><li>Cada fumador debe esperar que el agente coloque sobre la mesa los ingredientes que les hace falta. </li></ul><ul><li>Si un fumador esta fumando, el agente debe esperar hasta que el fumador termine. </li></ul>Fosforo Papel Tabaco Cant Infinita Cant Infinita
  6. 6. Solucion Del Problema: <ul><li>Variables y Semaforos: </li></ul><ul><ul><li>Esperar_fumadores </li></ul></ul><ul><ul><li>Fumar_tabaco </li></ul></ul><ul><ul><li>Fum_papel </li></ul></ul><ul><ul><li>Fum :Fosforo </li></ul></ul><ul><li>Inicializacion: </li></ul><ul><li>IS(Esperar_fumador,1); </li></ul><ul><li>IS(Fumador_tabaco,0); </li></ul><ul><li>IS(Fumador_papel,0); </li></ul><ul><li>IS(Fumador_fosforos,0); </li></ul>
  7. 7. Fumadores Agente(){ Repeat Hace_Cosas(); Tomar_Ingredientes(); Down(Esperar_fumador); if(Ingredientes==tabaco and papel){ up(fumador_fosforos); }else if(Ingredientes== tabaco and fosforos) {up(fumador_papel);} else{ Up(fumador_tabaco); } Hace_mas_cosas(); Until_fin; } Fum_Tabaco(){ Repeat Down(fumador_tabaco); Fumar(); Up(Esperar_fumador); Until_fin }
  8. 8. Puente Como Carretera <ul><li>Enunciado Del Problema: </li></ul><ul><li>Solo pueden pasar carros por un sentido. </li></ul><ul><li>No pueden haber mas de 10 carros al mismo tiempo. </li></ul><ul><li>Si hay mas de 10 carros da la vuelta. </li></ul>
  9. 9. Solucion Del Problema: <ul><li>Lectores y Escritores </li></ul><ul><li>Variables: </li></ul><ul><li>NCD </li></ul><ul><li>NCI </li></ul><ul><li>Semaforos: </li></ul><ul><li>Exc_MutD </li></ul><ul><li>Exc_MutI </li></ul><ul><li>Sema </li></ul><ul><li>Inicializacion: </li></ul><ul><li>NCD=0; </li></ul><ul><li>NCI=0; </li></ul><ul><li>IS(EXC_MUTD,1); </li></ul><ul><li>IS(EXC_MUTI,1); </li></ul><ul><li>IS(SEM,1); </li></ul>
  10. 10. <ul><li>//{El auto derecho es similar} </li></ul><ul><li>Autos_Izq{ </li></ul><ul><li>Repeat </li></ul><ul><li> down(Exc_MutI); </li></ul><ul><li>if(NCI<10){ </li></ul><ul><li>NCI=NCI+1; </li></ul><ul><li>if(NCI==1) </li></ul><ul><li>down(Sem); </li></ul><ul><li>Up(excMut); </li></ul><ul><li>Pasar(); </li></ul><ul><li>Down(Exc_Mut); </li></ul><ul><li>NCI=NC-1; </li></ul><ul><li>if(NCI==0) then </li></ul><ul><li>up(Sem); </li></ul><ul><li>UP(Exc_MutI); </li></ul><ul><li>}else up(Exc_mutI); </li></ul><ul><li>} </li></ul>

×