\newpage
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.
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.
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 |
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 |
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.