06 - Semaforos
-
Upload
anesuto-rojas -
Category
Documents
-
view
65 -
download
2
Transcript of 06 - Semaforos
Universidad Nacional Experimental de Guayana
Vicerrectorado académico.
Coordinación de Ingeniería en Informática.
Ing. Rodrigo Higuera
Universidad Nacional Experimental de Guayana- 2012 UNEG - Venezuela
Universidad Nacional Experimental de Guayana
Vicerrectorado académico.
Coordinación de Ingeniería en Informática.
Introducción
La variable especial denominada semáforo se utiliza para señalizar. Si un
proceso está esperando una señal, este se suspende hasta que la señal
haya sido enviada.
Un semáforo es una variable que tiene un valor entero
Puede ser inicializado a un valor no negativo.
La operación semWait decrementa el valor del semáforo.
La operación semSignal incrementa el valor del semáforo
Universidad Nacional Experimental de Guayana
Vicerrectorado académico.
Coordinación de Ingeniería en Informática.
Struct semaphore { int cuenta; queueType cola; } void semWait(semaphore s) { s.cuenta—; if (s.cuenta < 0) { poner este proceso en s.cola; bloquear este proceso; } } void semSignal(semaphore s) { s.cuenta++; if (s.cuenta <=0) { extraer un proceso P de s.cola; poner el proceso P en la lista de listos; } }
Universidad Nacional Experimental de Guayana
Vicerrectorado académico.
Coordinación de Ingeniería en Informática.
struct binary_semaphore { enum {cero, uno} valor; queueType cola; }; void semWaitB(binary_semaphore s) { if (s.valor == 1) s.valor = 0; else { poner este proceso en s.cola; bloquear este proceso; } } void semSignalB(binary_semaphore s) { if (esta_vacia(s.cola)) s.valor = 1; else { extraer un proceso P de s.cola; poner el proceso P en la lista de listos; } }
Universidad Nacional Experimental de Guayana
Vicerrectorado académico.
Coordinación de Ingeniería en Informática.
Como se garantiza la exclusión mutua con semáforos?
Universidad Nacional Experimental de Guayana
Vicerrectorado académico.
Coordinación de Ingeniería en Informática.
Exclusión mutua
/* programa exclusión mutua */ const int n = /* número de procesos */; semafore s = 1; void P(int i) { while (true) { semWait(s); /* sección crítica */; semSignal(s); /* resto */ } } void main() { paralelos (P(1),P(2),...,P(n)); }
Universidad Nacional Experimental de
Guayana.
Vicerrectorado académico.
Coordinación de Ingeniería en
Informática.
Universidad Nacional Experimental de Guayana
Vicerrectorado académico.
Coordinación de Ingeniería en Informática.
Universidad Nacional Experimental de Guayana
Vicerrectorado académico.
Coordinación de Ingeniería en Informática.
N puestos de
Estacionamiento
Problema del estacionamiento
1 sola puerta
Universidad Nacional Experimental de Guayana
Vicerrectorado académico.
Coordinación de Ingeniería en Informática.
Problema del productor consumidor
Uno o más procesos están generando algún tipo de datos y poniéndolos en un buffer Un único consumidor está extrayendo datos de dicho buffer en un momento dado Sólo un agente productor o consumidor puede acceder al buffer en un momento dado
Universidad Nacional Experimental de Guayana
Vicerrectorado académico.
Coordinación de Ingeniería en Informática.
Problema del productor consumidor
productor:
while (true)
{
/* producir dato v */;
b[entra] = v;
entra++;
}
consumidor:
while (true)
{
while (entra <= sale)
/* no hacer nada */;
w = b[sale];
sale++;
/* consumir dato w */
}
Universidad Nacional Experimental de Guayana
Vicerrectorado académico.
Coordinación de Ingeniería en Informática.
/* programa productor consumidor */ int n; binary_semaphore s = 1; binary_semaphore retardo = 0; void productor(){ while (true){ producir(); semWaitB(s); anyadir(); n++; if (n==1) semSignalB(retardo); semSignalB(s); } } void consumidor(){ semWaitB(retardo); while (true){ semWaitB(s); extraer(); n—; semSignalB(s); consumir(); if (n==0) semWaitB(retardo); } } void main(){ n = 0; paralelos (productor,consumidor); }
Solución incorrecta haciendo uso de semáforos binarios (Buffer infinito)
Universidad Nacional Experimental de Guayana
Vicerrectorado académico.
Coordinación de Ingeniería en Informática.
Solución correcta haciendo uso de semáforos binarios (Buffer Infinito)
/* programa productor consumidor */ int n; binary_semaphore s = 1; binary_semaphore retardo = 0; void productor() { while (true) { producir(); semWaitB(s); anyadir(); n++; if (n==1) semSignalB(retardo); semSignalB(s); } } void consumidor() { int m; /* una variable local */ semWaitB(retardo); while (true) { semWaitB(s); extraer(); n—; m = n; semSignalB(s); consumir(); if (m==0) semWaitB(retardo); } } void main() { n = 0; paralelos (productor,consumidor); }
Universidad Nacional Experimental de Guayana
Vicerrectorado académico.
Coordinación de Ingeniería en Informática.
Solución correcta haciendo uso de semáforos con contador (Buffer Infinito)
/* programa productor consumidor */ semaphore n = 0; semaphore s = 1; void productor() { while (true) { producir(); semWait(s); anyadir(); semSignal(s); semSignal(n); } } void consumidor() { while (true) { semWait(n); semWait(s); extraer(); semSignal(s); consumir(); } } void main() { paralelos (productor,consumidor); }
Universidad Nacional Experimental de Guayana
Vicerrectorado académico.
Coordinación de Ingeniería en Informática.
Solución correcta haciendo uso de semáforos con contador (Buffer Acotado)
Universidad Nacional Experimental de Guayana
Vicerrectorado académico.
Coordinación de Ingeniería en Informática.
Con el uso de esta presentación se acepta las condiciones abajo descritas basadas en la licencia LGPL.
La presentación puede ser utilizada libremente por los particulares. El empleo comercial de la presentación gratuita no está permitido.
En ningún caso Rodrigo Higuera será responsable por ningún daño indirecto, especial o consecuente que surja de o en conexión con el uso de la presentación.
En caso de preguntas o inquietudes técnicas, no se las lleve a casa, Pregunte.
E-Mail: [email protected] / [email protected]
Muchas Gracias…