Practica 3

Embed Size (px)

DESCRIPTION

Práctica de SO

Citation preview

  • Sistemas Operativos Prctica 3: Colas de mensajes

    Prctica3Grupos Realizacin Entrega/EvaluacinLunes 28 de Marzo, 4 y 11 de Abril 26 de Abril***Martes 29 de Marzo, 5 y 12 de Abril 26 de Abril

    Mircoles 30 de Marzo, 6 y 13 de Abril 27 de AbrilViernes 1, 8 y 15 de Abril 29 de Abril

    La entrega ser 1 hora antes de la clase, cuando se realizar el examen de la prctica*** Los grupos del lunes entregarn antes del 26 a las 13h. Se les asignar otro turno para realizar el examen de la prctica 3 o el examen de evaluacin no continua.

    Colasdemensajes

    TeoraEnestatercerayltimaprcticadeSistemasOperativos,vamosaaprenderotratcnicapara

    comunicar informacinentrediferentes procesos. Esta tcnicausaunparadigmadiferenteal delaanteriorprcticaqueeseldecolasdemensajes.Lascolasdemensajessonaligualquelamemoriacompartidaunrecursoglobalquegestionaelsistemaoperativo.Elsistemadecolasdemensajesessimilaraldeunsistemadecorreos,enlnosvamosaencontrardostiposdeelementos:

    Mensajes,sonsimilaresaunacartaquesemandaalcorreo,contienenlainformacinquesedeseacomunicarentrelosprocesos

    Procesosqueenvanorecibenmensajes,actancomoremitentesodestinatariosdelosmensajes.Ambostienenquesolicitarpreviamentealsistemaoperativoelaccesoalacolademensajesqueseusarparacomunicarambosprocesos.Apartirdeesemomentoelprocesoremitentecomponeunmensajeyloenvaalacolademensajesyelprocesodestinatariopuedeencualquiermomentorecuperarelmensajedelacola.

    LasfuncionesparatrabajarconcolasdemensajesenUNIXenCestnincluidasenlaslibreras, y. Enparticular, lasfuncionesqueusaremosson: msgget, msgsnd,msgrcvymsgctl.Todasellasdocumentadasenlnea(comandomanoinfo).

    Porltimo,recordarosloscomandos ipcse ipcrmquenospermiteninspeccionarlosrecursoscompartidos(memoriacompartida,semforosymensajes)deunusuarioyeliminarlosencasodequeseanecesario.

    EjerciciosAbredosconsolas,enunadeellasteclea ipcsyapuntalascolasdemensajes,silashubiera,queyaestncreadasenelsistema.Luego,enlaotraconsola,creaunprogramallamadoej1conelsiguientecdigo,complaloyejectalo.

    /* ej1 */#include #include #include #include #include #include

    int main() {

    EscuelaPolitcnicaSuperiorUniversidadAutnomadeMadrid 1

  • Sistemas Operativos Prctica 3: Colas de mensajes int queue; queue = msgget( IPC_PRIVATE, IPC_CREAT| 0600); if (queue == -1) { perror("msgget:"); exit(-1); } exit(0);}

    1.QudiferenciasobservasalcrearlacolademensajesusandoIPC_PRIVATE,enlugardeunaclaveconstante?.PruebaaejecutarlovariasvecesusandoIPC_PRIVATE(1punto)

    Compilaahoraelsiguientecdigoyejectalo.

    // ej2#include #include #include #include #include #include #include #include

    #define CLAVE_MENSAJES 1555

    typedef struct msgbuf { long type; char msg [20];} MSGBUF;

    int main() { int queue; int result; struct msgbuf buffer;

    queue = msgget(CLAVE_MENSAJES, IPC_CREAT|SHM_R|SHM_W); if (queue == -1) { perror("msgget:"); exit(-1); }

    buffer.type = 1; strcpy (buffer.msg, Hola Mundo!); result = msgsnd (queue, &buffer, strlen(buffer.msg)+1, 0); if (result == -1) { perror("msgget:"); exit(-1); }

    exit(0);}

    2.Quhaceestecdigo?Ejectaloycomprubalousandoelcomandoipcs.(1punto)

    EscuelaPolitcnicaSuperiorUniversidadAutnomadeMadrid 2

  • Sistemas Operativos Prctica 3: Colas de mensajes

    3.Modificaelcdigoanteriorparaquealfinalizareliminelacolademensajes.(1punto)

    Compilaahoraelsiguientecdigoyejectalo.// ej4#include #include #include #include #include #include #include #include

    #define CLAVE_MENSAJES 1555

    #define SIZE 1000#define LOOP 2

    typedef struct msgbuf { long type; char msg [SIZE];} MSGBUF;

    int main() { int queue; int result; struct msgbuf buffer; int i;

    queue = msgget(CLAVE_MENSAJES, IPC_CREAT|SHM_R|SHM_W); if (queue == -1) { perror("msgget:"); exit(-1); }

    buffer.type = 1; strncpy (buffer.msg, Hola Mundo!, SIZE); for (i= 0; i < LOOP; i++) { result = msgsnd (queue, &buffer, strlen(buffer.msg)+1, 0); if (result == -1) { perror("msgget:"); exit(-1); } }

    exit(0);}

    4.Ejecutaestecdigo.AhoracambiaelvalordeldefineLOOPporunnmeromayor,hastaqueelprogramasebloquee.Desdeotraconsolaejecutaipcrmparaeliminarlacolacreada,yexplicaporqusehabloqueado.(1punto)

    Paracomplementarelejercicioanteriorcompilaelsiguientecdigo:// ej5#include

    EscuelaPolitcnicaSuperiorUniversidadAutnomadeMadrid 3

  • Sistemas Operativos Prctica 3: Colas de mensajes#include #include #include #include #include #include #include

    #define CLAVE_MENSAJES 1555

    #define SIZE 1000

    typedef struct msgbuf { long type; char msg [SIZE];} MSGBUF;

    int main() { int queue; int result; struct msgbuf buffer; int i = 0;

    queue = msgget(CLAVE_MENSAJES, IPC_CREAT|SHM_R|SHM_W); if (queue == -1) { perror("msgget:"); exit(-1); }

    while (1) { result = msgrcv (queue, &buffer, SIZE, 0, 0); if (result == -1) { perror("msgget:"); exit(-1); } printf (Mensaje %d dice: %s\n, i++, buffer.msg); }

    exit(0);}

    5 Complalo y ejectalo en una consola. Ahora sin parar este proceso, abre una nuevaconsolayejecutaelprogramaej4.Qusucede?Esposibleahorabloquearelprogramaej4cambiandoelvalordeLOOP?(1punto)

    6.Sinpararelej5desdeotraconsolaeliminalascolasdemensajes.Qusucede?(1punto)

    7.Comoafectaalosprogramasej2oej4yalej5aadirelflagIPC_NOWAITalafuncinmsgsndy/omsgrcv.(1punto)

    Compilaelcdigodeestosdosprogramas:// ej8#include #include #include #include

    EscuelaPolitcnicaSuperiorUniversidadAutnomadeMadrid 4

  • Sistemas Operativos Prctica 3: Colas de mensajes#include #include #include #include

    #define CLAVE_MENSAJES 1555

    #define SIZE 1000#define LOOP 5

    typedef struct msgbuf { long type; char msg [SIZE+1];} MSGBUF;

    int main(int argc, char** argv) { int queue; int result; struct msgbuf buffer; buffer.msg[SIZE]=0;/*Aseguramos un /0 final de cadena en todos los casos*/ int i; int type;

    if (argc

  • Sistemas Operativos Prctica 3: Colas de mensajes#define SIZE 1000

    typedef struct msgbuf { long type; char msg [SIZE+1];} MSGBUF;

    int main(int argc, char** argv) { int queue; int result; struct msgbuf buffer; buffer.msg[SIZE]=0;/*Aseguramos un /0 final de cadena en todos los casos*/ int i = 0; int type;

    if (argc ej81,segundaconsola>ej83yterceraconsola>ej82).Ahoraenunacuartaconsolaejecutaelprogramaej8bconargumento2. Explicaqusucede.(1punto)

    10.Modificaelej8boriginalparaqueeldefineSIZEsea15,eliminalascolasyvuelvea ejecutarlosprogramasej8yej8bendiferentesconsolas.Qupasaahora?Enquestadohaquedadolacolademensajes?(1punto)

    11. Conel ej8bmodificadoen el ejercicio anterior aadeel flag MSG_NOERRORa lallamadaalafuncinmsgrcvyvuelvearepetirelcomportamientodelejercicio15.Comentaladiferenciaconelanterior.(1punto)

    EscuelaPolitcnicaSuperiorUniversidadAutnomadeMadrid 6

  • Proyecto finalEl juego del Sudoku (25puntos)

    IntroduccinEn este ltimo ejercicio de la asignatura vamos a desarrollar un juego de resolucin de

    Sudokus entre varios jugadores. Con esto se pretende aplicar los conceptos aprendidos en esta asignatura, memoria compartida, procesos, semforos, seales y colas de mensajes.

    El juego del Sudoku se presenta normalmente como una tabla de NN elementos enteros (celdas), compuesta por N subtablas o bloques dispuestos en igualdad en filas y columnas. Al inicio del juego, algunas de las celdas contendrn ya nmeros ("pistas"). El objetivo es rellenar las celdas vacas, con un nmero en cada una de ellas, de tal forma que cada columna, fila y bloque contengan los nmeros del 1 al N slo una vez. Adems, cada nmero de la solucin final aparecer slo una vez por cada una de las tres "direcciones" del tablero (fila, columna y bloque). En nuestro ejemplo particular, N valdr 9 pero podr ser un valor genrico.Procesos

    En nuestra versin del juego de Sudoku intervendrn 3 roles distintos: un juez de juego que comprobar la validez de las acciones tomadas por los jugadores e instanciar las partidas, los jugadores y un rol especial, ordenador, que dar pistas sobre la resolucin del sudoku cuando los jugadores no puedan continuar jugando.Juez

    El programa juez se instanciar solo una vez y crear las estructuras necesarias si y slo si stas no fueron creadas con anterioridad, es decir, el programa juez no tendr que obligatoriamente ser el primer programa que se instancie.

    Cada Sudoku podr ser resuelto mximo por MAX_JUGADORES jugadores, no siendo necesario que empiece la partida habiendo MAX_JUGADORES jugadores si no que, igualmente, la partida comenzar si tras un determinado tiempo (TIEMPO_INICIO) ningn jugador ha solicitado unirse al juego. Los jugadores, por turnos, irn colocando nmeros en el tablero de juego de forma que, tras cada paso, se cumplan las condiciones del Sudoku. El proceso con rol de juez deber comprobar esta situacin, no debiendo dejar poner ningn nmero no vlido en cualquiera de las celdas del tablero. Para ello, crear tantos procesos hijos con fork() como bloques no completos queden en el tablero de juego. Si todos los procesos hijos determinan que su bloque ha finalizado, el Sudoku estar completo y finalizar la partida.

    El juez es adems el encargado de pasar el turno al siguiente proceso jugador tras un determinado tiempo (TIEMPO_TURNO). Por otra parte, el juez deber ir anotando cuntos nmeros vlidos ha puesto cada jugador en el tablero. En el momento en el que ninguno de los jugadores activos coloque un nmero en alguna de las celdas, el juez avisar al proceso ordenador para que sea ste el que d una nueva pista.

    El juez deber ir tomando nota de todo lo que durante la partida acontezca y al final de partida avisar a todos lo jugadores sobre el resultado de sta.Jugador

    El programa jugador se instanciar tantas veces como jugadores vaya a haber en la partida, se admitir un mximo de MAX_JUGADORES. Cada proceso dar su nombre (recibido como argumento o solicitado al usuario) al proceso juez.

    La accin de cada jugador consiste nicamente en poner nmeros en el tablero mientras sea su turno (durante el espacio de tiempo TURNO_TIEMPO). Puede ocurrir que el jugador no ponga, durante su turno, ningn nmero en ninguna celda. Si intentase poner nmeros no vlidos

  • o que no cumplan las condiciones del sudoku, el turno le ser retirado automticamente, pasando as al siguiente jugador.

  • Al final de la partida, cada jugador ser avisado del resultado de la partida, es decir, si fue o no ganador.Ordenador

    El programa ordenador se instanciar tambin una nica vez y slo actuar cuando ningn jugador haya puesto nmeros en el tablero durante su ltimo turno, por tanto, el jugador ordenador ser siempre el ltimo en jugar (si lo hace) por ronda. Memoria compartida

    En la memoria compartida se alojar una estructura para mantener toda la informacin tanto de la partida, como del tablero y de los jugadores. La estructura e informacin de la memoria compartida ser una decisin de diseo que cada pareja deba tomar, justificndose adecuadamente en la memoria final dicha decisin.Semforos

    Sern necesarios para el acceso exclusivo a la memoria compartida. El control del nmero de jugadores resolviendo los sudoku se deber controlar mediante un

    semforo N-ario.Colas de mensajes

    Cuando un jugador decida poner un determinado valor en una celda, enviar dicho valor y las coordenadas de la celda al proceso juez, que comprobar si la eleccin tomada cumplen las condiciones del juego. De ser as, el valor se escribir en la celda seleccionada por el jugador. El jugador recibir una confirmacin del xito o fracaso de su accin por medio de un mensaje enviado desde el proceso juez.Seales

    Ser obligatorio el uso de las seales de alarma para el control de los tiempos, ya sea el tiempo de espera antes de iniciar la partida como el tiempo del turno de cada jugador.

    Adems debern controlarse las seales que puedan causar la finalizacin de la ejecucin de cualquiera de los programas e ignorarse todas aquellas que no tengan sentido desde el punto de vista de las aplicaciones. Aclaraciones importantes a tener en cuenta

    Se podrn instanciar procesos jugador una vez que la partida haya comenzado. En esta situacin, estos nuevos procesos debern quedarse a la espera de que la partida que est en marcha finalice y se inicie una nueva. La finalizacin de un partida no implica la finalizacin de la ejecucin ni del proceso juez ni del proceso ordenador. Ambos finalizarn una vez que no haya procesos jugador esperando a jugar al Sudoku. Si el proceso juez recibe la seal CTRL+C, debern finalizar todas las instancias de jugador, el juez y el proceso ordenador.

    Se deber asegurar, en todo momento, la integridad de todas las estructuras que se usen, el buen uso de los recursos necesarios y asegurar en todo momento la perfecta concurrencia y sincronizacin de los procesos.

    Todos los accesos concurrentes a la memoria compartida deben estar convenientemente protegidos mediante el uso de semforos. Ser necesario adems controlar todos los retornos de las llamadas a las funciones del sistema, modularizar y comentar el cdigo y liberar todos los recursos que hayan sido utilizados, devolvindose al sistema operativo a la situacin inicial anterior a la ejecucin de las aplicaciones juez, jugador y ordenador.

    TeoraEjercicios