Sie sind auf Seite 1von 5

PROBLEMAS SEMAFOROS

- Problema propuesto 1
var em_fichero:semaphore; // inicializado a 1 em_sumado:semaphore; // inicializado a 1 sumado:integer; // inicializado a 0 Sfinal:integer; S:array[1..2] of integer; // inicializado a 0; fichero:; // fichero compartido

SOLUCION
process proceso(i:integer); var n:integer; begin wait(em_fichero); while not eof(fichero) do begin read(fichero,n); signal(em_fichero); S[i]:=S[i]+n; wait(em_fichero); end; signal(em_fichero); wait(e m_sumado); if (sumado=0) then sumado:=1; else Sfinal:=S[1]+S[2]; signal(em_sumado); end;

- Problema propuesto 2
type tipoelemento=record of proceso:integer; // inicializado a 0 inform:item; end; var mutex:semaphore; // inicializado a 1; huecos:semaphore; // inicializado a n; llenos:semaphore; // inicializado a 0; buffer:array[1..n] of tipoelemento;

Process productor(i:integer); // var item:item; k:integer; begin repeat producir(item); // wait(huecos); wait(mutex); k:=1; while buffer[k].proceso!=0 do k:=k+1; buffer[k].proceso:=i; buffer[k].inform:=item; signal(mutex); signal(llenos); forever end;

process consumidor(i:integer); // var item:item; k:integer; begin repeat wait(llenos); wait(mutex); k:=1; while buffer[k].proceso!=i do k:=k+1; item:=buffer[k].inform; buffer[k].proceso:=0; signal(mutex); signal(huecos); consumir(item); // forever end;

lleno:semaphore

llenos:array[1..2] of semaphore; //inicializado a 0

Process productor(i:integer); // var item:item; k:integer; begin repeat producir(item); // wait(huecos); wait(mutex); k:=1; while buffer[k].proceso!=0 do k:=k+1; buffer[k].proceso:=i; buffer[k].inform:=item; signal(mutex); signal(llenos[i]); // forever end;

process consumidor(i:integer); // var item:item; k:integer; begin repeat wait(llenos[i]); //SE CAMBIA wait(mutex); k:=1; while buffer[k].proceso!=i do k:=k+1; item:=buffer[k].inform; buffer[k].proceso:=0; signal(mutex); signal(huecos); consumir(item); // forever end;

Problema: Supongamos un buffer compartido por varios procesos consumidores y un proceso productor. Los consumidores extraen un elemento cada vez que acceden al buffer. Cuando el buffer queda vaco, el consumidor que lo detecta avisa al productor que llenar todo el buffer de elementos. El productor, por lo tanto, slo accede al buffer cuando ste est totalmente vaco y lo llena (suponemos que ya tiene generados tantos elementos como capacidad tiene el buffer).
var llenar:semaphore; // inicializado a 1; espera:semaphore; // inicializado a 0 tamao:integer; //inicializada a 0

process productor; begin wait(llenar); /*llenar el buffer;*/ tamao:=N; signal(espera); end; process type consumidor; begin wait(espera); /*sacar un elemento*/ tamao:=tamao-1; if tamao=0 then signal(llenar); else signal(espera); end;

Problema: Se tiene un sistema con un gran nmero de procesos que quieren acceder a un determinado recurso, e interesa que puedan acceder simultneamente el mximo nmero de ellos. Por ejemplo, si 100 procesos quieren acceder al recurso, deben de poder hacerlo los 100 simultneamente. Ahora bien, tambin es necesario impedir (por razones supersticiosas) que alguna vez estn trece procesos exactamente accediendo al recurso al mismo tiempo. Implementar los protocolos de entrada y de salida de un proceso tipo a la hora de acceder a dicho recurso. Consideraremos que un proceso ha abandonado el recurso (y por lo tanto no tiene acceso al recurso) cuando ha ejecutado con xito el protocolo de salida.
process type usuario; begin Protocolo de entrada; Acceso al recurso; Protocolo de salida; Recurso abandonado; end;

var mutex:semaphore; // inicializado a 1; espera:semaphore; // inicializado a 0 np,esp:integer; //inicializadas a 0

process type usuario; begin wait(mutex); np:=np+1; if (np=13) then begin esp:=esp+1; signal(mutex); wait(espera); esp:=esp-1; signal(mutex); end else if esp<>0 then signal(espera) else signal(mutex); ACCEDE AL RECURSO; wait(mutex); np:=np-1; if (np=13) then begin esp:=esp+1; signal(mutex); wait(espera); esp:=esp-1; signal(mutex); end else if esp<>0 then signal(espera) else signal(mutex); end;

Problema: Supongamos que estamos en una discoteca y resulta que est estropeado el servicio de chicas y todos tienen que compartir el de chicos. Se pretende establecer un protocolo de entrada al servicio usando semforos en el que se cumplan las siguientes restricciones: Chicas slo puede haber una a la vez en el servicio. Chicos puede haber ms de uno, pero con un mximo de cinco. (Versin machista) Los chicos tienen preferencia sobre las chicas. Esto quiere decir que si una chica est esperando y llega un chico, ste puede pasar. Incluso si no puede entrar en el servicio porque hay ya cinco chicos, pasar antes que la chica cuando salga algn chico. (Versin feminista) Las chicas tienen preferencia sobre los chicos. Esto quiere decir que si un chico est esperando y llega una chica, sta debe pasar antes. Incluso si no puede entrar en el servicio porque hay una chica, pasar antes que el chico cuando salga la chica.
var mutex:semaphore; // inicializado a 1 chicos,chicas:semaphore; // inicializados a 0 nod,nad,noe,nae:integer; // inicializados a 0

Version Machista:
process type chico(i:integer); begin wait(mutex); if ((nod<5) and (nad=0)) then nod:=nod+1; signal(mutex) noe:=noe+1; signal(mutex); wait(chicos); else noe:=noe-1; nod:=nod+1; if((noe>0) and (nod<5)) then signal(chicos) else signal(mutex); (* DENTRO *) wait(mutex); nod:=nod-1; if(noe>0) then signal(chicos) else if((nae>0) and (nod=0)) then signal(chicas) else signal(mutex); end; process type chica(i:integer); begin wait(mutex); if((nod=0) and (nad=0)) then nad:=nad+1; signal(mutex) nae:=nae+1; signal(mutex); else wait(chicas); nae:=nae-1; nad:=nad+1; signal(mutex) (* DENTRO *) wait(mutex); nad:=nad-1; if (noe>0) then signal(chicos) else if (nae>0) then signal(chicas) else signal(mutex); end;

Version Feminista:
process type chico; begin wait(mutex); if ((nod<5) and (nad=0)) then nod:=nod+1; signal(mutex) noe:=noe+1; signal(mutex); wait(chicos); else noe:=noe-1; nod:=nod+1; if((noe>0) and (nod<5) and (nae=0)) then signal(chicos) else signal(mutex); (* DENTRO *) wait(mutex); nod:=nod-1; if ((nae>0) and (nod=0)) then signal(chicas) else if((noe>0) and (nae=0)) then signal(chicos) else signal(mutex); end; process type chica; begin wait(mutex); if((nod=0) and (nad=0)) then nad:=nad+1; signal(mutex); nae:=nae+1; signal(mutex); else wait(chicas); nae:=nae-1; nad:=nad+1; signal(mutex) (* DENTRO *) wait(mutex); nad:=nad-1; if (nae>0) then signal(chicas) else if (noe>0) then signal(chicos) else signal(mutex); end;

Das könnte Ihnen auch gefallen