Planificación mediante colas multinivel
# Planificación mediante colas multinivel

La planificación mediante colas multinivel es un algoritmo de planificación de procesos en un sistema operativo. Su objetivo es diferenciar entre distintos tipos de trabajos, para ello dividen la cola de procesos preparados en varias colas, una por cada tipo de trabajo, y no permiten el movimiento de los procesos entre las distintas colas.

Los algoritmos de colas multinivel realimentadas se basan en los algoritmos de colas multinivel, pero permiten el movimiento de los trabajos de unas colas a otras.

Las siglas MLQ y MLFQ son los acrónimos ingleses de multi level queues (colas multinivel) y multi level feedback queues (colas multinivel realimentadas).

## Planificación MLQ: colas multinivel.

Este algoritmo de planificación clasifica los procesos en diferentes grupos, de forma que podemos asignarlos a diferentes colas con distinta planificación para gestionarlos de la manera que realmente necesitan.

Los procesos se asignan permanentemente a una cola del sistema, generalmente en función de alguna propiedad del proceso, por ejemplo el tamaño de memoria, la prioridad del proceso o el tipo de proceso.

Por ejemplo, tenemos el grupo de procesos foreground (interactivos) y background (batch), que necesitan diferentes tiempos de respuesta. Cada uno de ellos estará gestionado en una cola distinta con un algoritmo de planificación distinto, por ejemplo la cola de procesos foreground con Round Robin, y la de procesos background con FCFS.

Además debe existir un criterio de planificación entre las colas. Puede ser de prioridad fija con requisa o sin requisa, o de prioridad variable con requisa o sin requisa.

En los algoritmos FCFS, SJF y aquellos que utilizan prioridades, un proceso puede permanecer en el procesador hasta que realice una entrada/salida o hasta que termine. Si no termina o no realiza ninguna entrada/salida, el proceso podría llegar a monopolizar la CPU. Para evitar este monopolio, el mecanismo de requisa permite que un proceso pueda ser expulsado del procesador.

El criterio de planificación suele implementarse como prioridad fija con expropiación que consiste en que no se puede ejecutar un proceso si hay algún otro en una cola más prioritaria. Y si un proceso se está ejecutando y llega otro proceso más prioritario que él, abandonará el procesador y se lo cederá al proceso con mayor prioridad.

Las características de esta política de planificación son:

* Es apropiativa, es decir si llega un proceso con mayor prioridad que el que se está ejecutando podrá expulsarle y apropiarse del procesador.
* Cada cola tendrá una prioridad interna, de acuerdo a su algoritmo de planificación. Y cuando un proceso entre en la cola, automáticamente se calculará su prioridad interna. Esto no afectará al funcionamiento global de las colas múltiples.
* El proceso que se ejecutará será el de mayor prioridad. Y si hubiera varios, se elegirá el mayor según las normas de las políticas de gestión correspondientes.

Si aplicamos la planificación apropiativa de prioridad fija al ejemplo anterior, la cola de procesos foreground será más prioritaria que la de procesos background. Mientras haya procesos en la cola de foreground, los de la cola de background no se podrán ejecutar.

Otra posibilidad sería realizar la expulsión con intervalos periódicos o quantum, repartiendo el tiempo entre las colas.

En resumen, este algoritmo se puede definir por los siguientes parámetros:

* El número de colas.
* El algoritmo de planificación de cada cola.
* El algoritmo de planificación entre las distintas colas.
* El método usado para determinar en qué cola se introducirá un proceso cuando haya que darle servicio.

cierto

## Planificación MLFQ: colas multinivel con realimentación.

El algoritmo de colas multinivel presenta baja carga de planificación pero es poco flexible.

Mediante la planificación con colas multinivel realimentadas, un proceso se puede mover de una cola a otra dependiendo de su comportamiento en tiempo de ejecución.

En las colas multinivel realimentadas se separan los procesos en grupos pero dependiendo de las características de su ráfaga de CPU. Los procesos con ráfagas cortas irán a una cola más prioritaria de procesos preparados que los procesos con ráfagas largas.

El funcionamiento de este algoritmo consiste en ejecutar los procesos de la cola de prioridad más alta, a continuación se pasan a ejecutar los procesos de la siguiente cola y así sucesivamente. Con esta distribución, los procesos con ráfagas cortas se ejecutarán de forma rápida sin necesidad de llegar muy lejos en la jerarquía de colas de listos. Mientras que los procesos con ráfagas largas irán degradándose gradualmente.

Para gestionar a los procesos de la forma más justa, es necesario conocer su longitud, si están limitados por entrada/salida o por el procesador, la memoria que van a necesitar, etc.

La forma óptima de atenderlos es:

* Establecer una preferencia para los trabajos más cortos y penalizar a los que se han estado ejecutando durante más tiempo.
* Favorecer a los trabajos limitados por entrada/salida, para mantener los recursos ocupados y dejar el procesador libre el mayor tiempo posible.

En general, a un proceso se le concede un tiempo T de permanencia en una cola, cuando lo supera, pasará a la cola inmediatamente inferior con menor prioridad, es decir, se disminuirá su prioridad en una unidad. La elección del valor que se le dará al tiempo T varía mucho de un sistema a otro, depende del número de procesos existentes, del tipo de procesos y del número de colas.

Se pueden usar mecanismos de envejecimiento para evitar el bloqueo indefinido de un proceso, estos mecanismos consisten en incrementar la prioridad de los procesos que estén demasiado tiempo esperando en una cola de prioridad baja, para pasarlos a una cola de prioridad más alta y que se puedan ejecutar antes.

En resumen, este algoritmo se puede definir por los siguientes parámetros:

* El número de colas.
* El algoritmo de planificación de cada cola.
* El algoritmo de planificación entre las distintas colas.
* El método usado para determinar cuándo pasar un proceso a una cola de prioridad más alta.
* El método usado para determinar cuándo pasar un proceso a una cola de prioridad más baja.
* El método usado para determinar en qué cola se introducirá un proceso cuando haya que darle servicio.
