Trabajo Práctico - Scheduling de tareas Integrantes: Gastón Lodieu, LU 661/97, [email protected] Leonardo Raed, LU 579/04, [email protected] Parte 1: Entendiendo el Simulador simusched Ejercicio 1: Escriba un tipo de tarea TaskCon que simule una tarea interactiva. La tarea debe realizar n llamadas bloqueantes de una duración al azar entre bmin y bmax inclusive. La tarea debe recibir tres parámetros: n, bmin y bmax que serán interpretados como los tres elementos del vector de enteros que recibe la función. o Solución: Ver código de archivo Task.cpp Ejercicio 2: Escriba un lote de 3 tareas distintas: una intensiva en CPU y las otras dos de tipo interactivo. Ejecute la simulación para FCFS y haga el diagrama de Gantt de este lote. o Solución: La tarea que se ejecutó fue la siguiente: TaskCPU 10 *2 TaskCon 3 3 8 A simple vista se ve el funcionamiento del scheduling con politica Fifo , en donde una tarea que está haciendo entrada/salida no permite la ejecución del resto de las tareas. Parte 2: Extendiendo el Simulador simusched Ejercicio 3: Completar la implementación del scheduler Round-Robin implementando los métodos de la clase SchedRR en los archivos sched_rr.cpp y sched_rr.h. Esta implementación recibe un único parámetro que representa el quantum del scheduler. o Solución: Ver código de sched_rr.cpp y sched_rr.h Ejercicio 4: Diseñar y simular uno o más lotes de tareas con el algoritmo Round-Robin. Mostrar y explicar brevemente que el comportamiento es el esperado en base a los diagramas de Gantt generados. Realizar nuevos tipos de tarea de ser necesario para este propósito. o Solución: Para evaluar el desempeño del scheduler Round-Robin, se corrieron las siguientes tareas con un quantum de 3 y un costo de cambio de contexto de una unidad: Tarea 1: *3 TaskBatch 20 5 Tarea 2: *3 TaskBatch 20 5 *4 TaskCPU 4 A raíz de las tareas ejecutadas llegamos a la conclusión de que Round-Robin atiende rápido a todas los procesos. Esto beneficia a aquellos procesos pequeños ya se aseguran su terminación en un tiempo razonable, sin quedar en desventaja ante procesos grandes que ocuparían el cpu por mucho tiempo. Esta política de scheduler optimiza: 1- La latencia: minimiza el tiempo requerido para que un proceso empiece a dar resultados (depende el quantum asignado). 2- El tiempo de respuesta: minimiza el tiempo de respuesta percibido por los usuarios interactivos (depende el quantum asignado). Queda claro también que exagerar con el quantum asignado genera una similitud con la política de Fifo. Ejercicio 5: Completar la implementación del scheduler Multilevel Feedback Queue implementando los métodos de la clase SchedMFQ en los archivos sched_mfq.cpp y sched_mfq.h. La implementación debe utilizar n colas con Round-Robin en cada una con los parámetros que se detallan a continuación...(Sigue en el enunciado del tp) o Solución: Ver código de sched_mfq.cpp y sched_mfq.h Parte 3: Evaluando los algoritmos de scheduling Ejercicio 6: Programar un tipo de tarea TaskBatch que tome dos valores tot y blocks. El tiempo total de CPU que utilice la tarea deberá ser de tot ciclos de reloj, incluyendo el tiempo utilizado por las llamadas bloqueantes. La tarea realizará blocks llamadas bloqueantes que durarán exactamente 1 ciclo de reloj, en momentos elegidos al azar. o Solución: Ver código de archivo Task.cpp Ejercicio 7: Diseñar un lote de tareas TaskBatch de igual uso del CPU pero distinta cantidad de bloqueos. Simular este lote con el algoritmo SchedRR con distintos valores de quantum y un costo de cambio de contexto de una unidad. Concluir cuál debería ser la mejor elección del quantum en base a las distintas medidas disponibles. Justificar. o Solución: Para concluir cual debería ser la mejor elección de quantum se analizaron las siguientes variantes: Cantidad de procesos = 10 por prueba. Duración de total por proceso = 20 Variación de quantum para cada prueba: 2 a 20 Costo de cambio de contexto = 1,2 y 3. La ejecución de las tareas se realizó con el archivo run.sh, cambiando las tareas batch del archivo TaskBatch.tsk Prueba 1 Prueba 2 Prueba 3 Prueba 4 Tarea Tas k Batch Tas k Batch Tas k Batch Tas k Batch Tas k Batch Tas k Batch Tas k Batch Tas k Batch Tas k Batch Tas k Batch Tot Block 20 20 20 20 20 20 20 20 20 20 Block Block Prueba 5 Prueba 6 Prueba 7 Prueba 8 Prueba 9 Prueba 10 Prueba 11 Prueba 12 Prueba 13 Prueba 14 Prueba 15 Block Block Block Block Block Block Block Block Block Block Block Block 2 4 2 4 2 4 2 4 2 4 2 6 2 6 2 6 2 6 2 6 3 7 3 7 3 7 3 7 3 7 4 8 4 8 4 8 4 8 4 8 6 8 6 8 6 8 6 8 6 8 7 9 7 9 7 9 7 9 7 9 8 10 8 10 8 10 8 10 8 10 5 15 5 15 5 15 5 15 5 15 6 16 6 16 6 16 6 16 6 16 7 17 7 17 7 17 7 17 7 17 8 18 8 18 8 18 8 18 8 18 9 19 9 19 9 19 9 19 9 19 12 18 12 18 12 18 14 16 14 16 14 18 14 17 14 17 17 16 17 16 18 17 16 17 16 16 18 17 18 17 Cos to de Cam bio de Contex to Qty interrupciones prom edio Mejor Quantum Tiem po m ax im o de ejecución 1 3 14 250 1 4 15 250 1 5 13 270 1 6 11 295 1 7 9 290 1 8 7 300 1 9 6 315 1 10 9 320 1 11 10 330 1 12 8 340 1 13 7 340 1 14 6 360 1 15 4 370 1 16 3 380 1 17 3 390 Cos to de Cam bio de Contex to Mejor Quantum Tiem po m ax im o de ejecución 2 17 290 2 14 320 2 13 330 2 11 360 2 9 370 2 7 380 2 6 410 2 8 440 2 10 450 2 8 470 2 7 490 2 5 510 2 5 530 2 3 550 2 3 570 Cos to de Cam bio de Contex to Mejor Quantum Tiem po m ax im o de ejecución 3 17 330 3 18 360 3 13 380 3 11 420 3 9 450 3 7 490 3 6 510 3 9 530 3 8 570 3 7 600 3 7 640 3 5 660 3 5 680 3 3 730 3 3 730 Los siguentes graficos muestran los resultados de las ejecuciones para tareas de tamaño 20 y un promedio de interrupciones que va de 3 a 17. En este grafico se observa la curva dada por la relación entre qty de int promedio y el quantum elegido. En este grafico observa que variando el costo por el ContexSwitch la curva mencionada en el grafico anterior no cambia. Este grafico muestra que el tiempo de ejecución de los ejemplos evaluados crece linealmente en relación con el costo del ContexSwitch. Analizando los resultados arrojados por las pruebas concluimos que: Las tareas con menor cantidad de interrupciones por I/O promedio terminan más rápido con un quantum más grande. Esto se debe a que al tener menor cantidad de interrupciones aprovecha mejor los bursts de CPU más largos para terminar antes. Logrando un tiempo total de ejecución menor. No así aquellas tareas con más cantidad de interrupciones por I/O promedio, que por el contrario, con un quantum pequeño tienen el mismo desempeño que con un quantum grande. Esto se debe a que los desalojos de los procesos de la memoria se hace en su mayoria por causa de estas interrupciones y no por agotar su quantum, por ende tener un quantum muy grande o tenerlo muy pequeño no generan mejoras en la ejecución de los procesos. El tiempo final de ejecución acompaña lo que imaginábamos, mientras más interrupciones tienen las tareas, más tiempo demora la ejecución. Esto se debe tambien a que, más interrupciones implican más cambios de contexto, por lo cual suena logico que se tarde más. Ejercicio 8: Para el algoritmo implementado en SchedMFQ: o a) Explicar cómo podría producirse inanición (starvation) de una tarea TaskCPU 20 cargada al inicio. o b) Mostrar un lote de tareas, parámetros iniciales y el diagrama de Gantt asociado para un scheduler con 3 colas en donde se pueda ver que esto ocurre. Implementar nuevos tipos de tarea si es necesario. o Solución: o a) La inanición puede producirse en sistemas de alta carga donde un ejemplo puede ser el siguiente. Una tarea TaskCPU 20 es cargada al inicio (donde 20 es mayor al quantum de la cola más prioritaria). Al ser un sistema de alta carga, en todo momento llegan tareas para ejecutar y estas se encolan en la cola más prioritaria. La tarea TaskCPU 20 no llega a completarse dentro del quantum asignado por la cola y pasa a la siguiente de inferior de prioridad. El procesador continúa ejecutando las tareas de alta prioridad, que se encuentra en la cola mas prioritaria, y no deja ejecutar la tarea TaskCPU 20 por estar en una de menor prioridad. Una solución para este problema es la implementación de la técnica ageing, la tarea va ganando prioridad a medida que pasa el tiempo. Otro ejemplo donde se ve que se produce inanicion es el siguiente: Suficientes tareas interactivas (TaskBatch) con gran cantidad de interrupciones IO cortas. Estos procesos siempre se mantienen en la cola mas prioritaria, imposibilitando que procesos de colas con menos prioridad puedan ejecutarse. o b)A partir de la explicación en el punto a), y al no poder simular un sistema de alta carga, mostraremos como la TaskCPU 20 termina con su ejecución luego de que el procesador ejecute todas las demás tareas. Usamos la implementación de SchedMFQ con parámetros 7 8 9. En el diagrama de Gantt que se muestra a continuación, vemos como la TaskCPU 20 consume todo el quantum correspondiente a la cola más prioritaria. Al no completarse, la tarea pasa a la segunda cola prioritaria. Luego el procesador ejecuta los siguientes procesos y estos finalizan su ejecución dentro del quantum de la cola más prioritaria. Cuando el procesador finaliza con todos los procesos, la TaskCPU 20 completa su ejecución. La tarea ejecutada es la siguiente: TaskCPU 20 @10: TaskCPU 4 TaskCPU 3 TaskCPU 2 TaskCPU 1 TaskCPU 4 TaskCPU 3 TaskCPU 2 TaskCPU 1 TaskCPU 4 TaskCPU 3 TaskCPU 2 TaskCPU 1 TaskCPU 4 TaskCPU 3 TaskCPU 2 TaskCPU 1 TaskCPU 4 TaskCPU 3 TaskCPU 2 TaskCPU 1 @15: TaskCPU 4 TaskCPU 3 TaskCPU 2 TaskCPU 1 TaskCPU 4 TaskCPU 3 TaskCPU 2 TaskCPU 1 Otro ejemplo de tareas que producen inanición, tal como se menciona en el punto a es el siguiente: En donde las tareas que se ejecutan son las siguientes: TaskCPU 20 @10: TaskBatch 20 18 TaskBatch 20 18 TaskBatch 20 18 TaskBatch 20 18 TaskBatch 20 18 TaskBatch 20 18 TaskBatch 20 18 TaskBatch 20 18 TaskBatch 20 18 TaskBatch 20 18 TaskBatch 20 18 TaskBatch 20 18 TaskBatch 20 18 TaskBatch 20 18 TaskBatch 20 18 TaskBatch 20 18 TaskBatch 20 18 TaskBatch 20 18 TaskBatch 20 18 TaskBatch 20 18 TaskBatch 20 18 TaskBatch 20 18 TaskBatch 20 18 TaskBatch 20 18 TaskBatch 20 18 TaskBatch 20 18 Se observa que el proceso 0 consume su quantum, es desalojado y enviado a la siguiente cola de menor prioridad. A partir de ese momento comienza la ejecución de los procesos interactivos que alternan el uso de CPU entre ellos ya que se desalojan por IO, continuando su ejecución en la cola más prioritaria del procesador. En resumen, se analizaron 2 ejemplos en donde se podría producir inanición. Uno es aquel en el que llegan suficientes procesos donde finalizan su ejecución dentro del quantum asignado por la cola de mayor prioridad. El otro es aquel en el cual se atienden suficientes tareas del tipo interactivas que realizan IO antes de completar el quantum asignado, conservando así su lugar en la cola más prioritaria.