08-02-2015, 10:04
Hola gente, paso mi resolución del ejercicio 7 de la guía de sincronización del 2012. Aguardo correcciones y comentarios. Muchas gracias!
7- Suponga que un proceso tiene por tarea compilar un conjunto de programas y luego enviar el
resultado de cada compilación por email al encargado de ese proyecto. Dicho proceso está
organizado de la siguiente manera: N hilos de kernel compilan cada uno un programa distinto, y
luego cada uno de ellos depositan en una lista (compartida para todo el proceso) el resultado,
por otro lado, un hilo de kernel retira los resultados de las compilaciones y manda un email por
cada uno de ellos.
Estructura compartida: lista // Lista de resultados de compilaciones
KLT compilador (N instancias)
While (TRUE){
id_programa = obtener_nuevo_programa();
r = compilar_programa(id_programa);
depositar_resultado(r, lista);
}
KLT notificador (1 instancia)
While (TRUE){
r2 = retirar_resultado(lista);
enviar_email(r2);
}
Asumiendo que la cantidad de programas a compilar es infinita, sincronice dicho código
mediante el uso de semáforos para lograr un correcto uso de los recursos bajo los siguientes
contextos:
a) Asumiendo que la lista no tiene límite de tamaño.
b) Asumiendo que la lista tiene un límite de M resultados como máximo.
a) int depositar = 1 ; int retirar = 0 ;
KLT compilador (N instancias)
While (TRUE){
id_programa = obtener_nuevo_programa();
r = compilar_programa(id_programa);
wait(depositar);
depositar_resultado(r, lista);
signal(retirar);
signal(depositar);
}
KLT notificador (1 instancia)
While (TRUE){
wait(retirar);
r2 = retirar_resultado(lista);
enviar_email(r2);
}
b) int depositar = 1 ; int retirar = 0 ; int resultados = M ;
KLT compilador (N instancias)
While (TRUE){
id_programa = obtener_nuevo_programa();
r = compilar_programa(id_programa);
wait(depositar);
depositar_resultado(r, lista);
wait(resultados);
signal(retirar);
signal(depositar);
}
KLT notificador (1 instancia)
While (TRUE){
wait(retirar);
r2 = retirar_resultado(lista);
signal(resultados);
enviar_email(r2);
}
7- Suponga que un proceso tiene por tarea compilar un conjunto de programas y luego enviar el
resultado de cada compilación por email al encargado de ese proyecto. Dicho proceso está
organizado de la siguiente manera: N hilos de kernel compilan cada uno un programa distinto, y
luego cada uno de ellos depositan en una lista (compartida para todo el proceso) el resultado,
por otro lado, un hilo de kernel retira los resultados de las compilaciones y manda un email por
cada uno de ellos.
Estructura compartida: lista // Lista de resultados de compilaciones
KLT compilador (N instancias)
While (TRUE){
id_programa = obtener_nuevo_programa();
r = compilar_programa(id_programa);
depositar_resultado(r, lista);
}
KLT notificador (1 instancia)
While (TRUE){
r2 = retirar_resultado(lista);
enviar_email(r2);
}
Asumiendo que la cantidad de programas a compilar es infinita, sincronice dicho código
mediante el uso de semáforos para lograr un correcto uso de los recursos bajo los siguientes
contextos:
a) Asumiendo que la lista no tiene límite de tamaño.
b) Asumiendo que la lista tiene un límite de M resultados como máximo.
a) int depositar = 1 ; int retirar = 0 ;
KLT compilador (N instancias)
While (TRUE){
id_programa = obtener_nuevo_programa();
r = compilar_programa(id_programa);
wait(depositar);
depositar_resultado(r, lista);
signal(retirar);
signal(depositar);
}
KLT notificador (1 instancia)
While (TRUE){
wait(retirar);
r2 = retirar_resultado(lista);
enviar_email(r2);
}
b) int depositar = 1 ; int retirar = 0 ; int resultados = M ;
KLT compilador (N instancias)
While (TRUE){
id_programa = obtener_nuevo_programa();
r = compilar_programa(id_programa);
wait(depositar);
depositar_resultado(r, lista);
wait(resultados);
signal(retirar);
signal(depositar);
}
KLT notificador (1 instancia)
While (TRUE){
wait(retirar);
r2 = retirar_resultado(lista);
signal(resultados);
enviar_email(r2);
}