ocupado esperando


En informática e ingeniería de software , la espera ocupada , el bucle ocupado o el giro es una técnica en la que un proceso verifica repetidamente si una condición es verdadera, como si la entrada del teclado o un bloqueo están disponibles. El giro también se puede usar para generar un retraso de tiempo arbitrario, una técnica que era necesaria en los sistemas que carecían de un método para esperar un período de tiempo específico. Las velocidades del procesador varían mucho de una computadora a otra, especialmente porque algunos procesadores están diseñados para ajustar dinámicamente la velocidad según la carga de trabajo actual. [1]En consecuencia, girar como una técnica de retardo de tiempo puede producir resultados impredecibles o incluso inconsistentes en diferentes sistemas a menos que se incluya un código para determinar el tiempo que tarda un procesador en ejecutar un bucle de "no hacer nada" , o el código de bucle comprueba explícitamente un reloj en tiempo real .

En la mayoría de los casos, el giro se considera un antipatrón y debe evitarse, [2] ya que el tiempo del procesador que podría usarse para ejecutar una tarea diferente se desperdicia en actividades inútiles. Spinning puede ser una estrategia válida en determinadas circunstancias, sobre todo en la implementación de spinlocks dentro de los sistemas operativos diseñados para ejecutarse en sistemas SMP .

Los siguientes ejemplos de código C ilustran dos subprocesos que comparten un entero global i . El primer subproceso utiliza la espera ocupada para verificar un cambio en el valor de i :

La mayoría de los sistemas operativos y bibliotecas de subprocesos proporcionan una variedad de llamadas al sistema que bloquearán el proceso en un evento, como la adquisición de bloqueos, cambios de temporizador, disponibilidad de E/S o señales . El uso de tales llamadas generalmente produce el resultado más simple, eficiente, justo y libre de carreras . Una sola llamada verifica, informa al programador del evento que está esperando, inserta una barrera de memoria cuando corresponda y puede realizar una operación de E/S solicitada antes de regresar. Otros procesos pueden usar la CPU mientras la persona que llama está bloqueada. El programador recibe la información necesaria para implementar la herencia de prioridad u otros mecanismos para evitar la inanición.

La espera ocupada en sí misma se puede hacer mucho menos derrochadora mediante el uso de una función de retraso (por ejemplo, sleep()) que se encuentra en la mayoría de los sistemas operativos. Esto pone un subproceso en reposo durante un tiempo específico, durante el cual el subproceso no desperdiciará tiempo de CPU. Si el bucle está comprobando algo simple, pasará la mayor parte del tiempo dormido y desperdiciará muy poco tiempo de CPU.

En programas que nunca terminan (como los sistemas operativos), se puede implementar una espera infinitamente ocupada mediante saltos incondicionales, como se muestra en esta sintaxis de NASMjmp $ : . La CPU saltará incondicionalmente a su propia posición para siempre. Una espera ocupada como esta se puede reemplazar con: