\newpage Ejercicio 7 ==== En este ejercicio se nos pide implementar dos versiones de un scheduler del tipo **Shortest Job First**, la primera de ellas no reentrante(*SJF*) que va a ejecutar la tarea ya cargada que necesite la menor cantidad de cpu y una segunda implementación reentrante(*RSJF*) que en en cada iteración ejecutará la tarea con menor cantidad de procesamiento pendiente. ## Implementación Para los dos tipos de schedulers empezamos usando `Map` de __C++__ ya usado en ejercicios anteriores para la carga inicial de los **Procesos** un struct que nos permite almacenar el process id, la duración de la tarea y en el caso de *RSJF* un contador de quantums consumidos. Luego cuando al momento de cargar un **Proceso** lo obtenemos del `Map` y lo encolamos en una `priority_queue` de **Procesos**, dicha cola nos asegura obtener siempre la tarea cargada que necesite menos tiempo de cpu. Finalmente los cpus de *SJF* siempre obtendrán la tarea lista de menor duración de la cola y la ejecutará hasta terminar. Por otro lado los cores *RSJF* ejecutaran la tarea lista por la cantidad de quantums asignados y una vez terminado el quantum reencolaran la tarea con la duración restante en la cola de prioridad para luego volver a obtener la siguiente tarea con menor duración o quedar idle. ## Pruebas Para hacer unas pruebas sencillas generamos dos lotes de tareas, los cuales tienen un *context switch* de 2 ciclos y un *core switch* y *quantum* de 4 ciclos obteniendo los siguientes resultados. A. Scheduler SJF con 1 y 2 cores, lote y resultados: | Task | Tipo | Release time | n | |------|-------------|--------------|----| | 0 | TaskCPU | 0 | 15 | | 1 | TaskCPU | 5 | 10 | | 2 | TaskCPU | 10 | 5 | ![Ejercicio 7 - SJF - 1 Core](informe/imagenes/ejercicio7_SJF_1core.png) ![Ejercicio 7 - SJF - 2 Core](informe/imagenes/ejercicio7_SJF_2core.png) B. Scheduler RSJF(reentrante) con 1 y 2 cores, lote y resultados: | Task | Tipo | Release time | n | |------|-------------|--------------|----| | 0 | TaskCPU | 0 | 20 | | 1 | TaskCPU | 5 | 4 | | 2 | TaskCPU | 10 | 5 | ![Ejercicio 7 - RSJF - 1 Core](informe/imagenes/ejercicio7_RSJF_1core.png) ![Ejercicio 7- RSJF - 2 Core](informe/imagenes/ejercicio7_RSJF_2core.png) A la vista de estos resultados, todo parece indicar que el comportamiento de las dos implementaciones es acorde a lo esperado y en el siguiente ejercicio se hara un análisis comparativo de los mismo.