El problema de los Filósofos



Documentos relacionados
PROGRAMACIÓN CONCURRENTE. Tema 5 Monitores

Concurrencia entre Procesos.

Tema 3: Concurrencia de procesos

PROGRAMACION CONCURRENTE

SIMM: TEORÍA DE LOS S.O. I.E.S. JUAN DE LA CIERVA CURSO 2007/2008

Concurrencia: deberes. Concurrencia: Exclusión Mutua y Sincronización. Concurrencia. Dificultades con la Concurrencia

CDI Exclusión mutua a nivel alto. conceptos

Examen Febrero de 2012

Sistemas Operativos. Características de la Multiprogramación. Interacción entre Procesos. Características de la Multiprogramación

SISTEMAS OPERATIVOS AVANZADOS

Concurrencia: Exclusión mutua y Sincronización

Mensajes. Interbloqueo

Tema 3. Monitores Programación Concurrente

PROGRAMACION CONCURRENTE

Práctica 2: El problema de la sección crítica

Tema 4.- Pilas y Colas

Problema 1 (3 puntos)

PROCEDIMIENTO VERSION: 03 ELABORACION Y CONTROL DE DOCUMENTOS PROCESO DE PLANIFICACION DEL SISTEMA INTEGRADO DE GESTION

Modulo 1 El lenguaje Java

Escuela Politécnica Superior de Ingeniería Departamento de Ingeniería Informática

col Type mismatch cadena vacía fila 1 z + i 4 1 fila 2

dit UPM Tema 3: Concurrencia /ejercicios Análisis y diseño de software José A. Mañas

Hilos, comunicación y competencia entre procesos. Dr. Alonso Ramírez Manzanares 2-Sep-2010

CERRADURAS RFID PARA TAQUILLAS PASSTECH

UNIDAD 5. ESTRUCTURAS DINÁMICAS Y ESTÁTICAS DE ALMACENAMIENTO DE DATOS.

Sistemas Operativos Práctica 4

Concurrencia. Primitivas IPC con bloqueo

1. Equivalencia de herramientas. Implemente las primitivas de las regiones críticas condicionales con semáforos. (2pt).

Operación de Microsoft Excel. Guía del Usuario Página 79. Centro de Capacitación en Informática

Ejercicio 1. Desarrollar un pequeño juego para practicar mecanografía.

LOS RECURSOS PARA EL TRABAJO Y LOS APRENDIZAJES INVOLUCRADOS PRINCIPALES APRENDIZAJES EN JUEGO

Programación: QBASIC

VISUAL BASIC Diseño de Formularios MDI y Menús - Proyectos Aplica

Práctico de Procesos, Hilos y Deadlock

Tema 1: Introducción a los S.O. Ejercicios de Planificiación de Procesos

Sistemas Operativos Temas 4, 5 y 6. Jorge García Duque Despacho: B-202 Tutorías: Lunes 16:00-18:00 y Martes 16:00-20:00

Gestión de usuarios en la web educativa del centro con JOOMLA!

Fundamentos de la Programación

Solución - Examen Marzo de 2003

Ejercicio 1 (3 puntos).-

TUTORIAL SOBRE EL MANEJO DE LA OFICINA VIRTUAL PARA LA REMISIÓN DE INFORMES DE DOCENCIA VIRTUAL VÍA ADMINISTRACIÓN ELECTRÓNICA

Algorítmica y Lenguajes de Programación. Ordenación (i)

Solución Examen Febrero 2006

Ingeniería Superior de Informática. Curso 3º. Sistemas Operativos. Examen Final. TEORÍA. 31 de Enero de 2005

Centro de Capacitación en Informática

Tema: Arreglos de Objetos en C++.

PROGRAMACION CONCURRENTE Y DISTRIBUIDA. II.5 Sincronización basada en memoria compartida: Monitores

Capítulo IV. INTERBLOQUEO E INANICIÓN

CÓMO TRABAJA TU SISTEMA OPERATIVO?

SIMULACIÓN. Orientaciones para la solución del examen de Febrero 2011, Segunda Semana

Implementación de monitores POSIX

INTRODUCCION A LA PROGRAMACION DE PLC

Curso de Excel Avanzado

AUTOMATIZACIÓN INDUSTRIAL

&logistics SURTIDO. Sistema &logistics

LINUX - Los archivos de órdenes I

ARBOLES ARBOLES BINARIOS ORDENADOS. REPRESENTACIÓN Y OPERACIONES

Otros Lenguajes de Programación

Organización de Computadoras. Turno Recursantes Clase 8

Mensajes. (versión preliminar)

TUTORÍA GRUPAL ELABORACIÓN DE TRABAJOS

1 (2 5 puntos) Responda con brevedad y precisión a las siguientes preguntas:

Asignatura: Programación Avanzada de Autómatas. Documento: Ejercicios de diseño de sistemas secuenciales.

Nos informamos sobre las características del álbum temático y cómo elaborarlo

SALIDAS ANALÓGICAS. Adquisición de datos y acondicionamiento de la señal Tema 6

MANUAL DE USUARIO DE LA HERAMIENTA CONFIGURACION DE PRESUPUESTOS PARA DISTRIBUIDORES

Acuerdo de aprobación de la Normativa Básica de Correo Electrónico de la Universidad Miguel Hernández.

Aprendizaje cooperativo (Del libro Aprendizaje inteligente Montserrat del Pozo. Oct 2009)

Estructura de datos (arreglos) Vectores y Matrices

I.3. Interacción entre Procesos Concurrentes.

1. Ejemplo de clase : La clase Cuenta 2. Uso de la clase Cuenta. 3. Métodos y objetos receptores de mensajes (Importante)

Importador Universal - Operaciones

Comercial Cartas de Fidelización

Sistemas operativos avanzados. 1.3 Algoritmos de planificación del procesador

Ejemplos de conversión de reales a enteros

Se guardan en archivos con extencion c y los cabezales con extension h

Curso 0 de Informática

un programa concurrente

DINÁMICAS PARA GRUPOS MULTICULTURALES. Las dinámicas que aportamos ofrecen posibilidades didácticas para desarrollar con grupos multiculturales.

Cómo nombrar variables ( 2&

Examen de Arquitectura de Computadores

Introducción. Visual Basic para Aplicaciones (VBA) en Excel: aspectos elementales

Sistemas Operativos. Curso 2016 Procesos

Como se declara un vector en Visual Basic 6.0

VERSION PRELIMINAR DEL TUTORIAL DE ADMINISTRACION DEL SITIO WEB DEL COHIFE

Herencia. 3.- Herencia. Declaración de una clase derivada en Delphi. Jerarquía de clases

Pontificia Universidad Católica de Chile Escuela de Ingeniería Departamento de Ciencia de la Computación

Manual Usuario Wordpress. Índice

3.2 Operaciones aritmético-lógicas en Pascal

SISTEMA InfoSGA Manual de Actualización Mensajeros Radio Worldwide C.A Código Postal 1060

Tecnólogo Informático- Estructuras de Datos y Algoritmos- 2009

EDWIN KÄMMERER ORCASITA INGENIERO ELECTRÓNICO

CODIGO MODO COMENTARIO

DATOS IDENTIFICATIVOS:

PROCEDIMIENTO OPERATIVO DESARROLLAR SISTEMAS INFORMÁTICOS PDO-COCTI-DTIN-04

Manual. Sistema De. Plataforma Virtual. Docente. Estudiante MANUAL MANUAL DE MANUAL. del Usuario. Coordinador. MICROSOFT PowerPoint v2.

Estructura de datos Tema 3: El TAD Lista lineal. Universidad de Valladolid. Departamento de informática. Campus de Segovia

TEMA 3: EN QUÉ CONSISTE?

Java Avanzado Facultad de Ingeniería. Escuela de computación.

Sistemas Operativos II Febrero 2009 Nombre:

Transcripción:

El problema de los Filósofos Problemas de Programación Concurrente Solución con Semáforos Para evitar una situación de interbloqueo se limita el número de filósofos en disposición de comer a 4. PROGRAM Filósofos; VAR tenedores: ARRAY [0..4] OF SHEMAPHORE; puerta: SEMAPHORE; i: INTEGER PROCEDURE Filósofo (i: INTEGER); pensar ; WAIT (puerta); WAIT (tenedores [i]); WAIT (tenedores [i + 1] MOD 5); comer ; SIGNAL (tenedores [i]); SIGNAL (tenedores [i + 1] MOD 5); SIGNAL (puerta) FOREVER FOR i := 0 TO 4 INIT (tenedores [i], 1); INIT (puerta, 4); CO Filósofo(1); ; Filósofo(4) CO. Solución con Región Crítica Condicional PROGRAM Filósofos; VAR tenedores: SHARED ARRAY [0..4] OF 0..2; (* Indica el nº de tenedores disponibles. *) i: INTEGER PROCEDURE Filósofo (i: INTEGER); pensar ; REGION tenedores DO AWAIT (tenedores[i] = 2); (* Espera a tener los dos tenedores *) (tenedores [i + 1] MOD 5) := (tenedores [i + 1] MOD 5) 1; (* Los coge. *) (tenedores [i + 4] MOD 5) := (tenedores [i + 4] MOD 5) 1 comer ; REGION tenedores DO (tenedores [i + 1] MOD 5) := (tenedores [i + 1] MOD 5) + 1; (* Los deja. *) (tenedores [i + 4] MOD 5) := (tenedores [i + 4] MOD 5) + 1 FOREVER FOR i := 0 TO 4 DO tenedores [i] := 2; CO Filósofo(0); ; Filósofo(4) CO. Josep Godoy & Ferran Gómez página 1/18

Solución con Monitores PROGRAM Filósofos; TYPE filosofar = MONITOR; VAR estado: (Pensando, Comiendo, Hambriento); espera: ARRAY [0..4] OF QUEUE PROCEDURE ENTRY CogePalillos (i: INTEGER); estado[i] := Hambriento; prueba[i]; IF estado[i] := Hambriento THEN DELAY (Espera[i]); PROCEDURE ENTRY DejaPalillos (i: INTEGER); estado[i] := Pensando; prueba [i + 1 mod 5]; (* Le da el palillo al filósofo de la derecha si lo necesita. *) prueba [i 1 mod 5] (* Le da el palillo al filósofo de la izquierda si lo necesita. *) PROCEDURE Prueba (i: INTEGER); IF estado(i 1 mod 5) # Comiendo AND (* Si el de la derecha no come y *) estado(i + 1 mod 5) # Comiendo AND (* el de la izquierda no come y *) estado[i] = Hambriento THEN (* el del centro quiere comer. *) estado [i] := Comiendo; CONTINUE (espera[i]) VAR i: INTEGER; FOR i := 0 TO 4 DO estado[i] := Pensando; VAR fil: filosofar; PROCEDURE Filósofo (i: INTEGER); pensar fil. CogePalillos(i); comer fil. DejaPalillos(i) FOREVER CO Filósofo(0); ; Filósofo(4) CO. página 2/18 Josep Godoy & Ferran Gómez

El problema de los Coches en el Puente Problemas de Programación Concurrente En una carretera por la que circulan coches en los dos sentidos hay un puente donde sólo es posible la circulación en un sentido. Sobre el puente pueden haber varios coches circulando simultáneamente, pero en el mismo sentido. Solución con Región Crítica Esta solución contempla varios puntos: 1. El puente lo toma el primero que llega. 2. Se aplica un turno cuando hay coches en ambos sentidos. 3. Se tiene en cuenta si hay coches esperando en alguno de los lados del puente. PROGRAM Río; VAR puente: SHARED RECORD dentron, dentros : CARDINAL; (* Coches, norte o sur, en el puente. *) pasadosn, pasadoss: CARDINAL; (* Coches que han pasado consecutivos. *) turnon, turnos: BOOLEAN; (* Indica de quién es el turno. *) esperandon, esperandos: CARDINAL (* Coches que esperan en cada sentido. *) PROCEDURE CochesNorte (i: INTEGER); REGION puente DO esperandon := esperandon + 1; AWAIT ((dentros = 0) & (turnon OR esperandos = 0)); (* No hay coches en S esperando. *) esperandon := esperandon 1; dentron := dentron + 1; pasadosn := (pasadosn + 1) MOD 10; (* Nº máximo de coches en un sentido (10). *) IF pasadosn = 0 THEN (* Si es el último cambia el turno. *) turnon := FALSE; turnos := TRUE cruzar el puente ; REGION puente DO dentron := dentron 1; PROCEDURE CochesSur (i: INTEGER); (* --- procedimiento simétrico a CochesNorte --- *) WITH puente DO dentros := 0; dentron := 0; pasadoss := 0; pasadosn := 0; turnon := TRUE; turnos := TRUE; esperandon := 0; esperandos := 0 CO CochesNorte (1); ; CochesNorte (n); CochesSur (1); ; CochesSur (m) CO. Josep Godoy & Ferran Gómez página 3/18

Solución con Eventos PROGRAM Río; VAR puente: SHARED RECORD dentron, dentros : CARDINAL; (* Coches, norte o sur, en el puente. *) pasadosn, pasadoss: CARDINAL; (* Coches que han pasado consecutivos. *) turnon, turnos: BOOLEAN; (* Indica de quién es el turno. *) esperandon, esperandos: CARDINAL (* Coches que esperan en cada sentido. *) permison, permisos: EVENT puente PROCEDURE CochesNorte (i: INTEGER); REGION puente DO esperandon := esperandon + 1; WHILE ((dentros > 0) OR (NOT turnon & esperandos > 0)) DO AWAIT (PermisoN); esperandon := esperandon 1; dentron := dentron + 1; pasadosn := (pasadosn + 1) MOD 10; (* Nº máximo de coches en un sentido (10). *) IF pasadosn = 0 THEN (* Si es el último cambia el turno. *) turnon := FALSE; turnos := TRUE cruzar el puente ; REGION puente DO dentron := dentron 1; IF ((dentron = 0) & (turnos OR esperandon = 0)) THEN CAUSE (PermisoS); PROCEDURE CochesSur (i: INTEGER); (* --- procedimiento simétrico a CochesNorte --- *) WITH Puente DO dentros := 0; dentron := 0; pasadoss := 0; pasadosn := 0; turnon := TRUE; turnos := TRUE; esperandon := 0; esperandos := 0 CO CochesNorte (1); ; CochesNorte (n); CochesSur (1); ; CochesSur (m) CO. página 4/18 Josep Godoy & Ferran Gómez

El problema del Planificador Problemas de Programación Concurrente Se tiene un sistema con N tareas (procesos). Cada tarea debe ejecutarse (para realizar algún proceso trivial) cada cierto intervalo de tiempo, que está predefinido y almacenado como dato del programa (durante este tiempo la tarea está dormida). Se supone que el tiempo de trabajo de la tarea es menor que el de dormir. Se debe programar un planificador que arranque las tareas cuando les corresponda. PROGRAM Planificador; CONST N := 30; (* Número de tareas. *) TYPE tareas = [1..N]; unatarea = RECORD faltan: INTEGER; (* Segundos que faltan para activar la tarea. *) intervalo: INTEGER (* Intervalo de tiempo entre activaciones. *) VAR tiempos: ARRAY tareas OF unatarea; comienzo: ARRAY tareas OF SEMAPHORE; timer: SEMAPHORE; i: INTEGER PROCEDURE Reloj; CONST UNSEGUNDO := 60; (* Ticks *) VAR i: INTEGER; i := UNSEGUNDO; WHILE i > 0 DO i := i 1; SIGNAL (timer) (* Ha pasado un segundo. *) FOREVER PROCEDURE Planificador; VAR i := INTEGER; WAIT (timer); (* Espera a que pase 1 segundo. *) FOR i:= 1 TO N DO WITH tiempos[i] DO faltan := faltan 1; IF faltan = 0 THEN faltan := intervalo; (* Activar la tarea i. *) SIGNAL (comienzo[i]) FOREVER PROCEDURE Tarea (i: INTEGER); WAIT (comienzo[i]); ejecutar el proceso i FOREVER INIT (timer, 0); asignar a cada tarea su tiempo FOR i := 1 TO N DO INIT (comienzo[i], 0); CO Reloj; Planificador; Tarea(1); ; Tarea (n) CO. Josep Godoy & Ferran Gómez página 5/18

El problema de los Lectores y Escritores Los lectores pueden utilizar el recurso simultáneamente, pero cada escritor debe tener acceso exclusivo a él. Los dos tipos de procesos se excluyen mutuamente en el acceso al recurso y en caso de conflicto los escritores tienen prioridad sobre los lectores. Solución con Semáforos PROGRAM LectoresYEscritores; VAR estado: SHARED RECORD la, lt, ea, et: INTEGER; (* Lectores/Escritores Activos Trabajando. *) leyendo, escribiendo: SEMAPHORE PROCEDURE PermisoLectura; IF ea = 0 THEN WHILE lt < la DO lt := lt + 1; SIGNAL (leyendo) PROCEDURE PermisoEscritura; IF lt = 0 THEN WHILE et < ea DO et := et + 1; SIGNAL (escribiendo) PROCEDURE Lector (i: INTEGER); REGION estado DO la := la + 1; PermisoLectura WAIT (leyendo); acceder al recurso y leer REGION estado DO la := la 1; lt := lt 1; PermisoEscritura PROCEDURE Escritor (i: INTEGER); REGION estado DO ea := ea + 1; PermisoEscritura WAIT (escribiendo); acceder al recurso y escribir REGION estado DO ea := ea 1; et := et 1; PermisoLectura página 6/18 Josep Godoy & Ferran Gómez

INIT (leyendo, 0); INIT (escribiendo, 0); WITH estado DO la := 0; lt := 0; ea := 0; et := 0 CO Lector (1); ; Lector (n); Escritor (1); ; Escritor (m) CO. Solución con Región Crítica Condicional PROGRAM LectoresYEscritores; VAR estado: SHARED RECORD lt, ea: INTEGER PROCEDURE Lector (i: INTEGER); REGION estado DO AWAIT (ea = 0); lt := lt + 1; leer ; REGION estado DO lt := lt 1; PROCEDURE Escritor (i: INTEGER); REGION estado DO ea := ea + 1; AWAIT (lt = 0); escribir ; REGION estado DO ea := ea 1; WITH estado DO lt := 0; ea := 0 CO Lector (1); ; Lector (n); Escritor (1); ; Escritor (m) CO. Josep Godoy & Ferran Gómez página 7/18

El problema de Grapar Hojas Existen 4 montones de papeles y hay que coger uno de cada montón y grapar los cuatro juntos. El proceso se repite hasta que se acaben los montones, programar los procesos que forman los grupos de 4 papeles y otro que los tome y los grape. Solución con Semáforos PROGRAM Grapar; VAR s, aviso: SEMAPHORE; sigue: ARRAY [2..4] OF SEMAPHORE; i: INTEGER PROCEDURE CogerHojas1; VAR i: INTEGER; tomar una hoja del montón 1 ; dejar la hoja en la mesa ; FOR i := 2 TO 4 DO WAIT (aviso); SIGNAL (s); FOR i := 2 TO 4 DO SIGNAL (sigue[i]); UNTIL se acaben las hojas del montón 1 PROCEDURE CogerHojasOtros (i: INTEGER); tomar una hoja del montón i ; dejar la hoja en la mesa ; SIGNAL (aviso); WAIT (sigue[i]) UNTIL se acaben las hojas i PROCEDURE Grapar; WAIT (s); grapar UNTIL fin del proceso INIT (s, 0); INIT (aviso, 0); FOR i := 2 TO 4 INIT (sigue[i], 0); CO CojerHoja1; CojerHojasOtros(2); ; CojerHojasOtros(4) Grapar CO. página 8/18 Josep Godoy & Ferran Gómez

Solución con Región Critica Condicional PROGRAM Grapar; VAR hojas: SHARED ARRAY[1..4] OF BOOLEAN; puede: ARRAY [1..4] OF SEMAPHORE; s: SEMAPHORE; i: INTEGER PROCEDURE CogerHojas (i: INTEGER); tomar una hoja del montón i ; REGION hojas DO hojas[i] := TRUE; WAIT (puede[i]) UNTIL se acaben las hojas PROCEDURE Gestor; VAR i: INTEGER; REGION hojas DO AWAIT (hojas[1] & hojas[2] & hojas[3] & hojas[4]); hojas[1] := FALSE; hojas[2] := FALSE; hojas[3] := FALSE; hojas[4] := FALSE SIGNAL (s); FOR i := 1 TO 4 DO SIGNAL (puede[i]); UNTIL se acaben los montones PROCEDURE Grapar; WAIT (s); grapar UNTIL se acabe el proceso de grapar INIT (s, 0); FOR i := 1 TO 4 DO hojas[i] := FALSE; INIT (ppuede[i], 0) CO CogerHojas(1); ; CogerHojas(4); Gestor; Grapar CO. Josep Godoy & Ferran Gómez página 9/18

El problema de los Coches y el Montacargas En un hotel hay 10 vehículos pequeños y otros tantos grandes, controlados por un programa de procesos concurrentes (uno por vehículo). Controlar la entrada en un montacargas en el que cabe 4 coches pequeños ó 2 pequeños y 1 grande. Solución con Región Crítica Condicional PROGRAM Montacargas; VAR montacargas SHARED RECORD numgrandes: 0..1; numpequeños: 0..4 PROCEDURE CocheGrande (i: INTEGER); REGION montacargas DO (* Entrada al montacargas. *) AWAIT (numpequeños 2) & (numgrandes = 0); numgrandes := numgrandes + 1 dentro del montacargas REGION montacargas DO (* Salida del montacargas. *) numgrandes := numgrandes 1; PROCEDURE CochePequeño (i: INTEGER); REGION montacargas DO (* Entrada al montacargas. *) AWAIT ((numpequeños < 4) & (numgrandes = 0) OR (numpequeños 1) & (numgrandes = 1)); numpequeños := numpequeños + 1 dentro del montacargas REGION montacargas DO (* Salida del montacargas. *) numpequeños := NumPequeños 1; WITH montacargas DO numpequeños := 0; numgrandes := 0; CO CochePequeño(1); ; CochePequeño(10); CocheGrande(1); ; CocheGrande(10) CO. página 10/18 Josep Godoy & Ferran Gómez

Solución con Sucesos PROGRAM Montacargas; VAR montacargas SHARED RECORD numgrandes: 0..1; numpequeños: 0..4; puedegrande, puedepequeño: EVENT montacargas; PROCEDURE CocheGrande (i: INTEGER); REGION montacargas DO WHILE NOT (numgrandes = 0) & (numpequeños 2)) DO AWAIT (PuedeGrande); numgrandes := numgrandes + 1 dentro del montacargas REGION montacargas DO numgrandes := numgrandes 1; CAUSE (puedegrande); CAUSE (puedepequeño) PROCEDURE CochePequeño (i: INTEGER); REGION montacargas DO WHILE NOT [ ((numgrandes = 0) & (numpequeños < 4)) OR ((numpequeños 1) & (numgrandes = 1)) ] DO AWAIT (puedepequeño); numpequeños := NumPequeños + 1 dentro del montacargas REGION montacargas DO numpequeños := numpequeños 1; IF (numgrandes = 0) & (numpequeños 2) THEN CAUSE (puedegrande); CAUSE (puedepequeño) WITH montacargas DO numpequeños := 0; numgrandes := 0; CO CochePequeño(1); ; CochePequeño(10); CocheGrande(1); ; CocheGrande(10) CO. Josep Godoy & Ferran Gómez página 11/18

El problema del Productor Consumidor PROGRAM ProductorConsumidor TYPE buffer = MONITOR (capacidad: INTEGER); (* implementa un buffer de tipo tipobuffer *) VAR contenido: ARRAY [0..MAX-1 ] OF tipobuffer in, out: 0..capacidad 1; cuantoshay: 0..capacidad; pro, con: QUEUE; PROCEDURE Lleno(): BOOLEAN; RETURN cuantoshay = capacidad PROCEDURE Vacio(): BOOLEAN; RETURN cuantoshay = 0 PROCEDURE ENTRY Manda (mensaje: tipobuffer) IF Lleno THEN DELAY (pro); contenido [in] := mensaje; in := (in + 1) MOD capacidad; cuantoshay := cuantoshay + 1; IF cuantoshay = 1 THEN CONTINUE (con) PROCEDURE ENTRY Recibe (mensaje: tipobuffer) IF Vacio THEN DELAY (con); mensaje := contenido [in]; out := (out + 1) MOD capacidad; cuantoshay := cuantoshay 1; IF cuantoshay = capacidad 1 THEN CONTINUE (pro) (* inicialización monitor *) in := 0; out := 0; cuantoshay := 0 VAR buzon: buffer; PROCEDURE Productor; VAR m: tipobuffer; elaborar mensaje ; buzon. Manda (m) UNTIL fin PROCEDURE Consumidor; VAR m: tipobuffer; buzon. Recibe (m); trabajar mensaje UNTIL fin INIT buzon(20); CO Productor; Consumidor CO. página 12/18 Josep Godoy & Ferran Gómez

El problema del Barbero Dormilón Problemas de Programación Concurrente Una barbería consiste en una habitación de espera con n sillas y la habitación con la silla para afeitar. Si no hay ningún cliente el barbero se va a dormir. Si un cliente entra en la barbería y ve todas las sillas ocupadas abandona la barbería. Si el barbero está ocupado, el cliente se sienta en una silla libre. Si el barbero está durmiendo el cliente lo despierta. Escríbase un programa que coordine al barbero y a los clientes. Solución con Semáforos PROGRAM Barbero; CONST NSILLAS := 6; (* número de sillas de la sala de espera *) VAR silla, nuevocliente, barbero: SEMAPHORE; esperar: INTEGER; PROCEDURE Cliente (i: INTEGER); WAIT (silla); (* Accede a las sillas de manera exclusiva. *) IF esperar < NSILLAS THEN (* Hay sitio en la sala de espera. *) esperar := esperar + 1; SIGNAL (nuevocliente); (* Despierta al barbero si es necesario. *) SIGNAL (silla); (* Libera la silla. *) WAIT (barbero) (* Si el barbero está ocupado, el cliente se duerme. *) se corta el pelo ELSE SIGNAL (silla); (* Libera la silla. *) pasa de largo PROCEDURE Barbero; WAIT (nuevocliente); (* Espera cliente. Si no hay clientes se duerme. *) WAIT (silla); (* Silla de la sala de espera. *) esperar := esperar 1; SIGNAL (barbero); (* Barbero listo para cortar el pelo. *) SIGNAL (silla); (* Activa silla. *) cortar el pelo FOREVER INIT (nuevocliente, 0); INIT (barbero, 0); INIT (silla, 1); CO Barbero; Cliente(1); ; Cliente(n); CO. Josep Godoy & Ferran Gómez página 13/18

Solución con Monitor PROGRAM Barbero; TYPE barberia: MONITOR; VAR sillaslibres: 0..6; puedecortar: BOOLEAN: cliente: QUEUE; PROCEDURE ENTRY Silla(): BOOLEAN; IF sillaslibres # 0 THEN sillaslibres := sillaslibres 1; RETURN TRUE ELSE RETURN FALSE PROCEDURE ENTRY Corte; IF NOT puedecortar THEN DELAY(cliente); sillaslibres := sillaslibres + 1; puedecortar := FALSE; cortando ; puedecortar := TRUE; CONTINUE(cliente) sillaslibres := 6; puedecortar := TRUE VAR barb: barberia; PROCEDURE Cliente(i: INTEGER); entra en barbería ; IF barb. Silla THEN (* Si hay silla. *) barb. Corte; se va de la barbería CO Cliente(1); ; Cliente(n) CO. página 14/18 Josep Godoy & Ferran Gómez

El problema del Tren Circular PROGRAM TrenCircular CONST E := 10 (* E es el número de estaciones. *) TYPE numestaciones: 0..E 1; VAR estación: SHARED RECORD origen, destino: EVENT ARRAY numestaciones OF estación estacioneslibres: ARRAY numestaciones OF SEMAPHORE; i: INTEGER Problemas de Programación Concurrente PROCEDURE Viajero (i: INTEGER, estaestación, miestación: numestaciones); VAR miestación, estaestación: numestaciones;... (* ELIMINADO *) estaestación := n; (* ELIMINADO *) miestación := m; (* ELIMINADO *) REGION estación DO AWAIT (origen[estaestación]); (* Se duerme a la espera del tren *) llega el tren ; sube al tren ; (* Como sale de una cola es seguro que es uno a uno. *) AWAIT (destino[miestación]); (* Se duerme esperando el destino. *) baja del tren PROCEDURE Tren (i, estoy: numestaciones); VAR estacionado: numestaciones; (* NO SE USA PARA NADA *) estoy; numestaciones; (* ELIMINADO *) estoy := i; (* ELIMINADO *) SIGNAL (estoy); (* SIN SENTIDO *) WAIT (estacioneslibres [estoy+1 MOD E]) (* Espera a que la estación siguiente esté libre. *) avanza a la siguiente estación ; SIGNAL (estacioneslibres [estoy MOD E]) (* Libera la estación anterior. *) estoy := (estoy + 1) MOD E; (* Llega a la siguiente estación. *) Tiempo (i) := 0; (* Se inicia el contador de tiempo. *) REGION estación DO CAUSE (estación. destino[estoy]); (* Bajan viajeros. *) CAUSE (estación. origen [estoy]) (* Suben viajeros. *) IF Tiempo (i) < 120 THEN (* Si no han pasado 120 segundos espera. *) esperar ; FOREVER FOR i := 0 TO numestaciones DO INIT (estacioneslibres[i], 0); (* Estos semáforos se deberían inicializar coherentemente con *) CO (* el punto de inicio de cada tren. *) Viajero (1, m, n); (* m y n son las estaciones origen y destino. *) Tren (1, p); (* p es la estación inicial de cada tren. *) CO. Josep Godoy & Ferran Gómez página 15/18

El problema del Cine Sea un cine con tres salas (aforos de 100, 100 y 200 espectadores) y una única taquilla de entradas. Los espectadores llegan a la taquilla y, al azar, escogen una sala. Si no hay entradas se van. Si las hay entran en la sala. No está previsto que abandonen las sala una vez iniciada la sesión. PROGRAM Cine; VAR taquilla: SHARED ARRAY [1..3] OF INTEGER; PROCEDURE Espectador (i: INTEGER; sala: 1..3) VAR entrada: BOOLEAN entrada := FALSE; REGION taquilla DO IF taquilla[sala] > 0 THEN taquilla[sala] := taquilla[sala] 1; entrada := TRUE IF entrada THEN ver película ; irse del cine taquilla[1] := 100; taquilla[2] := 100; taquilla[3] := 200; CO Espectador(1, s1); Espectador(n, sm) (* sm indica la sala que el espectador elige. *) CO. página 16/18 Josep Godoy & Ferran Gómez

El problema de los Niños Problemas de Programación Concurrente Seis niños siguen repetitivamente la siguiente secuencia de acciones: pintan, cuando se cansan se lavan, comen 1 de los 4 platos que hay y duermen. Existe un proceso cuidador que repone el jabón para lavarse (hasta 50 veces) y pone comida en los platos. PROGRAM Niños; VAR jabón: SHARED INTEGER; comida: SHARED RECORD platosmesa, platossucios: INTEGER; dosis: INTEGER; PROCEDURE Niño(i: INTEGER); REGION jabón DO AWAIT jabón = 1; jabón := 0 se ha lavado ; REGION comida DO AWAIT platosmesa > 0; platosmesa := platosmesa 1 come ; REGION comida DO platossucios := platossucios + 1; FOREVER PROCEDURE Cuidador; WHILE dosis > 0 DO REGION jabón DO IF jabón = 0 THEN (* Repone jabón si es necesario. *) jabón := 1; dosis := dosis 1 REGION comida DO WHILE platossucios > 0 DO (* Repone platos si es necesario. *) platossucios := platossucios 1; platosmesa := platosmesa +1 dosis := 50; jabón := 1; WITH comida DO platosmesa := 4; platossucios := 0 CO Niño(1); ; Niño(6); Cuidador CO. Josep Godoy & Ferran Gómez página 17/18

Codificación de ejecución de procesos (secuencial y paralela) Examen 28 Enero 1997 y 15 Septiembre 1998 PROGRAM Ejecución; VAR s: SEMAPHORE; P1; PROCEDURE P1; CO P2; P4; SIGNAL(s); P5 PROCEDURE P7; P3; WAIT(s); P6 CO P7. P5 P2 P4 P7 P1 P6 P3 Examen 11 Febrero 1997 PROGRAM Ejecución; VAR s: SEMAPHORE; P1; PROCEDURE P1; CO P2; CO P3; P4 CO PROCEDURE P8; SIGNAL(s); P5; P6; WAIT(s); P7 CO P8. P3 P5 P2 P4 P8 P1 P7 P6 página 18/18 Josep Godoy & Ferran Gómez