Sistemas Distribuidos. Grado en Ingeniería Informática. Curso 2012/2013 Ejercicio Propuesto 1: Comunicación y sincronización de procesos Se desea sincronizar N procesos ligeros que ejecutan en la misma máquina de acuerdo a los siguientes eventos: 1. Todos los procesos deberán comenzar su ejecución al mismo tiempo. 2. Los procesos deberán realizar un total de F fases. En cada fase, un proceso iterará M veces y en cada iteración realizará lo siguiente: a) Incrementar un contador compartido. Para acceder a dicho contador implementará una sección crítica usando colas de mensajes. Al inicio de cada fase el contador compartido se inicializará a 0. b) Esperar o bloquearse durante un tiempo aleatorio. Se proporcionará al alumno un código C que devuelve el número de microsegundos que el proceso deberá bloquearse. c) Al final de cada iteración, el proceso imprimirá un carácter CHAR (e.g. ‘|’). Este carácter se deberá imprimir en la salida estándar (pantalla) en la posición siguiente a la del último carácter escrito por ese proceso. Se proporcionará al alumno un código C para situar el cursor en la posición correspondiente de la pantalla. 3. Los procesos que terminan cada fase deberán esperar a que el resto de procesos la completen. Es decir, ningún proceso comenzará la fase i (i<=F) hasta que la fase i-1 haya sido completada por todos los procesos. Este punto de sincronización se conseguirá implementando una función barrera. 4. Se vuelve al paso 2. El programa termina cuando todos los procesos completan las F fases. El alumno deberá implementar un programa en C que satisfaga los requisitos anteriores. El programa aceptará cuatro argumentos de entrada, y se ejecutará de la siguiente manera: ./speeds <N> <F> <M> <CHAR> donde N es el número de procesos que deberán sincronizarse, F es el número de fases, M es el número de veces que se itera en cada fase (equivalente al número de veces que se imprime el carácter CHAR) y CHAR es cualquier carácter alfanumérico válido. Se pide: a) Decisiones de diseño para la implementación del programa speeds. b) Código C correspondiente al programa speeds. El alumno puede utilizar el siguiente código de apoyo: a) Código ejecutable de prueba del programa speeds. b) Código C correspondiente a la función gotoxy(), que situa el cursor en una posición determinada de la pantalla y a la función get_useconds(), que devuelve el número de microsegundos que deberá dormir el proceso utilizando usleep. La entrega se realizará mediante Aula Global. La fecha límite de entrega es: 01/03/2013.