INGENIERÍA TÉCNICA en INFORMÁTICA de SISTEMAS ASIGNATURA: PROGRAMACIÓN CONCURRENTE CÓDIGO CARRERA: 40 (Sistemas) CÓDIGO ASIGNATURA: 319 CONVOCATORIA: Septiembre. 1aP.P. SEMANA : PRIMERA DURACIÓN: 2 horas Fecha: 3 de Septiembre de 2004 MATERIAL AUXILIAR: NINGUNO HORA: 18:30 h. ¡NO es necesario entregar la hoja del enunciado! TEORÍA Explicar las caracterı́sticas de la cita de Ada (rendez-vous). (2pt) Se pueden encontrar dichas caracterı́sticas en la página 105 y siguientes del libro de Jorge Pérez Martı́nez. EJERCICIO Blancanieves y los siete enanitos viven en una casa donde sólo existen cuatro sillas, que los enanitos utilizan para comer. Cuando un enanito vuelve de trabajar en la mina comprueba si hay una silla libre para sentarse. Si existe una silla libre, entonces indica a Blancanieves que ya está sentado, y espera pacientemente su turno a que le sirvan. Cuando le ha servido, Blancanieves le indica que puede empezar a comer. El enanito come y cuando acaba, deja la silla libre y vuelve a la mina. Por su parte, Blancanieves cuando no tiene ningún enanito pendiente de servirle, se va a dar una vuelta. Se pide: (a) Realice un análisis exhaustivo de los problemas de concurrencia que se pueden dar en un sistema de este tipo. (1pt) Como dice el libro de Palma et al. en la página 18, los problemas inherentes a la programación concurrente son básicamente de dos tipos, de exclusión mutua y de sincronización. En este caso concreto está claro que el acceso a los recursos (las sillas y los turnos de Blancanieves) debe producirse en exclusión mutua, pues de lo contrario podrı́a haber errores con respecto al número de sillas libres o de los turnos. Por lo que respecta a la sincronización, es importante que los enanos se sincronizen correctamente con respecto a Blancanieves, puesto que de lo contrario podrı́an ponerse a comer en un plato vacı́o debido a que Blancanieves no ha llenado los platos. Otra posibilidad serı́a que Blancanieves no se sincronizara correctamente con los enanos y que se fuera a dar una vuelta mientras los enanos están esperando. Finalmente otro tipo de problemas que podrı́an darse serı́an el interbloqueo, según la implementación particular o la inanición de un enano que no consiguiera jamas sentarse en una silla. Con una implementación incorrecta podrı́an darse incluso otros problemas más exóticos. (b) Seleccionar una herramienta de concurrencia explicando los motivos. (1pt) Una posibilidad interesante es utilizar semáforos junto con variables compartidas. Los semáforos modelizan muy bien el acceso a recursos limitados (las sillas en este caso). Una variable compartida puede comunicar si hay enanos o no esperando a comer. El acceso a esta variable deberı́a hacerse en exclusión mutua, pero resulta sencillo implementarla con otro semáforo. Finalmente, la señales entre los enanos y Blancanieves (estoy esperando a comer y la comida ya está lista) pueden modelizarse con sendos semáforos. Otras opciones como regiones crı́ticas o RCC’s también serı́an válidas. Los eventos no parecen especialmente adecuados puesto que el escaso número de procesos implicados no precisa una gestión explı́cita de colas. Las primitivas de alto nivel como los monitores o la cita de Ada siempre son apuestas seguras, pero para este problema tan sencillo quizás no merezca la pena complicarse más. (c) Explicar las caracterı́sticas principales de la herramienta elegida en el apartado anterior. (1.5pt) Estás descritas en el libro de Jorge Pérez Martı́nez a partir de la página 44 y siguientes. (d) Partiendo del análisis realizado y la herramienta de concurrencia seleccionada, proponga una solución en pseudo-código que resuelva el problema descrito. Utilizar únicamente dos tipos de proceso: Enanito y Blancanieves.(4.5pt) PROGRAM Bosque; VAR silla, mutex, turno : SEMAPHORE; esperando_turno : SHARED INTEGER; i : INTEGER; PROCESS Enano(i : INTEGER); BEGIN REPEAT writeln(’Enano : ’, i , ’ estoy trabajando en el campo’); writeln(’Enano : ’, i, ’ quiero sentarme en una silla’); wait(silla); writeln(’Enano :’, i, ’ ya he conseguido una silla’); wait(mutex); esperando_turno := esperando_turno + 1; signal(mutex); wait(turno); wait(mutex); esperando_turno := esperando_turno - 1; signal(mutex); writeln(’Enano : ’, i, ’ estoy comiendo’); signal(silla); FOREVER; END; PROCESS Blancanieves; BEGIN REPEAT wait(mutex); IF esperando_turno = 0 then BEGIN signal(mutex); writeln(’Blancanieves : me voy END ELSE BEGIN signal(mutex); writeln(’Blancanieves : writeln(’Blancanieves : signal(turno); END FOREVER; END; (* Programa principal *) BEGIN Init(silla, 4); Init(mutex, 1); Init(turno, 0); esperando_turno := 0; Blancanieves; FOR i := 1 to 7 DO Enano(i); END. Como no hay ningún enano esperando a dar una vuelta.’); Estoy cocinando para un enanito.’); La comida ya está lista.’);