Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Anónimo
No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
Examen Práctica Semáforos y Memoria Compartida
APELLIDOS: ___________________________________________________________________
NOMBRE: ___________________________________________ DNI: ______________________
Indicaciones:
Calificación
● Quite de la mesa cualquier libro, apunte y/o teléfono móvil.
● Debe anotar su solución por escrito en el espacio disponible en este cuestionario.
● Cuando tenga una solución al ejercicio muéstrela al profesor (compilación + ejecución).
● Tiempo para realizar el examen: 1 hora y 30 minutos.
Este proceso cliente creará un vector con tantos elementos como se indique en n_elem_fib,
representando cada uno de ellos al elementos correspondiente de la sucesión de Fibonacci. En
n_proc_sumatorio se indicará el número de procesos de sumatorio que se lanzarán para su
cálculo. Finalmente, tamsv será el tamaño máximo de cada subvector (cada proceso sumatorio
calculará un sumatorio parcial cuyo resultado actualizará convenientemente el campo result de
una variable de memoria compartida).
Los procesos sumatorio atenderán peticiones de cálculo de sumatorios parciales hasta que el
cliente les envíe la señal de terminación (señal SIGINT). En cada petición, el proceso les
indicará el índice de inicio y fin de cada subvector, actualizando éstos en el campo result el
resultado parcial del sumatorio.
Consideraciones:
• No es obligatorio realizar la comprobación de errores.
• Preste especial atención a lograr el máximo paralelismo posible en la solución.
1 La sucesión de Fibonacci es una sucesión infinita de número naturales que comienza con 0 y 1 y, a partir de éstos,
cada elemento es la suma de los dos anteriores (0, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 143, ...)
Página 1 de 7
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-1218278
Escuela Superior de Informática
Universidad de Castilla-La Mancha
Programación Concurrente y Tiempo Real
Examen Práctica Semáforos y Memoria Compartida
Resolución
Utilice el código fuente suministrado a continuación como plantilla para resolver el ejercicio. Este
código fuente no contiene errores y no debe ser modificado (salvo la inicialización de los semáforos
en el proceso ). Únicamente debe incorporar su código en la sección indicada.
No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
Indique a continuación el valor de inicialización de los semáforos (código en .c):
Resultado: 88
0 1 1 2 3 5 8 13 21 34
+ + + +
88
vdatos.result
Resultado: _ __
Página 2 de 7
Tenemos lo que nos faltaba: Imprime tus apuntes al mejor precio y recíbelos en casa
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-1218278
Escuela Superior de Informática
Universidad de Castilla-La Mancha
Programación Concurrente y Tiempo Real
Examen Práctica Semáforos y Memoria Compartida
makefile
1 DIROBJ = obj/
2 DIREXE = exec/
3 DIRHEA = include/
4 DIRSRC = src/
No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
5
6 CFLAGS := -I$(DIRHEA) -c -Wall
7 LDLIBS := -lpthread -lrt -lm
8 CC := gcc
9
10 all : dirs sumatorio
11
12 dirs:
13 mkdir -p $(DIROBJ) $(DIREXE)
14
15 : $(DIROBJ) .o $(DIROBJ)semaforoI.o
16 $(CC) -o $(DIREXE)$@ $^ $(LDLIBS)
17
18 sumatorio: $(DIROBJ)sumatorio.o $(DIROBJ)semaforoI.o
19 $(CC) -o $(DIREXE)$@ $^ $(LDLIBS)
20
21 $(DIROBJ)%.o: $(DIRSRC)%.c
22 $(CC) $(CFLAGS) $^ -o $@
23
24 clean :
25 rm -rf *~ core $(DIROBJ) $(DIREXE) $(DIRHEA)*~ $(DIRSRC)*~
26
27 test: # Salida: 88
28 ./exec/ 10 3 3
29
globaltp.h
32 #define _XOPEN_SOURCE
33 #define _XOPEN_SOURCE_EXTENDED
34 #include <stdio.h>
35 #include <errno.h>
36 #include <string.h>
37 #include <stdlib.h>
38 #include <unistd.h>
39 #include <fcntl.h>
40 #include <math.h>
41 #include <signal.h>
42 #include <sys/mman.h>
43 #include <sys/stat.h>
44 #include <sys/types.h>
45
46 #include "semaforoI.h"
47
48 #define SEMORD I "s_ord "
49 #define SEMORD "s_ord
50 #define SEMFIN "s_fin"
51 "
#define MUTEX "s_mutex"
52
53 #define MEM "mc_ "
54 #define MEMORDEN "mc_orden"
55
56 #define MAXARRAY 1000
57
58 struct atos {
59 long long result;
60 long long v[MAXARRAY];
61 };
62
63 struct rden {
64 int inicio;
65 int fin;
66 };
67
68 enum TipoProceso {SUMATORIO};
69
70 struct roceso {
71 enum TipoProceso tipo; /* Tipo del proceso */
72 pid_t pid; /* PID del proceso hijo */
73 };
Página 3 de 7
Tenemos lo que nos faltaba: Imprime tus apuntes al mejor precio y recíbelos en casa
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-1218278
Escuela Superior de Informática
Universidad de Castilla-La Mancha
Programación Concurrente y Tiempo Real
No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
Examen Práctica Semáforos y Memoria Compartida
semaforoI.h
74 #ifndef __SEMAFOROI_H__
75 #define __SEMAFOROI_H__
76
77 #include <semaphore.h>
78
79 /* Crea un semáforo POSIX */
80 sem_t *crear_sem (const char *name, unsigned int valor);
81 /* Obtiene un semáforo POSIX (ya existente) */
82 sem_t *get_sem (const char *name);
83 /* Cierra un semáforo POSIX */
84 void destruir_sem (const char *name);
85 /* Incrementa el semáforo */
86 void signal_sem (sem_t *sem);
87 /* Decrementa el semáforo */
88 void wait_sem (sem_t *sem);
89
90 #endif
semaforoI.c
Página 4 de 7
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-1218278
Escuela Superior de Informática
Universidad de Castilla-La Mancha
Programación Concurrente y Tiempo Real
Examen Práctica Semáforos y Memoria Compartida
No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
167
168 int main(int argc, char *argv[]) {
169 struct atos * ;
170 struct rden *orden;
171 pid_t pid;
172
173 int shmMC , shmMCOrden;
174 sem_t * rden ista, * rden eida, * in;
175 int i, n lem , n , ;
176 int , = 0, = 0;
177
178 /* Instalación del manejador de Control-C */
179 if (signal(SIGINT, controlador) == SIG_ERR) {
180 fprintf(stderr, "Error al instalar manejador en %s\n", argv[0]);
181 exit(EXIT_FAILURE);
182 }
183
184 n = atoi(argv[1]); /* Numero elementos del vector */
185 n = atoi(argv[2]); /* Numero de procesos sumatorio */
186 = atoi(argv[3]); /* Tamano maximo del subvector */
187
188 = n ;
189 pids = malloc(sizeof(struct roceso ) * ( )); /* Tabla de procesos */
190
Página 5 de 7
Tenemos lo que nos faltaba: Imprime tus apuntes al mejor precio y recíbelos en casa
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-1218278
Escuela Superior de Informática
Universidad de Castilla-La Mancha
Programación Concurrente y Tiempo Real
Examen Práctica Semáforos y Memoria Compartida
No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
256 /* Esperar a que todos los subvectores hayan sido calculados */
257 while (n < n ) {
258 wait_sem( in);
259 n ++;
260 }
261
262 printf ("\nResultado: %lld \n", ->result);
263
264 close(shmMC );
265 close(shmMCOrden);
266 finalizarProcesos();
267 liberarRecursos();
268
269 return ;
270 }
271
272 long long fibonacci (int n, long long *v) {
273 if (n<2) return (n); else return (v[n-1] + v[n-2]);
274 }
275
276 /* Manejador de señal SIGINT */
277 void controlador (int senhal) {
278 printf("\nFin del programa (Control + C)\n");
279 finalizarProcesos();
Página 6 de 7
Tenemos lo que nos faltaba: Imprime tus apuntes al mejor precio y recíbelos en casa
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-1218278
Escuela Superior de Informática
Universidad de Castilla-La Mancha
Programación Concurrente y de Tiempo Real
No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
Examen Práctica Semáforos y Memoria Compartida
Incluya aquí el bucle para atender peticiones (Longitud aprox. ≈ 5 Líneas de código)
Muestre en pantalla información sobre el PID del proceso que ha calculado cada subvector, el inicio y el fin y el resultado
while (1) {
350 wait_sem ( rdenLista);
351
352 indiceInicio = orden->inicio;
353 indiceFin = orden->fin;
354
355 signal_sem ( rdenLeida);
356
357
358
359
360
361 for (i = indiceInicio; i <= indiceFin; i++) {
362
363 datos-> [i];
364 }
365
366
367
368 wait_sem( utex);
369
370 datos-> = ;
371 signal_sem( utex);
372
373
374
375
376 printf ("[PID %d] Ini %d Fin %d ",
377 getpid(), indiceInicio, indiceFin );
378
379
380 signal_sem( in);
381
382 }
Paseo de la Universidad 4 | 13071 Ciudad Real | Telf: (+34) 926295300 | Fax: (+34) 926295354
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-1218278