Trabajo Final de Programación Concurrente: Misiles Integrantes Romero Scrofani, Fernando Schild, Marcelo Año: 2013 Introducción En el presente informe, se explica todo lo relacionado con el tratamiento de la concurrencia en el trabajo final de la materia. Lo referente al diseño del código se encuentra en el “Informe de Ingeniería de Software” en la carpeta “Archivos de Ingeniería de Software”. Se llevaron a cabo algunos cambios en dicho diseño, por lo cual, se incluye un nuevo diagrama de clases, así como también, se incluyen diagramas de secuencias que muestran el comportamiento de los objetos afectados por problemas de naturaleza concurrente. Archivos Al presente informe, se adjuntan las siguientes carpetas: Archivos de Ingeniería de Software: Carpeta que contiene el informe del trabajo final de Ingeniería de Software, el cual provee información sobre el diseño del código. Proyecto en Eclipse: Carpeta que contiene el proyecto completo en Eclipse, a fin de facilitar cualquier intento de Revisión del código desde dicha IDE. Código Fuente: Carpeta que contiene el código fuente por sí solo de la aplicación. Archivos de Programación Concurrente: Carpeta que contiene Diagramas utilizados en el estudio de la concurrencia. Nuevo Diagrama de Clases Se confecciono un nuevo diagrama de clases, dado que aquel presente en la etapa de diseño no cumple correctamente con los requerimientos. Se agregaron las siguientes clases: Monitor: Gestiona el acceso de los hilos “MisilAliado” a las baterías encargadas de lanzarlos. Se utilizaron locks para implementar el acceso a la sección crítica, y Conditions (se obtienen a partir de los locks) para implementar las colas de condición del monitor. Petri: Lee la matriz de incidencia presente en un archivo HTML y la utiliza para determinar que acciones son posibles mediante la ecuación de estado de la red de Petri que representa dicha matriz de incidencia. Sólo la clase Monitor Tiene acceso a esta clase. Tx y Rx: Las clases “Tx” y “Rx” se encargan de la comunicación vía sockets entre el Radar y el ServidorEnTierra. También se incorporaron las clases presentes en el paquete “Utilidades”, pero estas no se muestran en el diagrama porque no tienen relación con la concurrencia o con el comportamiento de la simulación. Tales clases son: Logger: Se encarga de guardar un registro de lo que sucede en un log (archivo de texto). GUI_PanelDeRadar y Board: Son el código de la interfaz Gráfica. CalculadoraDeMisiles: Se utiliza para cálculos algebraicos necesarios para calcular la trayectoria de los misiles enemigos, su velocidad, etc. HTML_Parser: Lo utiliza la clase Petri para lee la matriz de incidencia desde un documento HTML generado con el Pipe (aplicación que sirve para dibujar y analizar redes de Petri). Funcionamiento del Monitor Todos los métodos públicos del monitor se ejecutan de manera atómica gracias al uso de locks. Dichos métodos son: solicitarBateria(): Este método es llamado por un hilo misil para solicitar ser disparado por una determinada batería. El monitor consulta a la clase Petri para verificar si el disparo es posible. De no serlo, se bloquea a este hilo en la cola de condición correspondiente a la batería que intento utilizar. habilitarBateria(): Las baterías tienen un tiempo de espera de 30segundos entre un disparo y otro. Al finalizar esos 30segundos, ejecutan este método del monitor para actualizar la red de Petri y ejecutar un resume sobre la cola de condición correspondiente, a fin de que si hay hilos MisilAliado esperando por esta batería, se despierte uno de ellos. getDisponibilidad(): Método que devuelve un arreglo de cuatro elementos booleanos que indican cuales baterías están habilitadas y cuales no. Diagramas de Secuencias de los métodos del monitor: estos diagramas se encuentran en formato PDF en la carpeta “Archivos de Programacion Concurrente”. solicitarBateria() habilitarBateria() Red de Petri La Red de Petri que se utilizó para modelar el sistema garantiza exclusión mutua sobre el uso de las baterías. La imagen a continuación muestra dicha red. El código XML de la red se encuentra en el archivo “Codigo XML de la Red de Petri (Pipe).xml” dentro de la carpeta “Archivos de Programacion Concurrente”. La red consta de 16 estados posibles, esta acotada y posee vivacidad. Análisis de la Red de Petri Invariantes de Plaza: M(Detectados) + M(Ocupada-N) + M(Ocupada-S) + M(Ocupada-E) + M(Ocupada-O) = 4 M(Ocupada-N) + M(Habilitada-N) = 1 M(Ocupada-S) + M(Habilidada-S) = 1 M(Ocupada-E) + M(Habilitada-E) = 1 M(Ocupada-O) + M(Habilitada-O) = 1 Invariantes de Transición: Ejemplo de Ejecución Para ejecutar el código se debe hacer desde la clase “Aplicación” que se encuentra dentro del paquete “Entorno”. Dicha clase solo se encargar de instanciar los objetos necesarios para correr el programa. La imagen a continuación muestra la interfaz gráfica. En ella el círculo rojo delimita el área protegida, los puntos celestes representan a los misiles aliados y los puntos rojos a los misiles enemigos. Al cerrar Esta ventana se detiene la ejecución. Para mayor detalle es posible acceder a un log que se almacena en la capeta raíz del proyecto. Este Log se renueva tras cada ejecución.