tema clase dfd

57
 Notas de clase de Programaci´ on Concurrente Comunicaci´on y Sincronizaci´on con Monitores Resumen del Tema Dpto de Lenguajes y Ciencias de la Computaci´ on Universidad de M´ ala ga Mar´ ıa del Mar Gallardo Melgarejo alaga, 2002

Upload: jntn-galvan-mozombite

Post on 04-Feb-2018

224 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Tema Clase dfd

7/21/2019 Tema Clase dfd

http://slidepdf.com/reader/full/tema-clase-dfd 1/57

Notas de clase de Programacion Concurrente

Comunicacion y Sincronizacioncon Monitores

Resumen del Tema

Dpto de Lenguajes y

Ciencias de la ComputacionUniversidad de Malaga

Marıa del Mar Gallardo Melgarejo

Malaga, 2002

Page 2: Tema Clase dfd

7/21/2019 Tema Clase dfd

http://slidepdf.com/reader/full/tema-clase-dfd 2/57

2   M. M. Gallardo Monitores

Page 3: Tema Clase dfd

7/21/2019 Tema Clase dfd

http://slidepdf.com/reader/full/tema-clase-dfd 3/57

Indice general

Pagina

1. Introduccion 5

2. Sincronizacion en Memoria Compartida 7

2.1. Semaforos . . . . . . . . . . . . . . . . . . . . . . . . . . . . .   7

2.2. Monitores . . . . . . . . . . . . . . . . . . . . . . . . . . . . .   82.2.1. Definicion . . . . . . . . . . . . . . . . . . . . . . . . .   9

2.2.2. Exclusion Mutua . . . . . . . . . . . . . . . . . . . . .   10

2.2.3. Condiciones de Sincronizacion . . . . . . . . . . . . . .   11

2.2.4. Disciplinas de Reactivacion . . . . . . . . . . . . . . .   12

2.2.5. Otras Operaciones sobre Variables Condicion . . . . . .   15

2.3. Tecnicas de Sincronizacion . . . . . . . . . . . . . . . . . . . .   15

2.3.1. Buffer Acotado . . . . . . . . . . . . . . . . . . . . . .   15

2.3.2. Lectores/Escritores . . . . . . . . . . . . . . . . . . . .   16

2.3.3. Temporizador . . . . . . . . . . . . . . . . . . . . . . .   17

2.3.4. El barbero dormilon . . . . . . . . . . . . . . . . . . .   19

2.4. Monitores en los Lenguajes de Programacion . . . . . . . . . .   22

2.4.1. Java . . . . . . . . . . . . . . . . . . . . . . . . . . . .   22

2.4.2. Ada95 . . . . . . . . . . . . . . . . . . . . . . . . . . .   25

2.4.3. La biblioteca Pthreads . . . . . . . . . . . . . . . . . .   30

3

Page 4: Tema Clase dfd

7/21/2019 Tema Clase dfd

http://slidepdf.com/reader/full/tema-clase-dfd 4/57

4   M. M. Gallardo Monitores

3. Figuras 33

3.1. Problema de la Actualizacion Multiple . . . . . . . . . . . . .   333.2. Problema del productor/consumidor . . . . . . . . . . . . . .   343.3. Exclusion mutua con semaforos . . . . . . . . . . . . . . . . .   343.4. Problema del productor/consumidor con semaforos . . . . . .   353.5. Exclusion mutua con monitores . . . . . . . . . . . . . . . . .   363.6. Productor/consumidor simple con monitores . . . . . . . . . .   373.7. Semaforos con Monitores. Disciplina RW . . . . . . . . . . . .   383.8. Semaforos con Monitores. Disciplina RC . . . . . . . . . . . .   393.9. Semaforos con Monitores. Disciplina RC and RW . . . . . . .   403.10. Buffer acotado . . . . . . . . . . . . . . . . . . . . . . . . . . .   41

3.11. Lectores/Escritores (Disciplinas RW o RUW) . . . . . . . . .   423.12. Lectores/Escritores (sigue) . . . . . . . . . . . . . . . . . . . .   433.13. Lectores/Escritores (Disciplina RC) . . . . . . . . . . . . . . .   443.14. Temporizador . . . . . . . . . . . . . . . . . . . . . . . . . . .   453.15. Temporizador con prioridad . . . . . . . . . . . . . . . . . . .   463.16. Barbero Dormilon . . . . . . . . . . . . . . . . . . . . . . . . .   473.17. Controlador de Recursos en Java . . . . . . . . . . . . . . . .   49

3.17.1. Clase Monitor . . . . . . . . . . . . . . . . . . . . . . .   493.17.2. Clase hebra . . . . . . . . . . . . . . . . . . . . . . . .   503.17.3. Clase main . . . . . . . . . . . . . . . . . . . . . . . .   51

3.18. Problema del Controlador de Recursos en Ada . . . . . . . . .   52

3.18.1. Paquete Control . . . . . . . . . . . . . . . . . . . . . .   523.18.2. Cuerpo de Control . . . . . . . . . . . . . . . . . . . .   533.18.3. Programa Principal . . . . . . . . . . . . . . . . . . . .   54

3.19. Pthreads . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .   553.19.1. Monitor . . . . . . . . . . . . . . . . . . . . . . . . . .   553.19.2. Hebras y Programa Principal . . . . . . . . . . . . . .   56

Bibliografıa 57

Page 5: Tema Clase dfd

7/21/2019 Tema Clase dfd

http://slidepdf.com/reader/full/tema-clase-dfd 5/57

CAPITULO 1

Introduccion

Un programa secuencial puede  utilizar variables globales, que son estruc-turas compartidas por todos las subestructuras que forman el programa.Aunque, por cuestiones de eficiencia, puede justificarse la necesidad de usartales variables, la mayorıa de los programadores defenderıan que es muchomejor no utilizarlas para evitar, por ejemplo, efectos laterales no deseados

sobre ellas.En contraposicion, un programa concurrente  necesita  utilizar estructuras

globales para que los procesos puedan comunicarse. De una forma simplifica-da, la comunicacion entre dos procesos ocurre cuando uno de los dos procesosescribe sobre una estructura global a ambos y el otro lee de la misma. La es-tructura compartida puede ser una variable global, en cuyo caso suponemosque los procesos comparten un espacio de direcciones, o puede ser un canalde comunicacion arbitrariamente complejo. En el primer caso, decimos quela comunicacion se realiza mediante variables compartidas, mientras que elsegundo sirve para representar de forma muy abstracta la comunicacion en

sistemas distribuidos.Para que la comunicacion entre procesos se realice de forma correcta,

normalmente necesitamos introducir algun mecanismo de sincronizacion. Lasincronizacion define las secuencias de acciones sobre la estructura comparti-da que se consideran validas. Existen dos tipos de sincronizacion basicos: laexclusi´ on mutua , que significa que no puede haber dos procesos simultanea-

5

Page 6: Tema Clase dfd

7/21/2019 Tema Clase dfd

http://slidepdf.com/reader/full/tema-clase-dfd 6/57

6   M. M. Gallardo Monitores

mente trabajando sobre la estructura global; y las   condiciones de sincroni-

zaci´ on , que establecen un orden preciso en la ejecucion de las acciones. Porejemplo, el problema de la actualizaci´ on m´ ultiple  ocurre cuando dos procesosintentan modificar simultaneamente el valor de una variable global lo quepuede dar lugar a obtener resultados incorrectos sobre la variable. Una posi-ble implementacion en Pascal-FC de este problema aparece en la Figura 3.1(todos los codigos a los que se hace referencia en la leccion se encuentran enel Capıtulo 3). El problema que se plantea es que la asignacion no es at´ omica y si, durante su ejecucion, los procesos se interfieren, se puede obtener unresultado incorrecto. Una forma de resolverlo es hacer que los procesos  p1 yp2 ejecuten la asignacion  n := n + 1  en exclusion mutua.

Un condicion de sincronizacion aparece tıpicamente en el   problema del productor/consumidor . En este problema el proceso productor produce datosque el proceso consumidor tiene que consumir. Una sencilla implementacionde problema aparece en la Figura 3.2 . Una condicion de sincronizacion queasegura que la comunicacion se realiza satisfactoriamente debe establecer queen cada iteracion de ambos procesos, la instruccion  n:=random(20)  precedea  write(n).

La implementacion de la comunicacion y los problemas de sincronizacionasociados dependen de si suponemos que los procesos involucrados compartenuna memoria comun o si, por el contrario, tienen la memoria distribuida, encuyo caso se comunican mediante  paso de mensajes .

Este tema nos centramos en la gestion de la comunicacion y la sincroni-zacion en memoria compartida mediante  monitores . Con este objetivo, pro-ponemos el ındice siguiente. Inicialmente, introducimos los monitores com-parandolos brevemente con los semaforos. A continuacion, describimos lascaracterısticas basicas asociadas a los monitores como son las variables con-dicion, las operaciones de suspension y reactivacion, y las distintas disciplinasque pueden implementarse al realizar esta ultima operacion. La segunda partedel tema esta dedicada a la presentacion de soluciones basadas en monitoresa problemas de sincronizacion tıpicos. Finalmente, describimos como sopor-tan los monitores algunos lenguajes como Java, Ada y C. En este ultimo caso

mediante el uso de funciones de librerıa o llamadas al sistema. El materialque se presenta es autocontenido, por lo que alguna parte, como por ejemplo,la descripcion de los lenguajes de programacion presentados, podrıa omitirseen la exposicion.

Page 7: Tema Clase dfd

7/21/2019 Tema Clase dfd

http://slidepdf.com/reader/full/tema-clase-dfd 7/57

CAPITULO 2

Sincronizacion en Memoria Compartida

2.1. Semaforos

Historicamente, la primera primitiva que aparecio para sistemas de memo-ria compartida fueron los semaforos introducidos por Dijsktra [Dijsktra, 1968].

Un  sem´ aforo  es un tipo de datos cuyos valores asociados son los enterosno negativos, en el caso de los semaforos generales, o las constantes 0 y 1, si elsemaforo es binario. De forma intuitiva, el valor 0 representa que el sem aforoesta cerrado (esta en rojo) y cualquier valor positivo indica que el semafo-ro esta abierto (esta en verde). En este ultimo caso, el valor concreto delsemaforo representa el numero de procesos que pueden pasar con el semaforoabierto.

Para implementar este comportamiento, el tipo semaforo tiene asociadasdos operaciones que aquı, siguiendo la notacion de Pascal-FC, llamaremoswait y signal, aunque en su version original se llamaban P y V, respectiva-

mente. El significado de estas operaciones es:

wait(s)   suspender en s  hasta que  s := s - 1  sea no negativosignal(s) s := s + 1

Es decir, la operacion  wait(s) puede  suspender  al proceso que la ejecuta

7

Page 8: Tema Clase dfd

7/21/2019 Tema Clase dfd

http://slidepdf.com/reader/full/tema-clase-dfd 8/57

Page 9: Tema Clase dfd

7/21/2019 Tema Clase dfd

http://slidepdf.com/reader/full/tema-clase-dfd 9/57

SINCRONIZACI ON EN MEMORIA COMPARTIDA   9

lar. Un monitor es un modulo que “encapsula” algun recurso compartido o

los procedimientos de acceso a dicho recurso, cuando este no puede ser arbi-trariamente utilizado por los procesos del sistema. De esta forma, cualquierproceso que quiera utilizar el recurso tiene que   pedir   permiso al monitory, cuando ya no necesite el recurso, debe  devolver  el permiso, para que elmonitor registre que ya no lo esta utilizando. La peticion y devolucion seimplementan a traves de los procedimientos de acceso exportados por el mo-nitor. Ası, el monitor contiene las variables que representan el estado delrecurso y las operaciones de acceso al mismo como si fuera un tipo abstractode datos. La diferencia fundamental con los tipos es que, por definicion, cual-quier instruccion del monitor se ejecuta en  exclusi´ on mutua . Por otro lado,

los monitores pueden contener variables de tipo  condici´ on  para implementarlas condiciones de sincronizacion.Cuando un programa concurrente utiliza monitores, para implementar la

comunicacion y la sincronizacion, contiene dos tipos de entidades: los  proce-sos , que son entidades  activas , y los  monitores , que son  pasivos  en el sentidode que solo se ejecuta su codigo cuando algun proceso lo requiere. Ası, su-poniendo que todas las variables compartidas estan dentro de un monitor,cuando dos procesos del sistema quieren interaccionar, lo hacen siempre atraves de los procedimientos que este exporta. Esto tiene dos beneficios fun-damentales. En primer lugar, el proceso que llama al monitor no tiene quepreocuparse sobre c´ omo estan implementadas las operaciones de acceso a las

variables, lo unico que le interesa  que  hacen dichas operaciones. En segundolugar, el programador del monitor no tiene que preocuparse del contexto enel que va a encontrarse el mismo: puede cambiar la implementaci on siempreque el cambio no afecte al significado de las operaciones exportadas. De estemodo, los procesos y el monitor pueden implementarse de forma indepen-diente, lo que hace que los programas sean mas sencillos de desarrollar y decomprender.

2.2.1. Definicion

Un monitor es una estructura que agrupa la representacion y la implemen-tacion del acceso a un recurso compartido. Tiene un interfaz, que especificalas operaciones exportadas, y un cuerpo que contiene las variables de estadodel recurso y la implementacion del interfaz. Los monitores se declaran ycrean de forma diferente en los lenguajes de programaci on, ası que en estaseccion utilizamos la siguiente notacion generica:

Page 10: Tema Clase dfd

7/21/2019 Tema Clase dfd

http://slidepdf.com/reader/full/tema-clase-dfd 10/57

10   M. M. Gallardo Monitores

mon itor nombre mon ;

e x p o r t   < l i s t a de p ro c . e xp or ta do s >;<d e c l a r ac i o n e s l o c a l e s><imp . de l o s p ro c . e x po r ta d os>

[ begin<c u er p o d e l m on it or >]

end .

Los procedimientos exportados son el interfaz del monitor, es decir, lounico visible y accesible desde los procesos en su entorno. Por lo tanto, paramodificar el estado del monitor, los procesos tienen que llamar a algunode estos procedimientos. Para realizar esta llamada, utilizamos la siguiente

sintaxis:

nombre_mon.proc(argumentos)

donde nombre mon es el nombre del monitor, proc es uno de los procedimien-tos exportados, y  argumentos son sus parametros de entrada reales.

El cuerpo del monitor, cuando existe, se ejecuta solo una vez en el mo-mento en el que es creado, y se utiliza para inicializar las variables del mismo.

2.2.2. Exclusion Mutua

Una de las ventajas de los monitores frente a los semaforos es que dis-tinguen entre exclusion mutua y condiciones de sincronizacion. Ademas, laprimera siempre se tiene por defecto debido a que los procedimientos anida-dos en el monitor siempre se ejecutan de ese modo. Esto significa que  no  esresponsabilidad del programador asegurar la exclusion mutua, sino que es elsistema subyacente (el compilador, la biblioteca o el sistema operativo, de-pendiendo de los casos) el que debe implementar dicho comportamiento. Poresta razon, el problema de la actualizacion multiple tiene una implementacion

muy sencilla con monitores como se muestra en la Figuras 3.5.Si dos o mas procesos intentar ejecutar simultaneamente algun procedi-

miento del monitor, solo uno de ellos tiene exito, y el resto espera en unaestructura de cola fifo, que llamamos  cola de entrada  al monitor. Un procesoque llega al monitor cuando este esta siendo utilizado, simplemente se colocaal final de la cola de entrada.

Page 11: Tema Clase dfd

7/21/2019 Tema Clase dfd

http://slidepdf.com/reader/full/tema-clase-dfd 11/57

SINCRONIZACI ON EN MEMORIA COMPARTIDA   11

2.2.3. Condiciones de Sincronizacion

A diferencia de la exclusion mutua, las condiciones de sincronizacion tie-nen que implementarse especıficamente en los monitores. Para esto se utilizanlas variables de tipo  condici´ on . Cada variable condicion representa una colafifo de procesos que esperan que la condicion correspondiente se satisfaga.Para declarar una condicion utilizamos la siguiente sintaxis:

va r   c:condition;

Las operaciones1 disponibles para las variables de tipo condicion son lassiguientes:

Operacion Significadodelay(c)   suspende el proceso al final de la fifo cresume(c)   reactiva al proceso que esta en la cabeza de  c

si c  esta vacıa no tiene efecto.empty(c)   funcion booleana: empty(c)=‘esta vacıa c’

Por defecto, las variables condicion son colas fifo, es decir, los procesos sereactivan en el mismo orden en el que se van suspendiendo. En la Figura 3.6se muestra la implementacion con monitores del problema del productor-consumidor (la version con un buffer de una componente). En este problematenemos dos condiciones de sincronizacion, una que detiene al productor siva demasiado rapido y quiere sobreescribir la variable antes de que haya sidoleıda, y otra para parar al consumidor si se adelanta, y quiere leer un datoque todavıa no se ha almacenado.

Es interesante notar que la implementacion de la condicion de sincroni-

zacion con monitores requiere el uso de una variable booleana y la inclusionde una instruccion de seleccion, con respecto a lo que ocurrıa con la solucioncon semaforos. La siguiente tabla compara ambas implementaciones:

1Los nombres que utilizamos no son estandar. Los llamamos ası para distinguir estasoperaciones de las asociadas a los semaforos.

Page 12: Tema Clase dfd

7/21/2019 Tema Clase dfd

http://slidepdf.com/reader/full/tema-clase-dfd 12/57

12   M. M. Gallardo Monitores

Accion Semaforos Monitores

suspension del productor   wait(sleido) if not leidothen delay(cleido)

reactivacion del consumidor   signal(sdatos) leido := false;resume(cdatos)

suspension del consumidor   wait(sdatos) if leidothen delay(cdatos)

reactivacion del productor   signal(sleido) leido := true;resume(cleido)

La diferencia entre ambas implementaciones se debe a que los semaforosson variables mas expresivas que las condiciones, un semaforo tiene un valor

ademas de servir como medio para suspender a los procesos. En contraposi-cion, las condiciones no tienen un valor asociado por lo que se hace necesarioel uso de variables adicionales.

2.2.4. Disciplinas de Reactivacion

Cuando el proceso que esta en el monitor cambia el estado de este, demanera que ahora se satisface alguna condicion que antes no era cierta, eje-cuta una instruccion  resume  sobre dicha condicion, que despierta al procesomas antiguo de entre los que estan esperando. La imposicion de la exclusion

mutua hace que cuando un proceso, que est´ a dentro del monitor , ejecuta unainstruccion de reactivacion,  resume , haya que decidir que proceso continuaen el monitor: el reactivador o el proceso reactivado.

Pueden considerarse distintas estrategias para resolver este problema queinfluyen fuertemente en el modo de implementar las condiciones de sincroni-zacion en el monitor. A continuacion se discuten las mas importantes:

Resume-and-Exit (RE):

En esta disciplina se obliga a que la instruccion de reactivacion, resume ,sea siempre la ultima que ejecuta el proceso reactivador antes de salirdel monitor, como ocurre, por ejemplo, en el codigo de la Figura 3.6.

En este caso, el comportamiento del monitor es sencillo: el procesoreactivador sale del monitor y entra el reactivado. Si no hay ningunproceso que reactivar, entra un proceso de la cola de entrada al monitor.

Page 13: Tema Clase dfd

7/21/2019 Tema Clase dfd

http://slidepdf.com/reader/full/tema-clase-dfd 13/57

SINCRONIZACI ON EN MEMORIA COMPARTIDA   13

Variable condición

Cola de entrada

Cola de Urgentes

Ejecutando el

monitorllamada

Monitor libre

RW

RC

RUW

delay

RW

return

return

RE

Figura 2.1: Disciplinas de Resume

Finalmente, si no hay nadie esperando a la entrada, se desbloquea laentrada al monitor.

El problema de esta disciplina es que tiende a generar procedimientos enlos monitores muy particionados ya que, habitualmente las operacionesde tipo  resume  no ocurren al final de los procedimientos.

Resume-and-Wait (RW):

En este caso el proceso reactivador sale del monitor una vez que harealizado la operacion  resume   dando prioridad al proceso despertado.La ventaja de esta solucion es que el proceso despertado sabe que entresu reactivacion y su incorporacion al monitor, ningun otro proceso hamodificado la condicion por la que tuvo acceso al mismo, por lo que

puede continuar su ejecucion directamente.Esta solucion hace que el proceso reactivador vuelva a la cola de en-trada, por lo que tiene que competir con el resto de los procesos delentorno para entrar en el monitor. En este sentido es un poco injusta,ya que el proceso reactivador ya estaba dentro del monitor y se le trataigual que a los que estaban fuera. Una solucion un poco mas justa es

Page 14: Tema Clase dfd

7/21/2019 Tema Clase dfd

http://slidepdf.com/reader/full/tema-clase-dfd 14/57

14   M. M. Gallardo Monitores

la que se comenta a continuacion.

Resume-and-Urgent-Wait (RUW):

Esta disciplina es como la anterior salvo que el proceso reactivador nose transfiere a la cola de entrada, sino a una cola especial, llamada deurgentes, formada por procesos que tienen prioridad para entrar en elmonitor sobre los que estan en la cola de entrada.

Resume-and-Continue (RC):

Segun esta estrategia el proceso reactivador sigue ejecutando el monitory el despertado se va a la cola de entrada. La principal diferencia conla solucion anterior es que desde que el proceso fue despertado hasta el

momento en el que entra en el monitor, han podido entrar en este unnumero arbitrario de procesos. Por lo tanto, es posible que la condicionpor la que se le desperto haya cambiado (el estado del monitor puedehaber sido modificado por otro proceso) y, en ese caso, tendrıa quevolver a suspenderse.

En la Figura 2.1 se muestran estas disciplinas. Como se ha comentadoantes, la implementacion de resume afecta a los procedimientos del moni-tor. Esto puede comprobarse en las Figuras 3.7 y 3.8. En ambos ejemplosse realiza una implementacion de un semaforo usando monitores. Por eso,cuando se llama a  swait, si el valor del semaforos es cero, el proceso tiene

que suspenderse. Con la disciplina RW, una vez que un proceso suspendidoha sido reactivado sigue ejecutando el codigo porque  est´ a seguro  de que lavariable  valor  no es nula. Sin embargo, con la disciplina RC, el proceso  tiene que volver a comprobar  si el valor del semaforo no es nulo antes de continuarsu ejecucion. Esta claro que la implementacion con  while  es mas segura yaque funciona cualquiera que sea la estrategia utilizada.

En la Figura 3.9 se muestra una solucion valida para cualquier disciplina,que ademas evita la sobrecarga de utilizar la instruccion de iteracion  while.Este codigo hace uso de la tecnica de  paso de la condici´ on  que consiste en queel proceso reactivador pasa la informacion de que la variable valor es positiva

al proceso despertado, pero sin hacer esta condicion visible. Esto significa quecualquier otro proceso que llegue al monitor  ve  que la variable valor es ceroy, consecuentemente, se suspende. El unico proceso que  sabe  que la variableya no es nula es el despertado que, una vez que entra en el monitor, sigue suejecucion sin preocuparse de si algun otro proceso se ha colado y ha entradoantes que el.

Page 15: Tema Clase dfd

7/21/2019 Tema Clase dfd

http://slidepdf.com/reader/full/tema-clase-dfd 15/57

SINCRONIZACI ON EN MEMORIA COMPARTIDA   15

2.2.5. Otras Operaciones sobre Variables Condicion

Ademas de las operaciones  empty,  delay  y  resume   existen otras opera-ciones utiles:  delay  con prioridad,  minrank, y  resume all, que pueden im-plementarse facilmente y que mejoran el diseno de sistemas con monitores.En la siguiente tabla se presentan estas operaciones:

Operacion Significado

delay(c,p)   Espera en orden creciente del valor p.

resume all(c)   Despierta a todos los procesos de la cola c.

minrank(c)   Prioridad del proceso que esta en el frente de c.

La instruccion delay con prioridad le da al programador mas control sobreel orden que tienen los procesos suspendidos en una condicion, controlandoası el orden en el que se reactivan. Por problemas de planificacion, es habitualque necesitemos conocer la prioridad del proceso que esta en el frente de lacola. Esta informacion nos la proporciona la funcion  minrank .

Por ultimo, la instruccion  resume all   sirve para despertar a   todos   losprocesos suspendidos en una condicion, cuando todos ellos pueden continuarsu ejecucion. Con la disciplina RC, esta instruccion es equivalente a

while not   empty(c )   do   r es um e ( c ) ;

Bajo las disciplinas RW y RUW, el comportamiento de esta instrucci onno esta bien definido, por lo que no se utiliza. Una alternativa es utilizar latecnica de  despertado en cascada  tal y como se muestra en las Secciones 2.3.2y 2.3.3.

2.3. Tecnicas de Sincronizacion

En esta seccion, se muestran soluciones basadas en monitores a cuatroproblemas que representan escenarios tıpicos de sistemas concurrentes. Lassoluciones presentadas cubren las principales tecnicas de programacion cuan-

do se usa esta primitiva.

2.3.1. Buffer Acotado

La solucion al problema del productor/consumidor propuesta en la Figu-ra 3.6 no es aceptable porque impone una sincronizacion absoluta entre las

Page 16: Tema Clase dfd

7/21/2019 Tema Clase dfd

http://slidepdf.com/reader/full/tema-clase-dfd 16/57

16   M. M. Gallardo Monitores

iteraciones del productor y las del consumidor. La unica traza de ejecucion

posible de este programa es:

productor  produce sobre el canal  →  consumidor  consume del canal →productor  produce sobre el canal  →  consumidor  consume del canal →· · ·

El problema es que el tamano de canal es tan pequeno que no puede al-macenar mas de un dato. Una generalizacion natural, que se muestra en laFigura 3.10, es extender el canal utilizando una buffer intermedio de mayorcapacidad. Esta solucion claramente desacopla a los procesos. El productor

puede seguir produciendo, mientras que el buffer no este lleno, aunque elconsumidor no este consumiendo y, por otro lado, el consumidor puede con-sumir, mientras no se vacıe el buffer, aunque el productor momentaneamenteno produzca.

En esta solucion, suponemos que la disciplina utilizada es RC, por eso uti-lizamos una instruccion while al implementar la condicion de sincronizacion.Las variables condicion  novacio  y  nolleno   representan las condiciones desincronizacion basicas para este problema. Ademas, como el buffer esta anida-do dentro del monitor, tenemos asegurado que se utiliza siempre en exclusi onmutua.

2.3.2. Lectores/Escritores

El problema de los lectores/escritores se enuncia del modo siguiente. Dostipos de procesos (los escritores y los lectores) comparten una base de datos(BD). Los lectores la utilizan unicamente para examinar los registros, mien-tras que los escritores pueden actualizarla. Suponemos que inicialmente labase de datos tiene informacion consistente y que cada operacion de escri-tura o lectura, realizada aisladamente, no modifica dicha consistencia. Paraevitar que los procesos se interfieran, se impone que los procesos escritores

utilicen la base de datos en exclusion mutua. Pero como dos operaciones delectura no se interfieren entre ellas, para aumentar la concurrencia del siste-ma, se permite que, si no hay ningun escritor en la base de datos, un numeroarbitrario de lectores puedan estar examinandola.

La Figura 3.11 muestra una solucion a este problema suponiendo la disci-plina RW o RUW. En la Figura 3.12 se muestran los codigos de los procesos

Page 17: Tema Clase dfd

7/21/2019 Tema Clase dfd

http://slidepdf.com/reader/full/tema-clase-dfd 17/57

SINCRONIZACI ON EN MEMORIA COMPARTIDA   17

lectores y escritores. Las caracterısticas de la solucion se enumeran a conti-

nuacion:

Cuando un proceso escritor quiere entrar, comprueba si no hay ni es-critores ni lectores en la BD. Si esto es ası entra; en otro caso, esperahasta que se satisfaga la condicion.

Antes de entrar en la BD, los lectores comprueban que no hay ningunescritor utilizandola y, ademas, que ningun escritor  quiere  entrar en laBD. Esta implementacion intenta tratar con mas justicia a los procesosescritores, evitando que sean postpuestos indefinidamente si los lectoresestan continuamente entrando y saliendo de la BD. Antes de entrar en

la BD el proceso lector despertado, despierta a otro posible lector quepudiera estar esperando en la condicion. Esta forma de despertado sedenomina  en cascada , porque los procesos se van pasando unos a otrosla condicion que les permite proseguir la ejecucion.

Cuando un escritor sale de la BD da prioridad a los lectores. De estaforma, se evita que los escritores impidan la ejecucion de los lectores.

Cuando un lector sale de la BD, comprueba si es el ultimo y, en estecaso, despierta a un posible escritor que estuviera esperando.

En la Figura 3.13 se muestra una solucion que supone la disciplina RC. Eneste caso, es posible utilizar la instruccion  resume all en vez del despertadoen cascada mas propio de sistemas que se ejecutan bajo las disciplinas RWo RUW.

Es interesante notar que, a diferencia del problema del buffer acotado, eneste caso  no  podemos encapsular la base de datos dentro del monitor. Elloimpedirıa, debido a la exclusion mutua, que mas de un lector la utilizarasimultaneamente.

2.3.3. Temporizador

Una  condici´ on de cobertura  es una condicion que sirve para suspender aprocesos que esperan que condiciones   diferentes  ocurran para continuar suejecucion. Normalmente, la condicion depende del proceso, y como el mo-nitor no sabe cuantos procesos van a necesitar sus servicios define solo unacondicion para  cubrir  todas las condiciones.

Page 18: Tema Clase dfd

7/21/2019 Tema Clase dfd

http://slidepdf.com/reader/full/tema-clase-dfd 18/57

18   M. M. Gallardo Monitores

Ilustramos el uso de las   condiciones de cobertura   con el diseno de un

temporizador cuya funcion es la de despertar a procesos cuando un tiempo desuspension especificado (diferente para cada proceso) ha pasado. Los sistemasoperativos suelen proporcionar esta facilidad que permite que los usuariospuedan programar tareas que deben ejecutarse de forma periodica.

El temporizador es un ejemplo de  controlador de recursos . En este caso, elmonitor encapsula un reloj logico y proporciona dos operaciones:  duerme(t),que retrasa al proceso que llama durante el t  unidades de tiempo, y  tic, queincrementa la hora del reloj logico.

En la Figura 3.14 aparece una implementacion de este sistema. Los pro-cesos del sistema llaman a  duerme(t), donde   t   es un entero no negativo.

Existe un proceso, de mas prioridad que el resto, que llama a la operaciontic cada vez que el reloj debe actualizar su valor en 1.

Cuando un proceso llama a  duerme(t), no debe continuar su ejecucionhasta que la hora de reloj se haya incrementado al menos en   t   unidadesde tiempo. La condicion solo establece que el proceso periodico no siga eje-cutandose  antes  de que el tiempo  t  haya transcurrido, pero debido a que elproceso que llama a   tic  tiene mas prioridad, si el proceso periodico no esplanificado a tiempo, podrıan pasar mas de  t  segundos.

El comportamiento del sistema puede resumirse como sigue: cuando unproceso periodico llama a  duerme(t), su hora de despertar se graba en la

variable local  horadesp. Cada vez que el proceso reloj llama a tic  se realizaun despertado en cascada  de todos los procesos periodicos. Cada uno de elloscomprueba si es su hora de despertar, en cuyo caso deja el monitor. Si, por elcontrario, aun no se ha cumplido su tiempo y debe seguir suspendido ejecutade nuevo  resume(mihora).

La variable condicion  mihora  es una condicion de cobertura ya que sirvepara suspender a procesos que estan esperando distintas condiciones, comose comento al principio de esta seccion. El uso de condiciones de coberturapuede ser ineficiente debido a la sobrecarga que conlleva la reactivaci on deun proceso que tiene que volver a suspenderse porque aun no se satisface

su condicion. Este mecanismo solo es aceptable cuando el costo de las falsasreactivaciones es menor que el costo de mantener condiciones propias de cadaproceso que permitan despertarlo solo cuando puede continuar su ejecucion.

Una solucion intermedia es utilizar una condicion de cobertura combinadacon el uso de una instruccion   delay   con prioridad como se muestra en laFigura 3.15.

Page 19: Tema Clase dfd

7/21/2019 Tema Clase dfd

http://slidepdf.com/reader/full/tema-clase-dfd 19/57

SINCRONIZACI ON EN MEMORIA COMPARTIDA   19

entrada

salida

barberocliente

Cliente

esperando

Cliente

esperando...

Figura 2.2: El problema del barbero dormilon

2.3.4. El barbero dormilon

En esta seccion, el simpatico ejemplo del barbero dormilon nos sirve pa-ra disenar un sistema cliente/servidor tıpico con monitores. La solucion alproblema requiere, ademas, la implementacion de un tipo basico de sincroni-zacion entre procesos llamado  rendezvous  (o  cita , en castellano). El problemaes una buena ilustracion de la necesidad de disponer de metodos sistematicos

para resolver problemas de sincronizacion, evitando el uso de metodos ad-hoc que pueden llevar a soluciones incorrectas cuando se implementan problemascomplejos como el que se muestra a continuacion.

El problema a resolver es el siguiente. Suponemos que una ciudad tieneuna pequena barberıa con dos puertas, una silla para el barbero y unas pocassillas para los clientes que esperan. La Figura 2.2 muestra el establecimiento.Los clientes entran por una puerta y salen por la otra. Como la barberıa esmuy pequena en cada momento solo una persona (el barbero o un cliente)puede estar moviendose por ella. El barbero pasa su vida pelando clientes,pero cuando no hay nadie en la barberıa se echa un sueno en la silla del

barbero. Cuando llega un cliente, si el barbero esta durmiendo, lo despierta,se sienta en la silla del barbero y espera mientras que el barbero lo pela.Si llega un cliente y el barbero esta ocupado, el cliente se duerme en unade las otras sillas. Cuando el barbero termina de pelar a un cliente, le abrela puerta de salida es es cerrada por el cliente pelado cuando se marcha. Sihay clientes esperando, el barbero despierta a uno de ellos y espera a que

Page 20: Tema Clase dfd

7/21/2019 Tema Clase dfd

http://slidepdf.com/reader/full/tema-clase-dfd 20/57

20   M. M. Gallardo Monitores

el cliente se siente en la silla del barbero. Si no hay clientes, se va a dormir

hasta que llegue otro.Los clientes y el barbero son procesos y la barberıa es un monitor que

coordina la interaccion entre los procesos. En este sistema, el barbero es elproceso  servidor   que responde a las peticiones de servicio por parte de losclientes . Ası que, como se comento antes, este ejemplo muestra una relacioncliente/servidor entre procesos.

Para implementar estas interacciones, el monitor barberıa proporcionatres procedimientos: cortar,  siguiente y  trabajo terminado. Los clientesllaman a  cortar; el procedimiento termina cuando el cliente ha sido pelado.El barbero repetidamente llama a  siguiente y espera que un cliente se siente

en la silla del barbero para darle un corte de pelo, cuando termina llama atrabajo terminado para que el cliente pelado pueda abandonar la barberıa.En este ejemplo, la sincronizacion entre el barbero y cada cliente se rea-

liza a traves de  citas . Una cita es una condicion de sincronizacion entre dosprocesos que, de forma intuitiva, puede verse como una  barrera  en el codigode cada proceso. Para que cualquiera de los dos procesos pueda continuar sucodigo  despues de la barrera ,  ambos  procesos tienen que haber alcanzado labarrera. La cita es la forma natural de comunicacion sıncrona en un sistemadistribuido. La implementacion en un sistema de memoria compartida es mascomplicada, pero en este ejemplo vemos una forma sistematica de hacerlo.

Supongamos que los procesos   p1   y   p2   tienen que citarse despues de laejecucion de las instrucciones (i1   y   i2) en sus respectivos codigos. Estacita se corresponde con dos condiciones de sincronizacion que se tienen quesatisfacer simultaneamente:

Una vez ejecutado i1, p1  no puede continuar su ejecucion hasta que  p2

no haya ejecutado  i2.

Una vez ejecutado i2, p2  no puede continuar su ejecucion hasta que  p1

no haya ejecutado  i1.

La implementacion de cada una de estas condiciones de sincronizacion sehace de la misma forma. Por ejemplo, la primera de ellas se resuelve comosigue:

var   i 2 e j e c u t a d a   ( ∗   : = f a l s e    ∗) : boolean ;c i 2 e j e c u t a d a : c o n d i t i o n ;

Page 21: Tema Clase dfd

7/21/2019 Tema Clase dfd

http://slidepdf.com/reader/full/tema-clase-dfd 21/57

SINCRONIZACI ON EN MEMORIA COMPARTIDA   21

( ∗ c od ig o e j ec u t ad o p or p1 en e l m oni to r  ∗)

i f not   i 2 e j e c u t a d a   thend e l ay ( c i 2 e j e c u t a d a ) ;

i 2 e j e c u ta d a : =   f a l s e ;

( ∗ c o di g o e j e c u t ad o p or p2 en e l mo ni to r , d e sp u es de i 2   ∗)i 2 e j e c u ta d a : =   true ;r es um e ( c i 2 e j e c u t a d a ) ;

De manera que para implementar una cita habrıa que escribir los codigoscorrespondientes a dos condiciones de sincronizacion como los que acaban demostrar.

En el problema del barbero dormilon hay que implementar dos citas:

Primera cita:

•   El barbero tiene que esperar a que llegue un cliente.

•   El cliente tiene que esperar a que el barbero este disponible.

Segunda cita:

•  El cliente tiene que esperar a que lo pele el barbero.

•  El barbero tiene que esperar a que se vaya el cliente pelado parapelar a otro cliente.

La union de estas condiciones de sincronizacion da lugar al siguiente com-portamiento del sistema:

barbero disponible  →  nuevo cliente  se sienta en la silla  →barbero pela cliente  →  barbero  abre la puerta de salida  →

cliente  cierra la puerta salida  →  barbero  disponible ...· · ·

La solucion al problema del barbero dormilon, utilizando la tecnica ex-plicada anteriormente se presenta en la Figura 3.16. En esta implementaci onsuponemos la disciplina RW.

Page 22: Tema Clase dfd

7/21/2019 Tema Clase dfd

http://slidepdf.com/reader/full/tema-clase-dfd 22/57

22   M. M. Gallardo Monitores

2.4. Monitores en los Lenguajes de Progra-

macion

Para terminar con el tema damos un repaso a la implementacion de lanocion de monitor en distintos Lenguajes de Programacion. En concreto,vemos el caso de Java, Ada y C.

2.4.1. Java

Es evidente el papel relevante que el lenguaje Java esta teniendo en losultimos anos. Esto se debe, seguramente, a que permite escribir programas

portables para su uso en internet.Java es principalmente un lenguaje orientado a objetos, aunque lo mas

interesante para nosotros es que soporta la creacion de hebras, los monitores yla programacion distribuida (aunque no es el objetivo de la presente lecci on).En esta seccion mostramos los mecanismos de Java para crear y gestionarhebras y monitores, viendo su uso con un ejemplo.

La clase Thread

Una hebra es un proceso de peso ligero; tiene su propia pila y contexto de

ejecucion, pero puede tambien acceder a todas las variables de su ambito. Lashebras en Java se programan extendiendo la clase  Thread  o implementandola interfaz Runnable (ambas son parte de la biblioteca estandar, en particulardel paquete  java.lang).

Por ejemplo, la siguiente instruccion crea una hebra

T hr ea d h e b ra =   new   Thread ( ) ;

Para hacer que la hebra se ejecute, hay que llamar a

h e br a . s t a r t ( ) ;

La operacion  start es un metodo definido en  Thread.  Thread  tiene mu-

chos otros metodos como  stop  o  sleep.La llamada anterior no hace nada porque, por defecto, el cuerpo de una

hebra es vacıo. En realidad, el metodo  start llama al metodo  run de  Thread,que esta vacıo por defecto. Ası que para crear una hebra util, hay que definiruna nueva clase que extiende a   Thread   (o que implementa a  Runnable) eimplementar el metodo  run. Por ejemplo, dada la clase

Page 23: Tema Clase dfd

7/21/2019 Tema Clase dfd

http://slidepdf.com/reader/full/tema-clase-dfd 23/57

SINCRONIZACI ON EN MEMORIA COMPARTIDA   23

c l a s s   Simple   extends   Thread   {

public void   run () {S ys te m . o u t . p r i n t l n ( ” E s to e s u na h e b ra ” ) ;

}}

podemos crear una instancia de la clase y hacer que se ejecute como sigue:

S im pl e s =   new   S i m p le ( ) ;s . st a r t ( ) ;   \\   l la ma a l metodo run ( ) d e l o b j e to s .

Podemos hacer esto mismo con el interfaz  Runnable  del modo siguiente:

c l a s s   Simple   implements   Runnable   {public void   run () {

S ys te m . o u t . p r i n t l n ( ” E s to e s u na h e b ra ” ) ;}

}

Una vez creada la clase, hay que pasar una instancia de la misma alconstructor de la  Thread  y lanzarla:

R un na bl e s =   new   S i m p le ( ) ;new   T hr ea d ( s ) . s t a r t ( ) ;

La ventaja de este segundo metodo es que podemos hacer que la claseSimple   extienda a alguna otra clase, lo que no se permite con el primermetodo porque Java no soporta la herencia multiple.

Metodos Sincronizados

Las hebras de Java se ejecutan de forma concurrente, por lo que podrıanacceder simultaneamente a variables compartidas como en el siguiente ejem-plo:

c l a s s   I n t e r f e r e n c i a {pr ivate int   v a l o r = 0 ;

public void   suma(){valor++;

}}

Esta clase contiene un campo privado  valor  que es solo accesible en laclase pero exporta el metodo publico suma que, cuando se llama, lo incremen-ta. Si este metodo es llamado simultaneamente por dos hebras se producirıael problema de la actualizacion multiple comentado en la Seccion 1.

Page 24: Tema Clase dfd

7/21/2019 Tema Clase dfd

http://slidepdf.com/reader/full/tema-clase-dfd 24/57

24   M. M. Gallardo Monitores

Java soporta la exclusion mutua mediante la palabra reservada synchronized

que puede aplicarse a un metodo completo, o a una secuencia de instruccio-nes. Por ejemplo, para hacer que el metodo  suma se realice de forma atomica,podrıamos escribir lo siguiente:

c l a s s   I n t e r f e r e n c i a {pr ivate int   v a l o r = 0 ;public synchronized void   suma(){

valor++;}

}

Este es un ejemplo sencillo de como se programa un monitor en Java:

las variables locales al monitor son variables privadas de la clase, y los pro-cedimientos del monitor se implementan utilizando metodos sincronizados.En Java hay una  cerradura  (lock ) por objeto. Cuando una hebra llama a unmetodo sincronizado, espera hasta obtener el acceso exclusivo al objeto quelo contiene. Una vez que se ha ejecutado el metodo, se libera el cerrojo.

Una forma alternativa de programar el ejemplo anterior es mediante unainstruccion sincronizada dentro del metodo  suma como sigue:

c l a s s   I n t e r f e r e n c i a {pr ivate int   v a l o r = 0 ;

public void   suma(){

synchronized   ( t h i s ){valor++;

}}

}

La palabra reservada this se refiere al objeto al que pertenece el metodosuma, por lo tanto este codigo se comporta de forma similar al anterior, aun-que la suspension de la hebra (en caso de ocurrir) se realiza en la instruccionsincronizada, y no en la llamada al procedimiento.

Java implementa las condiciones de sincronizacion mediante los metodos

wait   y   notify, que son metodos de la clase   Object. Estos metodos solopueden utilizarse en codigos cuya ejecucion este   synchronized, es decir,codigos que se ejecutan en exclusion mutua.

El metodo   wait   libera al objeto que la hebra que llama a   wait   tieneen exclusion mutua y suspende a esta hebra. Hay una unica cola de hebrassuspendidas por objeto (normalmente es una fifo, pero no es obligatorio). Java

Page 25: Tema Clase dfd

7/21/2019 Tema Clase dfd

http://slidepdf.com/reader/full/tema-clase-dfd 25/57

SINCRONIZACI ON EN MEMORIA COMPARTIDA   25

no tiene variables condicion, pero podemos pensar que hay una condicion

(declarada de manera implıcita) por cada objeto sincronizado.El metodo  notify  despierta a la hebra que esta al frente de la cola de

hebras suspendidas. Java utiliza la disciplina RC, por lo que la hebra queejecuta  notify  mantiene el cerrojo del objeto. La hebra despertada conti-nuara ejecutandose cuando consiga el acceso exclusivo al objeto. Java tambienproporciona el metodo  notifyAll  que despierta a todas las hebras suspen-didas en un objeto.

Un Ejemplo: El controlador de recursos

El problema del controlador de recursos va a servir para ilustrar el usode los monitores en Java, Ada y C. Este problema, que representa un sis-tema cliente/servidor tıpico, se enuncia del modo siguiente. Consideramosun controlador de recursos que gestiona el uso de una serie de objetos (10en el ejemplo) compartidos por varios procesos clientes. Cuando un clientenecesita recursos, se los pide al controlador. Si hay suficientes, el controladorse los proporciona, y decrementa de forma adecuada el numero de recursosdisponibles. Si no hay recursos suficientes, el cliente se suspende hasta quepueda ser atendido. Cuando un cliente ya no necesita los recursos que tiene,los devuelve al controlador.

En las Figuras 3.17.1, 3.17.2 y 3.17.3 se muestra el programa Java que

implementa este comportamiento. Es interesante notar que el cerrojo de laclase monitor actua como una condicion de cobertura. De esta forma cuandose devuelven recursos el monitor libera a todos los procesos suspendidos,y ellos mismos deciden si pueden continuar su ejecuci on o deben volver asuspenderse.

2.4.2. Ada95

El lenguaje Ada se desarrollo en el Departamento de Defensa de los Esta-dos Unidos con el objetivo de ser el lenguaje para programar las aplicaciones

de defensa que van de la programacion de sistemas empotrados a grandessistemas de informacion. Por lo tanto, las caracterısticas de concurrencia deAda son una parte importante del lenguaje, aunque tambien contiene meca-nismos para la programacion secuencial muy potentes.

El desarrollo de Ada se realizo a finales de los 70, y su primera estanda-rizacion data de 1983. Ada83 introdujo el mecanismo de  rendezvous  para la

Page 26: Tema Clase dfd

7/21/2019 Tema Clase dfd

http://slidepdf.com/reader/full/tema-clase-dfd 26/57

26   M. M. Gallardo Monitores

comunicacion entre procesos. De hecho se utiliza este termino porque el lıder

del equipo de diseno era frances. En 1995 aparecio la segunda version de Ada,compatible con la version anterior, pero que anade otras caracterısticas. Lasdos mas interesantes en el contexto de la programacion concurrente son lostipos protegidos, que se asemejan a monitores, y la instruccion  requeue, quepermite que el programador controle mejor la planificacion de los procesos.

En esta seccion, presentamos de forma resumida los principales meca-nismos para la concurrencia de Ada: tareas, rendezvous y tipos protegidos.Finalmente, vemos la implementacion del problema del controlador de recur-sos en este lenguaje.

TareasUn programa Ada esta compuesto por subprogramas, paquetes y tareas.

Un subprograma es un procedimiento o funcion, un paquete es un conjuntode declaraciones, y una tarea es un proceso independiente. Cada componen-te consta de una  especificaci´ on   y de un   cuerpo. La especificacion declaralos objetos visibles, mientras que el cuerpo contiene declaraciones e imple-mentaciones locales. Los subprogramas y los paquetes pueden ser tambiengenericos, es decir, pueden estar parametrizados con tipos de datos.

La declaracion de una tarea es

task   Tarea   i s

{ d e c l a r a c i o n e s   entry}end ;

Las declaraciones  entry  son parecidas a las declaraciones de subprogra-mas en modulos. Definen los servicios proporcionados por la tarea. Su sintaxises

entry   I d e n t i f i c a d o r ( p a r . f o r ma l e s ) ;

El paso de parametros puede ser por valor (in) o por referencia. Eneste caso se distinguen entre los parametros de entrada/salida (in out), yparametros de salida (out). Ada permite la declaracion de arrays de entradas,

que se llaman familias.El cuerpo de una tarea se declara como sigue;

task body   Tarea   i s{ d e c la r a ci o n es l o c a l e s }

begin{ i n s t r u c c i o n e s }

Page 27: Tema Clase dfd

7/21/2019 Tema Clase dfd

http://slidepdf.com/reader/full/tema-clase-dfd 27/57

SINCRONIZACI ON EN MEMORIA COMPARTIDA   27

end   Tarea ;

Las tareas tienen que declararse en subprogramas o paquetes. El progra-ma concurrente Ada mas sencillo es un unico procedimiento que contiene laespecificacion y el cuerpo de una tarea. La declaracion de una tarea crea unainstancia de la misma, que empieza a ejecutarse cuando lo hace el cuerpode la componente en la que ha sido declarada. Dicho cuerpo constituye, asi-mismo, una tarea anonima que se ejecuta concurrentemente con el resto detareas declaradas.

El par especificacion/cuerpo de una tarea define una instancia unica. Sinembargo, tambien es posible declarar arrays de tareas, a traves del uso detipos tareas . Del mismo modo, pueden combinarse tipos tarea con punteros

(tipos access en Ada) para crear tareas dinamicamente.

Rendezvous

En Ada83, el unico mecanismo de comunicacion y sincronizacion es elrendezvous . Supongamos que una tarea   T  declara una entrada  E. Cualquierotra tarea que este en el ambito de  T  puede usar el servicio E, invocandolocomo sigue:

T .E( p a r . r e a l e s ) ;

Como es usual, la ejecucion de esta llamada   suspende  a la tarea que la

ha realizado hasta que se complete el servicio   E. Por otro lado, la tarea   Tresponde a la llamada a   E   mediante una instruccion   accept, que tiene lasintaxis siguiente:

accept   E ( p a r . f o r m a l e s )   do{ i n s t r u c c i o n e s }

end ;

La ejecucion de  accept retrasa a la tarea  T  hasta que hay una llamada aE. En ese momento, T ejecuta el accept como si fuera un subprograma tıpico,copiando los parametros formales de entrada, ejecutando las instrucciones yproduciendo los parametros de salida. Cuando se ha completado el  accept,

ambas tareas  T  y la que llamo a  E, continuan su ejecucion.Este tipo de comunicacion y sincronizacion entre procesos se adecua de

forma natural a los sistemas cliente/servidor. La tarea que exporta las entra-das es el proceso servidor, y las tareas que piden los servicios son los clientes.

La instruccion de seleccion  select permite que la tarea servidora aceptepeticiones de servicios de forma indeterminista. La sintaxis de  select es

Page 28: Tema Clase dfd

7/21/2019 Tema Clase dfd

http://slidepdf.com/reader/full/tema-clase-dfd 28/57

28   M. M. Gallardo Monitores

s e l e c t

when   B1 =>accept   E1 ( p a r . f o r m a l e s )   do

{ i n s t r u c c i o n e s }end ;{ o t r as i n s t r u c c i o n e s }

or. . . .

orwhen   Bn =>

accept   En ( p a r . f o r m a l e s )   do{ i n s t r u c c i o n e s }

end ;{ o t r as i n s t r u c c i o n e s }

end select  ;

Cada rama   or   se llama  alternativa . Cada  Bi  es una expresion booleana(guarda ): las clausulas  when   son opcionales. Una alternativa esta  abierta   sies cierta la expresion booleana Bi  (si no existe, es  true) y es posible realizarla cita en ese momento (alguna otra tarea ha llamado a la entrada  Ei).

La ejecucion de una instruccion select suspende al proceso servidor has-ta que alguna de las alternativas este abierta. En este caso, se selecciona de

forma indeterminista una alternativa, de entre todas las abiertas, para con-tinuar la ejecucion. Una de las principales caracterısticas de este modelo esque la guardas   no pueden  hacer referencia a los parametros formales de lainstruccion  accept  asociada. Esto produce muchos inconvenientes a la horade modelar sistemas. Un ejemplo tıpico es el problema del controlador derecursos presentado en el ejemplo de la Seccion 2.4.1. La introduccion de lostipos protegidos en Ada95 tiene como objetivo resolver esta situaci on.

Las instrucciones select pueden contener, asimismo, una alternativa adi-cional (que aparece como ultima rama) de tipo terminate, delay o else. Es-tas alternativas se excluyen entre sı, es decir, una instruccion select no pue-

de contener simultaneamente ningun par de ellas. La alternativa  terminatesirve para terminar de forma  suave  a los procesos servidores cuando ya  nohacen falta . Las otras dos alternativas son mas propias de la programacionde tiempo real:  delay permite que la tarea servidora pueda proseguir su eje-cucion, si no se produce una cita en un tiempo especificado;  else define estetiempo como 0.

Page 29: Tema Clase dfd

7/21/2019 Tema Clase dfd

http://slidepdf.com/reader/full/tema-clase-dfd 29/57

SINCRONIZACI ON EN MEMORIA COMPARTIDA   29

Tipos Protegidos

Ada95 mejora los mecanismos para la concurrencia de Ada83 de variasformas. Los dos mas significativos son los tipos protegidos, que permitenel acceso sincronizado a datos compartidos, y la instruccion   requeue, quepermite utilizar los argumentos de las llamadas para planificar y sincronizara los procesos (resolviendose el problema comentado en la seccion anterior).

Un tipo protegido se parece a un monitor segun se ha estudiado en lapresente leccion. Sirve para encapsular datos compartidos (asegurando laexclusion mutua) y para sincronizar el acceso a los mismos. La especificaci onde un tipo protegido es como sigue:

protected type   Tipo   i s{ e sp . de f u n c i o n es , p r o c e di m i e n t os y d ec .   entry}

private{d ec . de v a r i a b l e s }

end   Tipo ;

El cuerpo del tipo se define como

protected body   Tipo   i s{ c ue rp o d e f u n c i o n es , p r o c e di m i e n to s y   entry}

end   Tipo ;

Las funciones protegidas proporcionan acceso solo para   lectura   de las

variables privadas. Por lo tanto, una funcion protegida puede ser llamadasimultaneamente por varias tareas. Los procedimientos protegidos garanti-zan el uso exclusivo (para lectura o escritura) de las variables privadas. Lasentradas protegidas (entry) son como los procedimientos protegidos, salvoque permiten el uso de clausulas   when  que funcionan como condiciones desincronizacion. En cada momento, puede haber a lo sumo una tarea ejecu-tando un procedimiento o una entrada protegida. Una llamada a una entradaprotegida se suspende hasta que la guarda se satisface y el proceso que llamatiene acceso exclusivo a la variables privadas: la condicion de sincronizacionno puede  depender de los parametros de la llamada.

Las llamadas a los procedimientos y entradas protegidas forman una colafifo y se resuelven en este orden, considerando las condiciones de sincroniza-cion sobre las entradas. La instruccion  requeue puede utilizarse en el cuerpode un procedimiento protegido o de una entrada para retrasar la terminaci onde la llamada que se esta resolviendo. Esta instruccion tiene la forma:

requeue   Operacion ;

Page 30: Tema Clase dfd

7/21/2019 Tema Clase dfd

http://slidepdf.com/reader/full/tema-clase-dfd 30/57

30   M. M. Gallardo Monitores

donde  Operacion   es el nombre de una entrada o procedimiento protegido

con los mismos parametros (o sin ningun parametro) que la operacion quese esta ejecutando. El efecto de  requeue  es situar la llamada en curso en lacola de  Operacion, como si la tarea que realizo la primera llamada hubierallamado directamente a  Operacion.

En las Figuras 3.18.1, 3.18.2 y 3.18.3 aparece la implementacion del pro-blema del controlador de recursos usando los tipos protegidos de Ada95.

2.4.3. La biblioteca Pthreads

Como vimos en la Seccion 2.4.1, una  hebra  es un proceso de peso ligero.

Algunos sistemas operativos proporcionan mecanismos que permiten progra-mar aplicaciones multihebras. Sin embargo, como estos mecanismos suelen serdiferentes, las aplicaciones no son portables entre distintos sistemas operati-vos. Para resolver esta situacion, a mediados de los 90, se definio un conjuntode rutinas C de librerıa para la programacion multihebra. Los investigadoresque la realizaron pertenecıan a la organizacion POSIX (portable operatingsystems interface), de ahı que la librerıa se llame Pthreads (POSIX Threads).

La librerıa contiene muchas funciones para el manejo y sincronizacion delas hebras. En esta seccion, se describe solo aquellas que permiten crearlas ysincronizarlas mediante monitores.

La creacion de Hebras

Para usar Pthreads en un programa C hay que seguir los cuatro pasossiguientes. Primero, hay que incluir la cabecera de la librerıa Pthreads:

# i n c l u d e   <pthr ead . h>

Segundo, hay que declarar una variable descriptor de atributos, y uno omas descriptores de hebras:

p t h re a d a t t r t t a t t r ;   / ∗   a t r i b u t os de l a h eb ra    ∗/ 

p t h re a d t t i d ;   / ∗   d e s c ri p t o r de l a h eb ra    ∗/ Tercero, hay que inicializar los atributos ejecutando lo que sigue

p t h r e a d a t t r i n i t (& t a t t r ) ;p t h r e a d a t t r s e t sc o p e (&t at tr ,PTHREAD SCOPE SYSTEM) ;

Finalmente, hay que crear las hebras como se describe a continuacion.

Page 31: Tema Clase dfd

7/21/2019 Tema Clase dfd

http://slidepdf.com/reader/full/tema-clase-dfd 31/57

SINCRONIZACI ON EN MEMORIA COMPARTIDA   31

Los atributos iniciales de una hebra son asignados antes de su creacion

(muchos de ellos pueden modificarse mediante funciones). Los atributos dela hebra son el tamano de la pila de la hebra, su prioridad de planificaci on,y el ambito de la planificacion (local o global). Habitualmente, es suficientecon los atributos que se dan por defecto, con excepcion del ambito de laplanificacion. A veces, el programador prefiere que la hebra sea planificadaglobalmente, en vez de localmente, lo que significa que va a competir contodas las hebras del sistema, y no solo con las hebras que tienen el mismoproceso padre. La llamada a  pthread attr setscope  hace esto.

Para crear una hebra se llama a la funcion   pthread create  como en

p t h r e a d c r e a t e (& t i d ,& t a t t r , s t a r t f u n c , a r g ) ;

El primer argumento es la direccion del descriptor de la hebra, el segundola direccion de sus atributos que se han inicializado previamente. La nuevahebra comienza su ejecucion llamando a  start func  con el argumento  arg.Si la creacion de la hebra tiene exito   pthread create  devuelve 0, en otrocaso, devuelve un valor no nulo que indica el error producido.

Una hebra termina su ejecucion llamando a

p t h r e a d e x i t ( v a l o r ) ;

El  valor  es un valor de retorno simple (o la constante   NULL). La rutinaexit se llama de forma implıcita si la hebra termina la ejecucion de la funcion

con la que comenzo su ejecucion. La hebra padre puede esperar a que la hijotermine ejecutando

p t h r e a d j o i n ( t i d , p t r )

donde   tid   es el descriptor de la hebra hijo, y   ptr  es la direccion del valordevuelto por la hebra hijo cuando ejecuta  exit.

Cerrojos y Variables Condicion

La librerıa POSIX contiene cerrojos y variables condicion. Los cerrojospueden utilizarse para proteger las secciones crıticas, o pueden combinarse

con variables condicion para simular monitores.Los cerrojos en la librerıa POSIX se llaman cerrojos mutex  o simplemente

mutexes . El codigo para declarar e inicializar un mutex es similar al vistopara las hebras. Primero, declaramos variables globales para el descriptor ylos atributos del mutex. Segundo, inicializamos los descriptores y finalmente,usamos las primitivas mutex.

Page 32: Tema Clase dfd

7/21/2019 Tema Clase dfd

http://slidepdf.com/reader/full/tema-clase-dfd 32/57

32   M. M. Gallardo Monitores

Si el mutex va a ser utilizado solo por hebras del mismo proceso, los

primeros dos pasos pueden simplificarse como sigue:p t h r e a d m u t e x t mu te x ;pt hr ea d mu te x in it (&mutex ,NULL) ;

Esto inicializa mutex con los atributos por defecto. Una seccion crıticaque usa mutex se implementarıa como sigue:

pthr ead mutex lock (& mutex ) ;/ ∗   s ec ci on c r i t i c a    ∗/ pthr ead mutex unlock (& mutex ) ;

Un mutex puede ser desbloqueado (unlock) solo por la hebra que tieneel cerrojo.

Las variables condicion en la librerıa Pthread son muy parecidas a lasutilizadas en este tema. Como los cerrojos, tienen descriptores y atributos.Una variable condicion se declara y se inicializa por defecto como sigue:

p t h r e ad c o n d t co nd ;pt hr ea d co nd in it (& cond ,NULL) ;

Las principales operaciones sobre las variables condicion son wait (delay),signal (resume) y  broadcast   (resume all). Estas operaciones deben ejecu-tarse mientras se tiene un cerrojo. En particular, un monitor puede simularsecogiendo un cerrojo antes de ejecutar un procedimiento y desbloque andolo

al salir.Los parametros de  pthread cond wait  son una variable condicion y unmutex. Una hebra que quiera esperar tiene que coger el cerrojo. Por ejemplo,supongamos que una hebra ha ejecutado

p t h r e a d c o n d l o c k (& mu tex ) ;

y luego ejecuta

pthr ead cond wait (& cond ,& mutex ) ;

Esto hace que la hebra libere  mutex y espere en  cond. Cuando una hebrase reactiva tendra que volver a poseer  mutex, por lo que se bloqueara hastaque no lo tenga. Cuando otra hebra ejecute

p t h r e a d c o n d s i g n a l (& co nd ) ;

despertara una hebra (si hay alguna bloqueada), pero la hebra que la des-perto continua su ejecucion manteniendo  mutex.

Como aplicacion, en la Figuras 3.19.1 y 3.19.2 aparece el problema delControlador de Recursos utilizando Pthreads.

Page 33: Tema Clase dfd

7/21/2019 Tema Clase dfd

http://slidepdf.com/reader/full/tema-clase-dfd 33/57

CAPITULO 3

Figuras

3.1. Problema de la Actualizacion Multiple

program   Act mult ;var   n : integer ;

p r o c e s s p1 ; p r o c e s s p2 ;

var   i : integer ;   var   i : integer ;

begin beginfor   i :=1   to   1 0   do f or   i :=1   to   1 0   do

n : = n + 1 ; n : = n + 1 ;

end ;   end ;

begin

n : = 0 ;c o b e g i n

p1 ; p2 ;coend ;

end .

33

Page 34: Tema Clase dfd

7/21/2019 Tema Clase dfd

http://slidepdf.com/reader/full/tema-clase-dfd 34/57

34   M. M. Gallardo Monitores

3.2. Problema del productor/consumidor

program   Prod Cons ;

var   n : integer ;

p ro ce ss p r o d u ct o r ; p ro ce ss consumidor ;

begin beginrepeat repeat

n:=random ( 2 0 ) ;   write ( n ) ;f o r e v e r f o r e v e r

end ;   end ;

beginc o b e g i n

pro duc tor ; consumidor ;coend ;

end .

3.3. Exclusion mutua con semaforos

program   Act mult Sem ;var   n : integer ;s : sema phore ;

p r o c e s s p1 ; p r o c e s s p2 ;var   i : integer ;   var   i : integer ;

begin beginfor   i :=1   to   1 0   do begin for   i :=1   to   1 0   do begin

w ai t ( s ) ; wa it ( s ) ;n : = n + 1 ; n : = n + 1 ;s i g n a l ( s ) ; s i g n a l ( s ) ;

end ; end ;   end ; end ;

beginn : = 0 ; i n i t i a l ( s , 1 ) ;c o b e g i n p1 ; p2 ;coend ;

end .

Page 35: Tema Clase dfd

7/21/2019 Tema Clase dfd

http://slidepdf.com/reader/full/tema-clase-dfd 35/57

FIGURAS    35

3.4. Problema del productor/consumidor con

semaforos

program   Prod Cons Sem ;var   n : integer ;

s dato s , s l e i do : s emaphor e ;

p ro ce ss p r o d u ct o r ; p ro ce ss consumidor ;begin begin

repeat repeatwa i t ( s l e i d o ) ; wa it ( s d a t o s ) ;n:=random (2 0 ) ;   write ( n ) ;s i g n a l ( s d a t o s ) s i g n a l ( s l e i d o )

f o r e v e r f o r e v e rend ;   end ;

begini n i t i a l ( s l ei d o , 1 ) ; i n i t i a l ( sda to s , 0 ) ;c o b e g i n

pro duc tor ; consumidor ;

coend ;end .

Page 36: Tema Clase dfd

7/21/2019 Tema Clase dfd

http://slidepdf.com/reader/full/tema-clase-dfd 36/57

36   M. M. Gallardo Monitores

3.5. Exclusion mutua con monitores

program   Act mult Mon ;

monito r varcomp ;e x p o r t suma , e s c r i b e ;var   n : integer ;procedure   suma ;   procedure   e s c r i b e ;

begin beginn : = n + 1 ;   write ( n )

end ;   end ;

beginn:=0

end ;p r o c e s s p1 ; p r o c e s s p2 ;

var   i : integer ;   var   i : integer ;begin begin

for   i :=1   to   1 0   do f or   i :=1   to   1 0   dovarcomp . suma varcomp . suma

end ;   end ;begin

c o b e g i n

p1 ; p2 ;coend ;var comp . e s c r i be ;

end .

Page 37: Tema Clase dfd

7/21/2019 Tema Clase dfd

http://slidepdf.com/reader/full/tema-clase-dfd 37/57

FIGURAS    37

3.6. Productor/consumidor simple con moni-

tores

program   Prod Cons Mon1 ;m o ni t or c a n a l ;

e x p or t e s c r i b e , l e e ;var   n : integer ;

l e i d o : boolean ;c d a to s , c l e i d o : c o n d i t i o n ;

procedure   e s c r i b e (m : integer ) ;

begini f not   l e i d o   then   d e l a y ( c l e i d o ) ;n : = m;l e i d o : =   f a l s e ;resume( cdat os )

end ;procedure   l e e ( var   m:  integer ) ;

begini f    l e i d o   then   dela y ( cdat os ) ;

m := n ;l e i d o : =   true ;

r es um e ( c l e i d o ) ;end ;

begin   l e i d o : =   true ;

end ;p ro ce ss p r o d u ct o r ; p ro ce ss consumidor ;var   m:  integer ;   var   m: integer ;begin begin

repeat repeatm:=random ( 2 0 ) ; c a n a l . l ee (m) ;c a n a l . e s c r i b e (m ) ;   write (m);

f o r e v e r f o r e v e r

end ;   end ;begin

c o b e g i n p r o d u c t o r ; c o n su m i do r ; c o en d ;

end .

Page 38: Tema Clase dfd

7/21/2019 Tema Clase dfd

http://slidepdf.com/reader/full/tema-clase-dfd 38/57

38   M. M. Gallardo Monitores

3.7. Semaforos con Monitores. Disciplina RW

program   Sem Mon;var   n : integer ;m o n i t or s ;

e xp o rt s i n i t i a l , s wa it , s s i g n a l ;var   v a l o r : integer  ; n o nu l o : c o n d i t i o n ;procedure   s i n i t i a l ( n : integer ) ;

beginv al o r : = n ;

end ;

procedure   s wai t ;begin

i f    v a lo r = 0   then   d e l a y ( n o n u lo ) ;v a l o r : = v a l o r   −   1 ;

end ;procedure   s s i g n a l ;begin

v al o r : = v al or + 1 ;r es um e ( n o n u lo ) ;

end ;

end ;

beginp r o c e s s p1 ; p r o c e s s p2 ;

var   i : integer ;   var   i : integer ;

begin beginfor   i :=1   to   1 0   do begin for   i :=1   to   1 0   do begin

s . s w a i t ; s . s w a i t ;n : = n + 1 ; n : = n + 1 ;s . s s i g n a l ; s . s s i g n a l ;

end ;   end ;

end ;   end ;

beginn : = 0 ; s . s i n i t i a l ( 1 ) ;cobe gin p1 ; p2 ;coend ;

end .

Page 39: Tema Clase dfd

7/21/2019 Tema Clase dfd

http://slidepdf.com/reader/full/tema-clase-dfd 39/57

FIGURAS    39

3.8. Semaforos con Monitores. Disciplina RC

program   Sem MonII ;var   n : integer ;m o n i t or s ;

e xp o rt s i n i t i a l , s wa it , s s i g n a l ;var   v a l o r : integer ;

n o n u lo : c o n d i t i o n ;

procedure   s i n i t i a l ( n : integer ) ;begin

v al o r : = n ;

end ;procedure   s w a i t ;begin

while   v a l o r = 0   do   d e l a y ( n o n u lo ) ;v a l o r : = v a l o r   −   1 ;

end ;procedure   s s i g n a l ;

beginv al o r : = v al or + 1 ;r es um e ( n o n u lo ) ;

end ;

end ;beginp r o c e s s p1 ; p r o c e s s p2 ;

var   i : integer ;   var   i : integer ;begin begin

for   i :=1   to   1 0   do begin for   i :=1   to   1 0   do begins . s w a i t ; s . s w a i t ;n : = n + 1 ; n : = n + 1 ;s . s s i g n a l ; s . s s i g n a l ;

end ;   end ;

end ;   end ;begin

n : = 0 ; s . s i n i t i a l ( 1 ) ;cobe gin p1 ; p2 ; coend ;

end .

Page 40: Tema Clase dfd

7/21/2019 Tema Clase dfd

http://slidepdf.com/reader/full/tema-clase-dfd 40/57

40   M. M. Gallardo Monitores

3.9. Semaforos con Monitores. Disciplina RC

and RW

m o n i t or s ;e xp o rt s i n i t i a l , s wa it , s s i g n a l ;var   v a l o r : integer ;

n o n u lo : c o n d i t i o n ;

procedure   s i n i t i a l ( n : integer ) ;

begin

v al o r : = n ;end ;

procedure   s wai t ;

begini f    v a lo r = 0   then

d e l a y ( n o n u lo )

e l s ev a l o r : = v a l o r   −   1 ;

end ;

procedure   s s i g n a l ;

begin

i f    empty( nonulo )   thenv a lo r : = v a lo r + 1

e l s er e s u m e ( n o n u l o )

end ;

end ;

Page 41: Tema Clase dfd

7/21/2019 Tema Clase dfd

http://slidepdf.com/reader/full/tema-clase-dfd 41/57

FIGURAS    41

3.10. Buffer acotado

type   t d a t o s =   integer ;

m on it or b u f f e r ;e x p o r t d e p o s i t a r , e x t r a e r ;const   N = . . . ;var   b : array [ 0 . . N−1 ]   of    t d a t o s ;

ind p , ind c , nelems : integer ;n o v a c i o , n o l l e n o : c o n d i t i o n ;

procedure   d e p o s i t a r (m: t d a t o ) ;begin

while   n e l e m s = N   do   d e l a y ( n o l l e n o ) ;b [ i n d p ] : = m;i nd p : = ( i nd p + 1 )   mod   N;n e l e m s : = n e l e m s + 1 ;resume( novac io )

end ;procedure   e x t r a e r ( var   m: tdato ) ;begin

while   n e l e m s = 0   do   dela y ( nova cio );

m : = b [ i n d c ] ;i nd c : = ( i n d c + 1 )   mod   N;n e le m s : = n e le m s   −   1 ;r esume( noll en o )

end ;begin

n el em s : = 0 ;i nd p : = 0 ;i nd c : = 0 ;

end ;

Page 42: Tema Clase dfd

7/21/2019 Tema Clase dfd

http://slidepdf.com/reader/full/tema-clase-dfd 42/57

42   M. M. Gallardo Monitores

3.11. Lectores/Escritores (Disciplinas RW o

RUW)

monitor BD;e xp or t e n t r a l e c t o r , e n t r a e s c r i t o r ,

s a l e l e c t o r , s a l e e s c r i t o r ;var   n l e c t o r e s : integer ; e s c r i b i e n d o : boolean ;

o k l e c t o r , o k e s c r i t o r : c o n d i t i o n ;

procedure   e n t r a l e c t o r ;begin

i f    e s c r i b i e n d o   or not   emp ty ( o k e s c r i t o r )   thend e l a y ( o k l e c t o r ) ;

n l e c to r e s : = n l e c to r e s + 1;r es um e ( o k l e c t o r ) ;

end ;

procedure   e n t r a e s c r i t o r ;begin

i f    e s c r i b i e n d o   or   ( n l e c t o r e s   >   0 )   thend e l ay ( o k e s c r i t o r ) ;

e s c r i b i e n d o : =   true ;end ;

procedure   s a l e l e c t o r ;begin

n l e c t o r e s : = n l e c t o r e s   −   1 ;

i f    n l e c to r e s = 0   then   r es um e ( o k e s c r i t o r ) ;

end ;procedure   s a l e e s c r i t o r ;begin

e s c r i b i e n d o : =   f a l s e ;i f not   empty( ok le ct or )   then

r es u me ( o k l e c t o r )

e l s e

r es um e ( o k e s c r i t o r ) ;end ;

begin   n l e c t o r e s : = 0 ;e s c r i b i e n d o : =   f a l s e ;   end ;

Page 43: Tema Clase dfd

7/21/2019 Tema Clase dfd

http://slidepdf.com/reader/full/tema-clase-dfd 43/57

FIGURAS    43

3.12. Lectores/Escritores (sigue)

p r o c e s s   type   l e c t o r ; p r o c e s s   type   e s c r i t o r ;

begin beginrepeat repeat

BD. e n t r a l e c t o r ; BD. e n t r a e s c r i t o r ;( ∗ l e c t o r en l a BD  ∗) ( ∗ e s c r i t o r en l a BD  ∗)BD. s a l e l e c t o r ; BD. s a l e e s c r i t o r ;

f o r e v e r f o r e v e r

end ;   end ;

Page 44: Tema Clase dfd

7/21/2019 Tema Clase dfd

http://slidepdf.com/reader/full/tema-clase-dfd 44/57

44   M. M. Gallardo Monitores

3.13. Lectores/Escritores (Disciplina RC)

monitor BD;e xp or t e n t r a l e c t o r , e n t r a e s c r i t o r ,

s a l e l e c t o r , s a l e e s c r i t o r ;var   n l e c t o r e s : integer ;

e s c r i b i e n d o : boolean ;o k l e c t o r , o k e s c r i t o r : c o n d i t i o n ;

procedure   e n t r a l e c t o r ;

beginwhile   e s c r i b i e n d o   or not   emp ty ( o k e s c r i t o r )

do   d e l a y ( o k l e c t o r ) ;n l e c to r e s : = n l e c to r e s + 1;

end ;procedure   e n t r a e s c r i t o r ;

beginwhile   e s c r i b i e n d o   or   ( n l e c t o r e s   >   0)

do   d e l a y ( o k e s c r i t o r ) ;e s c r i b i e n d o : =   true ;

end ;

procedure   s a l e l e c t o r ;begin

n l e c t o r e s : = n l e c t o r e s   −   1 ;

i f    n l e c to r e s = 0   then   r es um e ( o k e s c r i t o r ) ;end ;procedure   s a l e e s c r i t o r ;

begine s c r i b i e n d o : =   f a l s e ;r e s u m e a l l ( o k l e c t o r ) ;r es um e ( o k e s c r i t o r ) ;

end ;

beginn l e c to r e s : = 0 ;e s c r i b i e n d o : =   f a l s e ;

end ;

Page 45: Tema Clase dfd

7/21/2019 Tema Clase dfd

http://slidepdf.com/reader/full/tema-clase-dfd 45/57

FIGURAS    45

3.14. Temporizador

mon ito r Temp;expor t duerme , t i c ;

var   hora : integer ;mihor a : con di ti on ;

procedure   duerme( t : integer ) ;var   hor ades p : integer ;

beginh o ra d es p : = h or a + t ;while   hora   <   hor ades p   do begin

dela y ( mihor a );r esume( mihor a );

end ;

end ;

procedure   t i c ;begin

h o r a : = h o r a + 1 ;r esume( mihor a ) ;

end ;

beginh o r a : = 0 ;

end ;

p r o c e s s   type   do r mil on ; p r o c e s s r e l o j ;var   t e s p e r a : integer ;

begin beginrepeat repeat

t e s p e r a : = random (C ) ; s l e e p ( 1 ) ;Temp . duerme ( t e s p e r a ) ; Temp . t i c ;( ∗ e j e c u ta t a re a p e r i od i c a   ∗)   f o r e v e r

f o r e v e r   end ;end ;

Page 46: Tema Clase dfd

7/21/2019 Tema Clase dfd

http://slidepdf.com/reader/full/tema-clase-dfd 46/57

46   M. M. Gallardo Monitores

3.15. Temporizador con prioridad

mon ito r Temp;expor t duerme , t i c ;

var   hora : integer ;mihor a : con di ti on ;

procedure   duerme( t : integer ) ;

var   hor ades p : integer ;

beginh o ra d es p : = h or a + t ;

i f    hora   <   hor ades p   then   del ay ( mihora , horad esp ) ;

end ;

procedure   t i c ;begin

h o r a : = h o r a + 1 ;

while not   empty(mihora )   and(minr ank(mihor a)   <= hor a )   do

r esume( mihor a ) ;

end ;

beginh o r a : = 0 ;

end ;

p r o c e s s   type   do rm ilo n ; p r o c e s s r e l o j ;

var   t e s p e r a : integer ;

begin beginrepeat repeat

t e s p e r a : = random (C ) ; s l e e p ( 1 ) ;Temp . duerme ( t e s p e r a ) ; Temp . t i c ;

( ∗ e j e c ut a t a re a p e r io d i c a   ∗)   f o r e v e rf o r e v e r   end ;

end ;

Page 47: Tema Clase dfd

7/21/2019 Tema Clase dfd

http://slidepdf.com/reader/full/tema-clase-dfd 47/57

FIGURAS    47

3.16. Barbero Dormilon

m o ni t or b a r b e r i a ;e x p or t c o r t a r , s i g u i e n t e , t r a b a j o t e r m i n a do ;var   b l i b r e , s o cu p ad a , p a b i e r t a : boolean ;

c b l i b r e , c s o cu p ad a , c p a b i e r t a , c c i c l o : c o n d i t i o n ;

procedure   s i g u i e n t e ;begin

b l i b r e : =   true ;r es um e ( c b l i b r e ) ;

i f not   socupada   thendela y ( cs ocupada );

socupada:= f a l s e ;end ;procedure   t r a b a j o t e r m i n a d o ;

beginp a b i e r t a : =   true ;r es um e ( c p a b i e r t a ) ;i f    p a b i e r t a   then

d e l a y ( c c i c l o ) ;end ;procedure   c o r t a r ;

begin

i f not   b l i b r e   thend e l a y ( c b l i b r e ) ;

b l i b r e : =   f a l s e ;s o c up a d a : =   true ;r es ume(cs ocupada );i f not   p a b i e r t a   then

d e l a y ( c p a b i e r t a ) ;p a b i e r t a : =   f a l s e ;r es um e ( c c i c l o )

beginb l i b r e : =   f a l s e ;

s o c up a d a : =   f a l s e ;p a b i e r t a : =   f a l s e ;

end ;

Page 48: Tema Clase dfd

7/21/2019 Tema Clase dfd

http://slidepdf.com/reader/full/tema-clase-dfd 48/57

48   M. M. Gallardo Monitores

p r o c e s s b a r b er o ; p r o c e s s   type   c l i e n t e ;

begin beginrepeat repeat

b a r b e r i a . s i g u i e n t e ; s l e e p (T)( ∗ b a rb e ro p e l a   ∗)   b a r b e r i a . c o r t a r ;b a rb e ri a . t ra b aj o t e rm i na d o ; f o r e v e r

f o r e v e r   end ;end ;

Page 49: Tema Clase dfd

7/21/2019 Tema Clase dfd

http://slidepdf.com/reader/full/tema-clase-dfd 49/57

FIGURAS    49

3.17. Controlador de Recursos en Java

3.17.1. Clase Monitor

import   java . io . ∗ ;

p ub li c c l a s s   c o n t r o l {

/ ∗ ∗   C re a t es new c o n t r o l    ∗/ 

pr ivate int   N = 1 0 ;

pr ivate int   r d i s = N ;public synchronized void   pidoRec( int   id , i nt   n ){

while   ( n   >   r d i s ){System . out . pr i nt ln (”hebr a ”+id+” es p er a ” ) ;tr y {   w a i t ( ) ;

}catch   ( I n t e r r u p t e d E x c e p t i o n e ){ } ;

} ;r d i s = r d i s   −   n ;

}

public synchronized void   devuelvo Rec ( in t   n ){r d is = r d is + n ;

n o t i f y A l l ( ) ;}

}

Page 50: Tema Clase dfd

7/21/2019 Tema Clase dfd

http://slidepdf.com/reader/full/tema-clase-dfd 50/57

50   M. M. Gallardo Monitores

3.17.2. Clase hebra

import   c o n t r o l ;import   jav a . ut i l .Random;

import   java . io . ∗ ;p ub li c c l a s s   hebr a   extends   Thread{

private   c o n t r o l mic ;

pr ivate int   miid ;

public   h e br a ( c o n t r o l c , i nt   i d )   {mic = c ;m i id = i d ;

}public void   run () {

Random rn =   new   Random( ) ;

int   d ;f or   ( i nt   i = 1 ; i   <   1 0 ; i ++){

d = ( r n . n e x t In t ( 6 ) ) + 1 ;mic . pidoRec ( miid , d ) ;S ys te m . o u t . p r i n t l n ( m i id + ” ” + d ) ;try   {Thr ead . s l ee p (( rn . nex tIn t (6 )) ∗ 1 0 0 0 ) ;}catch   ( E x c e p t i o n e ){} ;

mic . devuelvo Rec (d ) ;}

}}

Page 51: Tema Clase dfd

7/21/2019 Tema Clase dfd

http://slidepdf.com/reader/full/tema-clase-dfd 51/57

FIGURAS    51

3.17.3. Clase main

import   c o n t r o l ;import   hebra ;

c l a s s   Main{/ ∗ ∗   Creat es new Main    ∗/ 

p u bl ic s t a t i c v oid   ma in ( S t r i n g [ ] a r g )   {c o nt r ol c =   new   c o n t r o l ( ) ;h e b ra [ ] h =   new   h eb ra [ 1 0 ] ;

for   ( i nt   i =0; i <10; i ++){

h [ i ] =   new   h e b ra ( c , i ) ;}for   ( i nt   i =0; i <10; i ++){

h [ i ] . s t a r t ( ) ;}

}}

Page 52: Tema Clase dfd

7/21/2019 Tema Clase dfd

http://slidepdf.com/reader/full/tema-clase-dfd 52/57

52   M. M. Gallardo Monitores

3.18. Problema del Controlador de Recursos

en Ada

3.18.1. Paquete Control

genericN : i n t eg e r ;

package   c o n t r o l   i s

protected   c o n t r o l a d o r   i s

entry   p i d oR e c ( i d : i n t e g e r ; num : i n t e g e r ) ;procedure   devuelvoRec (num: in te ge r );private

r d i s : i n t e g e r :=N ;

entry   denuevo( id : in te ge r ;num: int eg er );haymas : boo lea n:= f a l s e ;e s p e r a n d o : i n t e g e r : = 0 ;

end   c o n t r o l a d o r ;

end ;

Page 53: Tema Clase dfd

7/21/2019 Tema Clase dfd

http://slidepdf.com/reader/full/tema-clase-dfd 53/57

FIGURAS    53

3.18.2. Cuerpo de Control

package body   c o n t r o l   i sprotecte d body   c o n t r o l a d o r   i sentry   pidoRec ( id : in te ge r ;num: int eg er )   when   r d i s   >   0   i sbegin

i f    num <= r d i s   thenr d i s : = r d i s   −   num;

e l s erequeue   denuevo ;

end i f   ;

end ;entry   denuevo( id : in te ge r ;num: int eg er )   when   haymas   i sbegin

e s p er a n d o : = e s p er a n d o   −   1 ;i f    e s p e r a n d o = 0   then

haymas : = f a l s e ;

end i f   ;i f    r d i s   >= num   then

r d i s : = r d i s   −   num;

e l s erequeue   denuevo ;

end i f   ;end ;

procedure   devuelvo Rec (num: in t eg er )   i sbegin

r d i s : = r d i s + num ;

i f    denu evo ’ Count   >   0   thenes per ando := denuevo ’ count ;haymas := tr u e ;

end i f   ;end ;end   c o n t r o l a d o r ;

end   c o n t r o l ;

Page 54: Tema Clase dfd

7/21/2019 Tema Clase dfd

http://slidepdf.com/reader/full/tema-clase-dfd 54/57

54   M. M. Gallardo Monitores

3.18.3. Programa Principal

with   c o n t r o l ;   with   Ada . Numerics . Discre te Rand om ;

procedure   main   i stype   r ango   i s r ange   1 . . 1 0 ;

package   mirandom   i snew   Ada . Numerics . Discrete Random ( rango );

use   mirandom ;

package   n c o n t r o l   i s new   c o n t r o l ( 1 0 ) ;

use   n c o n t r o l ;task type   c l i e n t e   i s

entry   nombr e( id : in te ge r );

end ;task body   c l i e n t e   i s

m i i d : i n t e g e r ;g : g e ne ra t or ;d : i n t e ge r ;

beginaccept   nombr e( id : in te ge r )   do

m ii d : = i d ;

end ;r e s e t ( g ) ;

for   i   in   1 . . 3   loopd : = i n t e g e r ( r andom ( g ) ) ;c o n t r o l a d o r . pi do Re c ( m ii d , d ) ;−−   uso l o s d r ec u r so s  c o n t r o l a d o r . d e v ue l v o Re c ( d ) ;

end loop ;

end ;t a r e a : array ( 1 . . 4 )   of    c l i e n t e ;

begin

for   i   in   1 . . 4   loopta re a ( i ) . nombre( i ) ;

end loop ;

end ;

Page 55: Tema Clase dfd

7/21/2019 Tema Clase dfd

http://slidepdf.com/reader/full/tema-clase-dfd 55/57

FIGURAS    55

3.19. Pthreads

3.19.1. Monitor

#define   REENTRANT

#include   <pthr ead . h>#include   < s t d i o . h>

#define   NumRec 1 0#define   NumProc 5

p t hr e ad m u te x t mutex ; p t h r e a d c o n d t e s p e r a ;int   re cd i s = NumRec;

void   pidoRec( int   n , i nt   i d ){pthr ead mute x lock (& mutex ) ;while   ( r e c d i s   <   n ){

p r i n t f ( ” T r a b a ja d o r %d p i d e %d  −−   e s p e r a \n” , i d , n ) ;pthr ead cond wait(& es per a ,& mutex );

}r e c di s = r e c d is   −   n ;

p r i n t f ( ” T r ab a j ad o r %d p i d e %d  −−   coge \n ” , i d , n ) ;pthr ead mutex unlock (& mutex ) ;

}

void   devuelvo Rec ( int   n , i nt   i d ){pthr ead mute x lock (& mutex ) ;r e c di s = r e c d is + n ;p r i n t f ( ” T r ab a j ad o r %d d e v u e l v e %d\n ” , i d , n ) ;p t h r e a d c o n d b r o a d c a s t (& e s p e r a ) ;pthr ead mutex unlock (& mutex ) ;

}

Page 56: Tema Clase dfd

7/21/2019 Tema Clase dfd

http://slidepdf.com/reader/full/tema-clase-dfd 56/57

56   M. M. Gallardo Monitores

3.19.2. Hebras y Programa Principal

void   ∗ c l i e n t e ( void   ∗ ar g ){int   m i i d = ( int ) a rg ;int   d , i ;

for   ( i = 0 ; i  <10; i+ +){d = r an d ( ) % 1 0 ;pidoRec (d , miid ) ;devuelvoRec (d , miid ) ;

}pt hr ea d ex it (NULL) ;

}

int   main( int   ar gc , char   ∗ a r gv [ ] ) {int   i ;

p t h r e a d a t t r t a t r i b ;pt hr ea d t c [ NumProc ] ;

p t h r e a d a t t r i n i t (& a t r i b ) ;p t h re a d a t t r s e t s c o p e (&at ri b ,PTHREAD SCOPE SYSTEM) ;i =p t h r e a d a t t r s e t s c h e d p o l i c y (& a t r i b , SCHED RR ) ;

p r i n t f ( ” %d\n” , i ) ;

pt hr ea d mu te x in it (&mutex ,NULL) ;p t h r e a d c o n d i n i t ( & e s p e r a , N U L L ) ;

for   ( i = 0 ; i  <5 ; i ++)p t h r e a d c r e a t e (& c [ i ] , & a t r i b , c l i e n t e , ( void   ∗ ) i ) ;

for ( i = 0 ; i   <   5 ; i ++)pt hr ea d jo in (c [ i ] ,NULL) ;

}

Page 57: Tema Clase dfd

7/21/2019 Tema Clase dfd

http://slidepdf.com/reader/full/tema-clase-dfd 57/57

Bibliografıa

[Andrews, 2000]  Andrews, G. R. (2000).  Foundations of Multithreaded, Pa-rallel, and Distributed Programming . Addison-Wesley.

[Burns y Davies, 1993]  Burns, A. y Davies, G. (1993).  Concurrent Program-ming . Addison-Wesley.

[Burns y Welling, 1998]  Burns, A. y Welling, A. (1998).  Concurrency in Ada .Cambridge University Press.

[Dijsktra, 1968]   Dijsktra, E. W. (1968).   Programming Languages , capıtu-lo Cooperating sequential processes, pags. 43–112. New York: AcademicPress.

[Grey, 1998]  Grey, J. S. (1998).  Interprocess Communications in UNIX. The Nooks and Crannies . Prentice Hall PTR, 2 edicion.

[Lea, 2001]  Lea, D. (2001).   Programaci´ on Concurrente en Java . Addison-Wesley, 2 edicion.

57