Febrero 2009

Transcripción

Febrero 2009
DEPARTAMENTO DE AUTOMÁTICA
Arquitectura e Ingenierı́a de Computadores
Ingenierı́a Informática
Febrero 2009 – Parte II
INSTRUCCIONES
Cada problema debe ser resuelto en hojas aparte.
El valor total de este ejercicio será 4 puntos. Cada problema se valorará en 2 puntos.
Igual que en la Parte I, no se permiten libros, apuntes, móviles, calculadoras, ni calculadoras como móviles, ni móviles como calculadoras, ni “ná de ná”.
La duración de este ejercicio será de hora y media.
Problema 1
Considérese el Programa 1 (véase al final). Se trata de una implementación de una función barrera
utilizando el paradigma de memoria compartida PTHREADS. La funci ón barrera init inicializa
una barrera (pasándole como argumento el número de hebras que van a concurrir) y debe ser llamada
sólo una vez. La función barrera implementa la funcionalidad de la barrera. Contestar las siguientes
cuestiones:
1. ¿Para qué se utiliza la variable ciclo que aparece en la lı́nea 37?
2. ¿Qué función tiene la instrucción de la lı́nea 38?
3. ¿Para qué son necesarias las llamadas a la función pthread setcancelstate de las lı́neas
41 y 47?
4. Lamentablemente, la implementación que se presenta tiene un fallo por el cual la función
barrera se queda colgada si intervienen más de dos hebras. Explicar por qué y dar una solución.
Problema 2
Se tiene un circuito que implementa una determinada operaci ón con duración Tns = 450 ns. Se
segmenta la operación en 5 etapas lineales, de duración T1 = 80 ns, T2 = 105 ns, T3 = 90 ns, T4 = 75
ns y T5 = 100 ns, para lo que se necesita añadir un registro entre etapas que introduce un retardo
adicional de 20 ns. Se pregunta:
1. ¿Cuál es la frecuencia máxima de funcionamiento del circuito segmentado?
2. ¿Cuál la ganancia máxima obtenida por medio de la segmentación?
3. ¿Cuál es la máxima velocidad de operación del circuito segmentado?
4. ¿Cuál es el mı́nimo número de operaciones que es necesario ejecutar para obtener un 90 % de
la ganancia máxima?
Programa 1
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
# include <pthread.h>
typedef struct {
pthread_mutex_t
pthread_cond_t
int
int
int
} barrera_t;
mutex;
cv;
umbral;
contador;
ciclo;
int barrera_init(barrera_t *b, int total_hebras) {
int status;
b->umbral = b->contador = total_hebras;
b->ciclo = 0;
status = pthread_mutex_init(&b->mutex, NULL);
if (status != 0)
return status;
status = pthread_cond_init(&b->cv, NULL);
if (status != 0) {
pthread_mutex_destroy(&b->mutex);
return status;
}
return 0;
}
int barrera(barrera_t *b) {
int status, cancel, ciclo;
status = pthread_mutex_lock(&b->mutex);
if (status != 0)
return status;
ciclo = b->ciclo;
if (--b->contador == 0) {
b->ciclo = !b->ciclo;
b->contador = b->umbral;
status = pthread_cond_signal(&b->cv);
} else {
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cancel);
while (ciclo == b->ciclo) {
status = pthread_cond_wait(&b->cv, &b->mutex);
if (status != 0) break;
}
pthread_setcancelstate(cancel, NULL);
}
pthread_mutex_unlock(&b->mutex);
return status;
}
2

Documentos relacionados