1. Programación basada en la prioridad con envejecimiento:
* El problema: Los procesos de alta prioridad pueden monopolizar continuamente los recursos, evitando que los procesos de menor prioridad tengan la oportunidad de correr y potencialmente causar hambre.
* La solución - Envejecimiento:
* Concepto: Con el tiempo, aumente la prioridad de los procesos que han estado esperando durante mucho tiempo para adquirir un recurso.
* Implementación: El sistema operativo incrementa periódicamente la prioridad de los procesos de espera. Esto asegura que incluso los procesos de baja prioridad eventualmente sean elegibles para funcionar.
* Ejemplo: Un proceso que espera el tiempo de la CPU podría tener su prioridad aumentada cada pocas marcas de reloj. Eventualmente, se convertirá en el proceso de mayor prioridad y se programará.
2. Cola justa y cola justa ponderada:
* El problema: Los procesos que solicitan el mismo recurso pueden recibir asignaciones impredecibles, potencialmente favoreciendo a algunos sobre otros repetidamente.
* La solución - cola justa:
* Concepto: Garantice a cada proceso una parte justa de un recurso con el tiempo.
* Implementación:
* Los procesos que esperan un recurso se colocan en una cola.
* El recurso se asigna a los procesos de manera justa, a menudo utilizando round-robin o algoritmos de programación similares.
* Cada proceso recibe una porción de tiempo (u otra cuota de recursos) antes de que otro proceso obtenga un giro.
* cola justa ponderada (WFQ):
* Concepto: Una variación de colas justas donde a cada proceso se le asigna un peso que determina su participación relativa del recurso.
* Implementación:
* Los procesos con pesos más altos reciben rebanadas proporcionalmente más grandes del recurso.
* Esto permite priorizar procesos importantes al tiempo que aún garantiza que otros procesos reciban algún acceso.
3. Asignación de recursos con prevención/evitación de punto muerto:
* El problema: El punto muerto puede conducir a la inanición. Si los procesos están atascados esperando los recursos de los demás, algunos pueden estar bloqueados indefinidamente. Incluso si el punto muerto está roto, los mismos procesos podrían ser elegidos repetidamente como víctimas, lo que lleva a la inanición.
* La solución:
* Prevención de punto muerto: Diseñe estructuralmente el sistema de asignación de recursos para eliminar las condiciones que causan un punto muerto. Esto podría involucrar:
* eliminación de exclusión mutua (generalmente no factible): Haga posible que los recursos sean utilizados por múltiples procesos simultáneamente.
* Hold and Wait Prevention: Requiere un proceso para solicitar todos sus recursos a la vez, o liberar todos los recursos retenidos antes de solicitar más.
* Sin preferencia: Permita que el sistema operativo elimine por la fuerza los recursos de un proceso (si el proceso posee un recurso que otro proceso necesita y está esperando otro recurso).
* Prevención de espera circular: Imponer un pedido total en los tipos de recursos y requiere que los procesos soliciten recursos en orden ascendente.
* Evitación de punto muerto: Monitoree dinámicamente el estado de asignación de recursos y evite asignar recursos si hacerlo podría conducir a un punto muerto. El algoritmo del banquero es un ejemplo común.
* Por qué esto ayuda al hambre: Al evitar los puntos de bloqueo, el sistema operativo asegura que los recursos finalmente se liberen y se pongan a disposición de los procesos de espera, reduciendo la probabilidad de bloqueo indefinido.
4. Sistemas basados en la reserva:
* El problema: Los procesos pueden ser superados continuamente por otros para el acceso a los recursos.
* La solución:
* Concepto: Permitir que los procesos reserven recursos por adelantado.
* Implementación:
* Un proceso puede solicitar una asignación garantizada de un recurso por un período específico.
* El sistema operativo asegura que el recurso esté disponible cuando el proceso lo necesita.
* Por qué esto ayuda al hambre: La reserva evita que un proceso se le niegue el acceso repetidamente porque no puede competir con las demandas inmediatas de otros procesos. Asegura un cierto nivel de servicio mínimo.
5. Programación de lotería:
* El problema: Los procesos pueden ser consistentemente desafortunados en los esquemas de asignación aleatoria.
* La solución:
* Concepto: Dé a los procesos "boletos de lotería" para un recurso. El sistema operativo selecciona aleatoriamente un ticket, y el proceso que contiene ese ticket obtiene el recurso.
* Implementación:
* A cada proceso se le asigna una serie de boletos proporcionales a su importancia o necesidad.
* El sistema operativo posee una lotería para determinar qué proceso obtiene el recurso.
* Por qué esto ayuda al hambre: Si bien todavía es posible que un proceso tenga mala suerte en una sola lotería, con el tiempo, los procesos con más boletos recibirán estadísticamente una mayor proporción del recurso, evitando la negación permanente del servicio. Cuantos más boletos tenga un proceso, mayor será la posibilidad de ganar. Incluso los procesos con pocos boletos tienen una posibilidad no cero de ganar, evitando el hambre completa.
6. Mecanismos de retroalimentación:
* El problema: Los algoritmos de programación estática pueden no adaptarse bien a las condiciones cambiantes del sistema.
* La solución:
* Concepto: Monitoree el rendimiento de los procesos y ajuste la asignación de recursos en consecuencia.
* Implementación:
* El sistema operativo rastrea cuánto tiempo los procesos han estado esperando recursos.
* Si un proceso ha estado esperando una cantidad de tiempo excesiva, el sistema operativo podría aumentar su prioridad, asignar más recursos o cambiar a un algoritmo de programación diferente.
* Por qué esto ayuda al hambre: Los mecanismos de retroalimentación permiten que el sistema operativo responda dinámicamente a las situaciones de inanición y tome medidas correctivas.
Consideraciones clave:
* Overhead: Todas estas soluciones vienen con algo de sobrecarga. La complejidad del algoritmo impacta el uso de la CPU, y el seguimiento de los tiempos de espera requiere memoria.
* Equidad vs. Eficiencia: A menudo, existe una compensación entre la equidad (prevenir el hambre) y la eficiencia general del sistema. Un sistema perfectamente justo podría no ser el más eficiente en términos de rendimiento.
* específico del contexto: El mejor enfoque para prevenir el hambre depende del recurso específico que se está asignando, la naturaleza de los procesos y los objetivos generales del sistema. Un sistema operativo (RTOS) en tiempo real tiene requisitos más estrictos que un sistema operativo de propósito general.
En resumen, los sistemas operativos emplean una variedad de técnicas, a menudo en combinación, para evitar el hambre y garantizar que todos los procesos eventualmente reciban los recursos que necesitan para completar sus tareas. La clave es equilibrar la justicia, la eficiencia y los requisitos específicos del sistema.