Un problema importante con los algoritmos de programación prioritarios es el bloqueo indefinido o la inanición. ¿Puede explicar el concepto de inanición y cómo a menudo se resuelve en la programación de prioridades?

La programación de prioridad absoluta dará tiempo de CPU a la operación de mayor prioridad que esté lista para ejecutarse. El hambre ocurre cuando a la máquina se le ha dado demasiado trabajo y no queda tiempo para algunas de las operaciones de menor prioridad. La causa más común (en mi experiencia) de esto es que algunas operaciones desperdician el tiempo del procesador a la espera de un trabajo real, con una programación prioritaria, es importante que cada proceso ‘Bloquee’ (espere algo, dando tiempo a otros procesos) cuando no tiene trabajo real que hacer.

Si la inanición no es causada por eso, sino por tener demasiado trabajo por hacer, entonces las únicas soluciones son reducir la cantidad de trabajo que hay que hacer o aumentar la potencia del procesador. Un parche que se puede hacer es aumentar artificialmente la prioridad de las operaciones que no han tenido tiempo por un tiempo.

La inanición no ocurre en los sistemas operativos ‘normales’ porque, en lugar de siempre dar tiempo a la operación de ‘máxima prioridad’, comparten el tiempo con todas las operaciones disponibles, tal vez dando más tiempo a los marcados como importantes y menos a los marcados como no importantes. En dicho sistema, cuando está ‘sobrecargado’, las cosas simplemente se ejecutan lentamente.

El propósito de la Programación prioritaria es que tenga algunas operaciones que, cuando tienen algo que hacer, DEBEN hacerlo rápidamente, por lo que se les da una alta prioridad.

Tiene una cola prioritaria en la que está procesando trabajos, que alcanza el estado estable.
Tiene un flujo constante de trabajos entrantes de alta prioridad.
Puede procesar y mantenerse EXACTAMENTE con esta transmisión entrante.

Si puede procesar más rápido de lo que llegan, eventualmente los vaciará y se ejecutará el trabajo de baja prioridad. No hay hambre a la larga. Esto podría ser por mucho tiempo.

Si solo procesas más lento de lo que llegan, se acumulan hasta el infinito hasta que te quedas sin memoria para guardar todos los trabajos entrantes … y te cuelgas. Tenga en cuenta que si hace que el tamaño de la cola sea fijo y rechace los trabajos cuando están llenos (es decir, “bloqueando”), no puede hacer los cálculos de prioridad en el trabajo entrante (es decir, ya no es una cola de prioridad).

Si puede procesar exactamente tan rápido como entran, entonces los trabajos de menor prioridad NUNCA tendrán la oportunidad de ejecutarse; siempre hay un trabajo de alta prioridad por delante.

Así que imagina que te diriges al Departamento de Vehículos Motorizados para obtener algunos documentos. No hizo una cita, tiene BAJA prioridad. Usted llega y ve a 100 personas en la línea de ALTA prioridad (personas que hicieron una cita) y 100 personas en la línea de prioridad BAJA. Después de una tediosa hora de observación, te das cuenta de que la línea de ALTA prioridad no se ha reducido, simplemente ha cambiado de miembro. ¿Es esa “inanición” de la línea BAJA? ¿O simplemente la naturaleza explosiva (para las cuales las colas son la respuesta natural) del negocio del DMV? Por lo tanto, espera hasta las 5 p.m., y la línea de ALTA prioridad sigue siendo de 100 personas, también lo es la línea BAJA (personas muy pacientes), y la BAJA no se ha movido. ¿Ya es “hambre”? O simplemente la naturaleza explosiva aún … Ahora el DMV cierra las puertas a las personas nuevas, pero procesa a las personas existentes. Eventualmente te sirven alrededor de las 6 pm … así que claramente no es hambre (técnicamente), sino una muy, muy larga espera.
Espero que hayas aprendido una lección (¡sobre programar con anticipación con el DMV!). 🙂

Ah, y la parte de la pregunta “¿cómo se resuelve?”

(1) El servidor se mantiene al día, los tiempos de espera son bajos y a nadie le importa.
(1a) El servidor apenas sigue el ritmo, los tiempos de espera son enormes y hay muchos gritos, pero eventualmente todos son atendidos (tal vez después de que la mayoría de las personas se hayan acostado).
(2) El servidor se ejecuta detrás y el sistema se bloquea (OOM) o succiona mal (los bloques y los trabajos de alta prioridad se caen o se bloquean) y luego se arregla (es decir, esta es una situación temporal).
(3) Las personas con prioridad BAJA tienen su prioridad aumentada después de un período de espera suficientemente largo. Entonces, en realidad, el algoritmo de prioridad incluye una función de tiempo.

Acantilado

Solo una adición a las otras respuestas: ciertos programadores tienen una prioridad normal y estática, así como una prioridad dinámica. La prioridad dinámica comienza desde la estática, aumenta si el hilo está enlazado a E / S y disminuye si está enlazado a la CPU (por supuesto, dentro de ciertos límites). La prioridad dinámica es la que obedece la cola de prioridad.