Prueba objetiva 2 - Clave a

Documentos relacionados
Prueba final, parte 2 - Clave a Concurrencia Segundo semestre Universidad Politécnica de Madrid

Apellidos: Nombre: Matrícula: UNIVERSIDAD POLITÉCNICA DE MADRID

Apellidos: Nombre: Matrícula:

Prueba objetiva 2 - Clave a Concurrencia Primer semestre Grado en Ingeniería Informática. Universidad Politécnica de Madrid

Examen de Programación Concurrente - Clave: a Junio 2008 Departamento de Lenguajes, Sistemas Informáticos e Ingeniería del Software.

Concurrencia Monitores. Guillermo Román Díez

Unidad Didáctica 2. Elementos básicos del lenguaje Java Tipos, declaraciones, expresiones y asignaciones

Programación concurrente en Java

Lección 7: Sincronización de procesos mediante monitores

PROGRAMACIÓN EN JAVA. { una línea para definir, crear o ejecutar ; }

Introducción a Java LSUB. 30 de enero de 2013 GSYC

Recursos compartidos con paso de mensajes (EN CONSTRUCCIÓN: NO IMPRIMIR)

Examen concurrencia Nov 2011

2. Indica cuál de las siguientes afirmaciones es cierta:

Variables. Una variable no es más que un nombre simbólico que identifica una dirección de memoria: vs.

Algoritmos y Estructuras de Datos Tema 2: Diseño de Algoritmos

Programación Concurrente y Distribuída Estado Compartido, 2010

EXCLUSIÓN MUTUA ENTRE HILOS. TEMA 5: Control de la Concurrencia en Java (API Estándar) Sintaxis para Bloques de Código Sincronizado

Hoja de ejercicios cortos Concurrencia Segundo semestre

PROGRAMACIÓN ORIENTADA A OBJETOS 10/02/2009. Examen de Java. Nombre: DNI: Titulación:

BENEMERITA UNIVERSIDAD AUTONOMA DE PUEBLA FACULTAD DE CIENCIAS DE LA COMPUTACIÓN LICENCIATURA EN CIENCIAS DE LA COMPUTACIÓN

Soluciones al Examen de Fundamentos de Computadores y Lenguajes

Qué es Java? Un lenguaje de programación Un entorno de desarrollo Un entorno de aplicación Un entorno de despliegue Es similar en sintaxis de C + +.

TEMA 5: Control de la Concurrencia en Java (API Estándar)

Programación concurrente en Java. Breve introducción. Miguel Ángel LATRE Dept. de Informática e Ingeniería de Sistemas

Construcciones del Lenguaje Java

Centro Asociado Palma de Mallorca. Antonio Rivero Cuesta

Concurrencia. Primitivas IPC con bloqueo

Recursos compartidos con paso de mensajes (EN CONSTRUCCIÓN: NO IMPRIMIR)

Curso Informática Lección 4. Instrucciones de control

Estructuras de control selectivas

Cada examen debe superarse con al menos un 4 para hacer media.

Examen escrito de Programación 1

dit Programación concurrente Sincronización condicional UPM

Unidad Didáctica 3. Tipos genéricos. Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos

Elementos léxicos del lenguaje de programación Java

Estructuras de Datos Clase 4 Pilas y colas

CAPÍTULO 3. PROCESOS VS. HILOS

Tema 6. Threads: programas multitarea

Grados Ing. Inf. y Mat. Inf. Noviembre 2011 Algoritmos y Estructura de Datos Página 1 de 6

Primitivas de Sincronización

Examen Teórico Convocatoria de Junio de 2012

Programación Concurrente Recopilación de teoría referente a la materia

Carlos Montenegro. Programación Orientada a Objetos Proyecto Curricular de Ingeniería de Sistemas

INDICE Prologo 1 Recorrido rápido de java 2 Clases y objetos 3 Extensión de clases

HOJA DE EJERCICIOS 5 PROGRAMACIÓN CON EXCEPCIONES EN JAVA

Arquitecturas cliente/servidor

Examen de Programación 1. Viernes 31/enero/2014. Problema 1 o (2.5 puntos) Disponer un documento de identificación con fotografía sobre la mesa.

Estructura de un programa en Java. Tipos de datos básicos. class miprimerprograma{ // comentario, no es parte del programa

Java. Introducción a la Programación Orientada a Objetos

Instrucciones de control

UNIDAD III.- Programación Concurrente

HERENCIA (2ª parte) En Java todas las clases derivan de otra, aunque no se diga explícitamente.

Examen parcial Convocatoria de junio de 2005 FUNDAMENTOS DE LA PROGRAMACIÓN

Interbloqueo. Concurrencia: Interbloqueo e Inanición

Soluciones. boolean pruebaiteraseriegeometrica () { Serie s= new SerieGeometrica (1, 2); return (s.iterator() instanceof IteraSerieGeometrica); }

Cuadernillo de ejercicios cortos Concurrencia. Curso

import java.applet.*; import java.awt.*; import java.awt.event.*;

Tema 7.- Fundamentos de la Programación Orientada a Objetos

Programación concurrente y semáforos en Java

Tema 2. El lenguaje de programación Java (Parte 1)

Concurrencia Condiciones de Carrera. Guillermo Román Díez

Examen escrito de Programación 1

o Una clase es un tipo al cual pertenecen objetos o instancias de la clase.

Programación Concurrente en Java: Threads. Ejemplos de programación concurrente. Luis Fernando Llana Díaz. 24 de abril de 2008

Programación concurrente

Instrucción de selección múltiple switch.

Programación Orientada a Objetos (Grado en Ingeniería Informática y Grado en Ingeniería en Tecnologías de la Información - UNED)

*** SOLUCIONES *** SISTEMAS OPERATIVOS Examen Parcial 24 de Abril de 2010

Especificando interacción con recursos compartidos

Identificadores, palabras reservadas, tipos de datos, operadores aritméticos y el sistema estándar de salida en Java

Lección 10: Coordinación mediante espacios de tuplas

Ejemplo. class SiNoThread extends Thread { private String SiNo; static int Contador = 0; public SiNoThread(String s) { super(); SiNo = s; }

Práctica 11e. Práctica 11e. José M. Ordax

Introducción a Java (II) Dr. (c) Noé Alejandro Castro Sánchez

Introducción al lenguaje C

PLANTEL 2 CIEN METROS ELISA ACUÑA ROSSETTI ACADEMIA DE TECNOLOGIA DE LA INFORMACION Y DE LA COMUNICACION

Programación 1 Tema 2. Lenguaje de programación y ejecución de un programa

Solución al Examen de Fundamentos de Computadores y Lenguajes

Transcripción:

Apellidos: Nombre: Matrícula: Normas Prueba objetiva 2 - Clave a Concurrencia 2010-2011 - Primer semestre Lenguajes, Sistemas Informáticos e Ingeniería de Software Este es un cuestionario que consta de 4 preguntas de respuesta simple y una pregunta de desarrollo en 6 páginas. La puntuación total del examen es de 10 puntos. La duración total es de una hora. No olvidéis rellenar apellidos, nombre y DNI en cada hoja de respuesta. Sólo hay una respuesta válida a cada pregunta de respuesta simple. Toda pregunta en que se marque más de una respuesta se considerará incorrectamente contestada. Toda pregunta incorrectamente contestada restará del examen una cantidad de puntos igual a la puntuación de la pregunta dividido por el número de alternativas ofrecidas en la misma. Cuestionario (2 puntos) 1. Dado el siguiente CTAD (sólo se muestran las partes necesarias): TIPO: Factoría = Área N DONDE: Área = {0, 1 INVARIANTE: f Factoría. ( a Área. f (a) 10) f (a) < 20 a Área INICIAL(f): a Área f (a) = 0 CPRE: f (a) < 10 f (a) < 19 a Área Entrar(f,a) POST: f = f pre {a f pre (a) + 1 CPRE: Cierto Salir(f,a) POST: f = f pre {a f pre (a) 1 Suponemos un programa concurrente en el que los procesos respetan el siguiente protocolo (o esquemas de llamada): Entrar(f, a);... ; Salir(f, a). Lo que sigue es parte (cliente y servidor) de una implementación de este recurso usando paso de mensajes:

2010-2011 - Primer semestre (a) Concurrencia 2/6 // Canales de comunicación private Any2OneChannel chentrar = Channel.any2one(); private Any2OneChannelInt chsalir = Channel.any2oneInt(); // Ejecutado por el cliente public void entrar(int a) { One2OneChannel sincro = Channel.one2one(); Object[] pet = {new Integer(a),sincro; chentrar.out().write(pet); sincro.in().read(); public void salir(int a) { chsalir.out().write(a); // Código del servidor public void run() { // Estado del recuros compartido int dentro[] = {0, 0; int total = 0; // Cola de bloqueados Queue<Object[]> esperanentrar = new NodeQueue<Object[]>(); // Preparando la recepción // no determinista final int ENTRAR = 0; final int SALIR = 1; Guard[] entradas = {chentrar.in(), chsalir.in(); Alternative servicios = new Alternative(entradas); boolean[] sinccond = new boolean[2]; // Variables auxiliares int a; Object[] pet; One2OneChannel chresp; // Bucle principal del servidor while (true) { sinccond[entrar] = total < 19; sinccond[salir] = true; // Aceptamos y almacenamos peticiones switch (servicios.fairselect()) { case ENTRAR: pet = (Object[])chEntrar.in().read(); a = ((Integer)pet[0]).intValue(); chresp = ((One2OneChannel)pet[1]); if (dentro[a] < 10) { dentro[a]++; total++; chresp.out().write(null); else esperanentrar.enqueue(pet); break; case SALIR: a = chsalir.in().read(); dentro[a]--; total--; break; default: break; int n = esperanentrar.size(); for (int i = 0; i < n; i++) { pet = esperanentrar.front(); a = ((Integer)pet[0]).intValue(); chresp = ((One2OneChannel)pet[1]); if (dentro[a] < 10) { dentro[a]++; total++; chresp.out().write(null); else { esperanentrar.dequeue(); esperanentrar.enqueue(pet); Se pide señalar la respuesta correcta. (a) La expresión chresp.out().write(null) no compila. (b) Es una implementación correcta del recurso compartido. (c) La operación entrar puede atenderse sin que se cumpla su CPRE. (d) Pueden quedar procesos bloqueados en esperanentrar a pesar de que su CPRE se cumple.

Apellidos: Nombre: Matrícula: (2 puntos) 2. Un recurso que encapsula una cuenta bancaria compartida va a ser implementado con Locks y Conditions. La operación Reintegro se especifica de la manera siguiente: CPRE: q.saldo >= c Reintegro(q, c) POST: q.saldo = q pre.saldo c Al depender la CPRE del parámetro de entrada se ha optado por declarar una clase Peticion que contiene la cantidad pedida y una variable condition y usar una cola para guardar las peticiones pendientes. El código de la operación Reintegro es el siguiente (dejando aparte el manejo de la exclusión mutua): public void reintegro(int c) { // traduccion CPRE if (c > this.saldo) { Peticion pet = new Peticion(c); pendientes.enqueue(pet); pet.condition.await(); pendientes.dequeue(); // traduccion POST this.saldo = this.saldo - c; // codigo desbloqueos if (!pendientes.isempty() && (pendientes.front().cantidad <= this.saldo)) { pendientes.front().condition.signal(); Se pide señalar la respuesta correcta: (a) (b) (c) (d) Bastaba haber usado una sola variable condition. Ese código puede provocar inanición. El problema hay que implementarlo con métodos synchronized de Java. Es un desbloqueo en cascada que sigue la metodología vista en clase. (2 puntos) 3. A continuación se muestra una implementación del recurso de la pregunta 1 utilizando los métodos synchronized, wait y notify de Java: static class Factoria { private int dentro[] = {0, 0; private int total = 0; public Factoria() { public synchronized void salir(int a) { dentro[a]--; total--; notify(); public synchronized void entrar(int a) { if (dentro[a]==10 total==20) { try { wait(); catch (Exception e) { dentro[a]++; total++; Se pide señalar la respuesta correcta: (a) Es una implementación correcta del recurso. (b) Provoca interbloqueos. (c) Provoca inanición. (d) Provoca la ejecución de una operación cuando su condición de sincronización (CPRE) es falsa.

2010-2011 - Primer semestre (a) Concurrencia 4/6 (4 puntos) 4. Completa la implementación de la operación insertar del Multibuffer usando locks y conditions: import net.datastructures.nodequeue; import net.datastructures.queue; import net.datastructures.dictionary; import net.datastructures.binarysearchtree; import net.datastructures.entry; import java.util.concurrent.locks.*; /** * Las instancias de Multibuffer son buffers de tamanno * limitado cuyas operaciones pueden ser ejecutadas por varios threads * sin que se produzcan condiciones de carrera. */ public final class MultiBufferLocks<E> implements MultiBuffer<E> { // La exclusion mutua ya no la hacemos con synchronized final Lock mutex = new ReentrantLock(); // La sincronizacion condicional va a ser explicita, // con dos variables "condition" final Condition haysitio = mutex.newcondition(); final Condition haydatos = mutex.newcondition(); // Estado derivado del recurso compartido private Queue<E> cola = new NodeQueue<E>(); private int maxdatos; // se establece en la constructora estandar // Estado para poder controlar la sincronizacion condicional. // Para ello es necesario recordar cada uno de los bloqueos con // los datos necesarios para provocar los desbloqueos // Usaremos una cola por cada tipo de peticion para // Realizar una politica de atencion por orden de llegada private Queue<Thread> esperaninsertar = new NodeQueue<Thread>(); private Queue<Thread> esperanextraer = new NodeQueue<Thread>(); // Tambien necesitamos recordar el valor de las peticiones, por el // esquema de desbloqueo solidario private Queue<Integer> peticionesinsertar = new NodeQueue<Integer>(); private Queue<Integer> peticionesextraer = new NodeQueue<Integer>(); private MultiBufferLocks () { public MultiBufferLocks (int maxdatos) { this.maxdatos = maxdatos; public int maxdatos() { // todas las operaciones en exclusion mutua mutex.lock(); try { return maxdatos; finally { mutex.unlock(); public void insertar(int n, E[] datos) { // COMPLETAR // [...]

Apellidos: Nombre: Matrícula: (Escribe aquí la solución a la pregunta de desarrollo.)

2010-2011 - Primer semestre (a) Concurrencia 6/6 (Página intencionadamente en blanco.)