HLT (instrucción x86)


En la arquitectura de computadora x86 , HLT(detener) es una instrucción en lenguaje ensamblador que detiene la unidad central de procesamiento (CPU) hasta que se dispara la siguiente interrupción externa . [1] Las interrupciones son señales enviadas por dispositivos de hardware a la CPU para alertarla de que ocurrió un evento al que debería reaccionar. Por ejemplo, los temporizadores de hardware envían interrupciones a la CPU a intervalos regulares.

La mayoría de los sistemas operativos ejecutan una HLTinstrucción cuando no hay trabajo inmediato por hacer, poniendo el procesador en un estado inactivo . En Windows NT , por ejemplo, esta instrucción se ejecuta en el " Proceso inactivo del sistema ". En procesadores x86, el código de operación de HLTes 0xF4.

Todos los procesadores x86 desde el 8086 en adelante tenían la HLTinstrucción, pero no fue utilizada por MS-DOS antes de 6.0 [2] y no fue diseñado específicamente para reducir el consumo de energía hasta el lanzamiento del procesador Intel DX4 en 1994. MS-DOS 6.0 proporcionó un POWER.EXE que se podía instalar en CONFIG.SYS y en las pruebas de Microsoft ahorró un 5%. [3] Algunos de los primeros chips DX de 100 MHz tenían un estado HLT defectuoso, lo que provocó que los desarrolladores de Linux implementaran una opción "no-hlt" para usar cuando se ejecutaban en esos chips, [4] pero esto se corrigió en chips posteriores.

Casi todos los conjuntos de instrucciones de los procesadores modernos incluyen una instrucción o modo de suspensión que detiene el procesador hasta que sea necesario realizar más trabajo. En los procesadores controlados por interrupciones, esta instrucción detiene la CPU hasta que se recibe una interrupción externa. En la mayoría de las arquitecturas, la ejecución de una instrucción de este tipo permite que el procesador reduzca significativamente el uso de energía y la producción de calor, razón por la cual se usa comúnmente en lugar de estar ocupado esperando a dormir y al ralentí. En la mayoría de los procesadores, detener (en lugar de hacer un bucle) también reduce la latencia de la siguiente interrupción.

Dado que la emisión de la HLTinstrucción requiere acceso al anillo 0 , solo se puede ejecutar mediante software de sistema privilegiado, como el kernel . Debido a esto, a menudo es una buena práctica en la programación de aplicaciones utilizar la interfaz de programación de aplicaciones (API) proporcionada para ese propósito por el sistema operativo cuando no se puede hacer más trabajo, como en Linux sched_yield(). [5] Esto se conoce como "ceder" al procesador. Esto permite que el programador del sistema operativo decida si se pueden ejecutar otros procesos; que no. Si cada proceso está inactivo o esperando, normalmente ejecutará una instrucción HLT para cortar el uso de energía hasta la próxima interrupción de hardware.