guidobotta / Taller1-TP2

0 stars 0 forks source link

TP2

Recolectores y Productores

BOTTA, Guido Tomas

Padron: 102103

Enlace a Github: https://github.com/guidobotta/tp2-taller

Introducción

     El presente trabajo práctico fue realizado con la finalidad de incorporar conceptos de manejo de threads.

     Se desarrollo un programa en el que recolectores y productores trabajan en simultáneo a través de threads, conectados por objetos de almacenamiento bloqueantes.

Desarrollo

Problema de Recolectores y Productores

     Se cuenta con un conjunto de trabajadores, que dividen en recolectores, que trabajan la materia prima, y productores, que transforman la materia prima en puntos de beneficio. Ambos tipos de trabajadores serán modelados como threads. Además, se cuenta con un conjunto de recursos con los que trabajarán estos trabajadores.

     Además de los recursos y trabajadores, se cuenta con estructuras de almacenamiento que son las colas bloqueantes y un inventario (también bloqueante). Cada tipo de recolector tendrá una cola bloqueante a la que acceder. En cambio, habrá un único inventario compartido para todos los tipos de trabajadores.

     Los recursos se dividen en cuatro tipos: Trigo, Madera, Carbón y Hierro.

     Los recolectores se dividen en tres tipos:

  1. Agricultores: recolectan trigo, proveniente de la respectiva cola bloqueante, y lo envían al inventario.
  2. Leñadores: recolectan madera, proveniente de la respectiva cola bloqueante, y lo envían al inventario.
  3. Mineros: recolectan hierro y carbón, proveniente de la respectiva cola bloqueante, y lo envían al inventario.

     Los trabajadores se dividen en tres tipos:

  1. Cocineros: convierten 2 unidades de trigo más 1 de carbón, obtenidas del inventario, en 5 puntos de beneficio.
  2. Carpinteros: convierten 3 unidades de maderas más 1 de hierro, obtenidas del inventario, en 2 puntos de beneficio.
  3. Armeros: convierten 2 unidades de carbón más 2 de hierro, obtenidas del inventario, en 3 puntos de beneficio.

     Los trabajadores, al recibir los materiales que necesitan, dormirán para simular trabajo. Por parte de los recolectores, dormirán 50ms. Mientras que los productores dormirán 60ms.

     Para la ejecución del programa, se requieren dos archivos:

Agricultores=x
Leniadores=x
Mineros=x
Cocineros=x
Carpinteros=x
Armeros=x

         Donde x puede ser cualquier número entero positivo. No importa el orden de los trabajadores, pero deben estar todos especificados.

TTTMMCCHHHC
TTTMMMCCCMM
MMMMMMTTTTC

         Donde T representa Trigo, M representa Madera, C representa Carbón y H representa Hierro. Además, se deben tener en cuenta las siguientes aclaraciones:

     El hilo principal es el encargado de spawnear el resto de los hilos, leer el archivo con el contenido del mapa, y repartir los recursos en las colas bloqueantes. Luego, este hilo se encarga de finalizar los procesos e imprimir las estadísticas finales, que tienen el siguiente formato:

Recursos restantes:
  - Trigo: x
  - Madera: x
  - Carbon: x
  - Hierro: x

Puntos de Beneficio acumulados: x

     Donde x es el número entero que representa la cantidad de recursos restantes, en el caso de los recursos, o los puntos de beneficios acumulados al finalizar el programa.

     La siguiente imagen representa la dependencia de cada objeto.

Dependencias

     Por último, el formato para la ejecución del programa es el siguiente:

./tp trabajadores.txt mapa.txt

Diseño e implementación

     Para la solución de el problema planteado, se definieron diferentes clases que se pueden dividir por sectores.

     A continuación se muestran distintos diagramas para detallar la implementación.

Clases Principales

     Este diagrama de clases muestra la implementación de las clases encargadas del flujo principal del programa. El MapReader, que cuenta con un FileReader, se encarga de leer el mapa y enviar Recursos a cada una de las 3 ResBlockingQueue's que tiene asignada. Luego, los Collector's se encargan de retirar de su correspondiente ResBlockingQueue un Recurso, para luego enviarlo al Inventory. Del Inventory toman los recursos, una vez que están disponibles, los distintos Worker's. Estos se encargan de convertir los Recursos en puntos de beneficios, actualizando al finalScore del objeto de clase Score.

Clases Manager

     El anterior diagrama de clases muestra la conexión entre las clases Manager y las Trabajadoras. Las clase Manager son las encargadas de obtener del archivo, leido por un FileReader, las cantidades de cada Recolector, en el caso de CollectorManager, y de cada Trabajador, del lado de WorkManager. Una vez obtenidas las cantidades, crean entre 0 y n (n un numero natural) de cada clase trajadora. Una vez finalizada la ejecución de los trabajadores, los managers se encargan de asegurarse que no haya errores en la ejecución, realizando un join sobre cada hilo existente.

Dificultades en el Desarrollo

     A continuación se mencionaran ciertos escenarios que presentaron alguna dificultad en el desarrollo:

  1. Uno de los problemas que se presentó fue el de la complejidad del lenguaje al desarrollar POO. Si bien C++ es un lenguaje con orientación a objetos, la programación "puramente" orientada a objetos se dificulta en ciertos casos, a diferencia de la programación con Java. Por ejemplo, es muy complicado hacer un Double Dispatch sin que presente complicaciones.

  2. Otro de los mayores problemas fue el de debuggear threads. Al ejecutar un debugger y correrlo con normalidad como si se tratase cualquier programa sin threads, se presenta la complicación del switch entre threads que realiza el procesador en momentos inpredecibles. Si bien algunos editores de texto como Visual Studio Code presentan algunas herramientas para tratar con estos, no deja de ser una tarea difícil.

Conclusiones

     Trabajar con hilos puede ser muy complicado y dificil a la hora de debuggear. Aún así, son necesarios a la hora de crear un programa de gran escala, ya que la posibilidad de ejecutar diferentes tareas en paralelo puede ser muy beneficioso sobre el rendimiento. Esto hay que tratarlo con cuidado, ya que si se abusa sin sentido de estos recursos, puede llegar a bajar el rendimiento del programa.

     En este trabajo puede no ser tan notoria la diferencia de rendimiento, aunque el hecho de que los trabajadores tengan que dormir para simular trabajo, hace que otros hilos puedan aprovechar y seguir trabajando. Se realizó el experimento de hacer un mapa con muchos recursos y trabajar distintas cantidades de trabajadores. Pero si bien se nota una diferencia, no creo que sea el mejor de los ejemplos para dar en cuanto a rendimiento.

Apéndice

Correcciones en el Trabajo

     Se realizaron las siguientes modificaciones: