|
@@ -5,29 +5,45 @@ Ejercicio 9
|
|
|
|
|
|
|
|
## Descripción del algoritmo
|
|
## Descripción del algoritmo
|
|
|
|
|
|
|
|
-Este scheduler intenta alcanzar un balance entre throughput (para tareas con uso alto de recursos) y bajo waiting time (para tareas con poco uso de recursos y mucho IO).
|
|
|
|
|
-Las tareas priorizadas usan el CPU poco tiempo, por lo que es bueno reducir el waiting time para dar respuesta rápida.
|
|
|
|
|
-Las otras tareas requieren más recursos, por lo que no les afecta un waiting time mayor si eso significa obtener mas quantum.
|
|
|
|
|
|
|
+Este scheduler intenta alcanzar un balance entre las tareas con alto uso de recursos y
|
|
|
|
|
+tareas con poco uso de recursos y mucho IO, garantizando mayor CPU a las primeras y un
|
|
|
|
|
+menor waiting time para las segundas. Las tareas con menor prioridad tendrán más rápido acceso
|
|
|
|
|
+al CPU pero por menos tiempo, reduciendo el waiting time y dando una respuesta más rápida. Por
|
|
|
|
|
+otro lado las tareas que requieran más recursos, tendrán menos prioridad para acceder al CPU
|
|
|
|
|
+pero a cambio de esto se les asignará más **Quantum** empeorando su **waiting time** pero
|
|
|
|
|
+mejorando el throughput.
|
|
|
|
|
|
|
|
## Implementacion
|
|
## Implementacion
|
|
|
Para la implementación de este ejercicio utilizando:
|
|
Para la implementación de este ejercicio utilizando:
|
|
|
|
|
|
|
|
-`Map<pid, process>`
|
|
|
|
|
-En dicho `Map` se almacena un descriptor `struct` con datos del proceso actual como: _pid_, _state_ y *quantum_count*, a los que se accede utilizando el _pid_ como clave.
|
|
|
|
|
-
|
|
|
|
|
-`vector<queue<pid>>`
|
|
|
|
|
-En este `vector` se almacenan las distintas colas de ejecución, en las mismas se almacena solo el `pid` para poder luego consultarlo en el mapa si es necesario accederlo.
|
|
|
|
|
-
|
|
|
|
|
-`vector<uint>`
|
|
|
|
|
-Este vector tiene el mismo tamaño que el vector utilizado anteriormente y se utiliza para almacenar el cuantum correspondiente al índice de cada cola. Por ejemplo la cola en la posición *0* del arreglo de colas tiene el quantum almacenado en la posición *0* de este arreglo.
|
|
|
|
|
-
|
|
|
|
|
-Esto nos permite poder mantener cada cola de prioridad con los PIDs que tiene asignados e ir pasandolos de cola en cola sin tener que migrar todos los datos del proceso, ya que al mismo se accede por su PID mientras se encuentre en ejecución.
|
|
|
|
|
-
|
|
|
|
|
-En el constructor del scheduler se lee la cantidad de parámetros, con esto se inicializan los dos vectores (con las colas y los quantums) y se almacena el quantum correspondiente a cada cola segun el orden en el que se reciben. (Esto le da la 'prioridad' a cada cola).
|
|
|
|
|
-
|
|
|
|
|
-Cada vez que se carga un nuevo proceso, el mismo se aloja en la cola de mayor prioridad (La cola en la posición *0*).
|
|
|
|
|
-Al haber un _tick_ se controla que no se haya cumplido el _quantum_ establecido para dicha cola, si se cumplió se lo intenta mover a una cola de menor prioridad *(número más alto)* y se marca como READY.
|
|
|
|
|
-Al haber un _unblock_ se intenta 'premiar' a la tarea (que no utilizó completamente su quantum antes de ser desalojada), moviéndola a una cola de mayor prioridad.
|
|
|
|
|
|
|
+- `Map<pid, process>`: En dicho `Map` se almacena un descriptor `struct` con datos del
|
|
|
|
|
+proceso actual como: _pid_, _state_ y *quantum_count*, a los que se accede utilizando
|
|
|
|
|
+el _pid_ como clave.
|
|
|
|
|
+
|
|
|
|
|
+- `vector<queue<pid>>`: En este `vector` se almacenan las distintas colas de ejecución,
|
|
|
|
|
+en las mismas se almacena solo el `pid` para poder luego consultarlo en el mapa si es
|
|
|
|
|
+necesario accederlo.
|
|
|
|
|
+
|
|
|
|
|
+- `vector<uint>`: Este vector tiene el mismo tamaño que el vector utilizado anteriormente
|
|
|
|
|
+y se utiliza para almacenar el cuantum correspondiente al índice de cada cola. Por ejemplo
|
|
|
|
|
+la cola en la posición *0* del arreglo de colas tiene el quantum almacenado en la posición *0*
|
|
|
|
|
+de este arreglo.
|
|
|
|
|
+
|
|
|
|
|
+Esto nos permite poder mantener cada cola de prioridad con los PIDs que tiene asignados e ir
|
|
|
|
|
+pasandolos de cola en cola sin tener que migrar todos los datos del proceso, ya que al mismo se
|
|
|
|
|
+accede por su PID mientras se encuentre en ejecución.
|
|
|
|
|
+
|
|
|
|
|
+En el constructor del scheduler se lee la cantidad de parámetros, con esto se inicializan los
|
|
|
|
|
+dos vectores (con las colas y los quantums) y se almacena el quantum correspondiente a cada
|
|
|
|
|
+cola segun el orden en el que se reciben. (Esto le da la 'prioridad' a cada cola).
|
|
|
|
|
+
|
|
|
|
|
+Cada vez que se carga un nuevo proceso, el mismo se aloja en la cola de mayor prioridad
|
|
|
|
|
+(La cola en la posición *0*).
|
|
|
|
|
+Al haber un _tick_ se controla que no se haya cumplido el _quantum_ establecido para dicha
|
|
|
|
|
+cola, si se cumplió se lo intenta mover a una cola de menor prioridad *(número más alto)* y
|
|
|
|
|
+se marca como READY.
|
|
|
|
|
+Al haber un _unblock_ se intenta 'premiar' a la tarea (que no utilizó completamente su quantum
|
|
|
|
|
+antes de ser desalojada), moviéndola a una cola de mayor prioridad.
|
|
|
|
|
|
|
|
|
|
|
|
|
## Casos de prueba
|
|
## Casos de prueba
|