06 - Semaforos

16
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

Transcript of 06 - Semaforos

Page 1: 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

Page 2: 06 - Semaforos

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

Page 3: 06 - Semaforos

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; } }

Page 4: 06 - Semaforos

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; } }

Page 5: 06 - Semaforos

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?

Page 6: 06 - Semaforos

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)); }

Page 7: 06 - Semaforos

Universidad Nacional Experimental de

Guayana.

Vicerrectorado académico.

Coordinación de Ingeniería en

Informática.

Page 8: 06 - Semaforos

Universidad Nacional Experimental de Guayana

Vicerrectorado académico.

Coordinación de Ingeniería en Informática.

Page 9: 06 - Semaforos

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

Page 10: 06 - Semaforos

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

Page 11: 06 - Semaforos

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 */

}

Page 12: 06 - Semaforos

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)

Page 13: 06 - Semaforos

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); }

Page 14: 06 - Semaforos

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); }

Page 15: 06 - Semaforos

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)

Page 16: 06 - Semaforos

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…