En ingeniería informática , las ventanas de registro son una característica en algunas arquitecturas de conjuntos de instrucciones para mejorar el rendimiento de las llamadas a procedimientos , una operación muy común. Las ventanas de registro fueron una de las características principales del diseño RISC de Berkeley , que luego se comercializaría como AMD Am29000 , Intel i960 , Sun Microsystems SPARC e Intel Itanium .
Contexto
La mayoría de los diseños de CPU incluyen una pequeña cantidad de memoria de muy alta velocidad conocida como registros . La CPU utiliza los registros para mantener valores temporales mientras se trabaja en cadenas de instrucciones más largas. Se puede agregar un rendimiento considerable a un diseño con más registros. Sin embargo, dado que los registros son una parte visible del conjunto de instrucciones de la CPU , el número normalmente no se puede cambiar una vez que se ha publicado el diseño.
Si bien los registros son casi una solución universal para el rendimiento, tienen un inconveniente. Las diferentes partes de un programa de computadora usan sus propios valores temporales y, por lo tanto, compiten por el uso de los registros. Dado que es muy difícil comprender bien la naturaleza del flujo del programa en tiempo de ejecución , no hay una manera fácil para que el desarrollador sepa de antemano cuántos registros deben usar y cuántos deben dejar de lado para otras partes del programa. En general, este tipo de consideraciones se ignoran y los desarrolladores, y más probablemente, los compiladores que utilizan, intentan utilizar todos los registros visibles para ellos. En el caso de procesadores con muy pocos registros para empezar, este también es el único curso de acción razonable.
Implementación
Las ventanas de registro tienen como objetivo resolver este problema. Dado que cada parte de un programa quiere registros para su propio uso, se proporcionan varios conjuntos de registros para las diferentes partes del programa. Si estos registros fueran visibles, habría más registros por los que competir, es decir, tendrían que hacerse invisibles.
Hacer que los registros sean invisibles se puede implementar de manera eficiente; la CPU reconoce el movimiento de una parte del programa a otra durante una llamada a procedimiento. Se logra mediante una de unas pocas instrucciones ( prólogo ) y termina con una de un conjunto igualmente pequeño ( epílogo ) . En el diseño de Berkeley, estas llamadas harían que un nuevo conjunto de registros se "intercambiara" en ese punto, o que se marcaran como "muertos" (o "reutilizables") cuando finalizaba la llamada.
Aplicación en CPU
En el diseño RISC de Berkeley, solo ocho registros de un total de 64 son visibles para los programas. El conjunto completo de registros se conoce como archivo de registro y cualquier conjunto particular de ocho como ventana . El archivo permite que hasta ocho llamadas de procedimiento tengan sus propios conjuntos de registros. Siempre que el programa no invoque cadenas de más de ocho llamadas de profundidad, los registros nunca tienen que desbordarse , es decir, guardarse en la memoria principal o en la caché, que es un proceso lento en comparación con el acceso a los registros.
En comparación, la arquitectura SPARC de Sun Microsystems proporciona visibilidad simultánea de cuatro conjuntos de ocho registros cada uno. Tres conjuntos de ocho registros cada uno tienen "ventana". Ocho registros (i0 a i7) forman los registros de entrada al nivel de procedimiento actual. Ocho registros (L0 a L7) son locales al nivel de procedimiento actual, y ocho registros (o0 a o7) son las salidas del nivel de procedimiento actual al siguiente nivel llamado. Cuando se llama a un procedimiento, la ventana de registro se desplaza en dieciséis registros, ocultando los registros de entrada antiguos y los registros locales antiguos y haciendo que los registros de salida antiguos sean los nuevos registros de entrada. Los registros comunes (registros de salida antiguos y registros de entrada nuevos) se utilizan para el paso de parámetros. Finalmente, ocho registros (g0 a g7) son globalmente visibles para todos los niveles de procedimiento.
El AMD 29000 mejoró el diseño al permitir que las ventanas sean de tamaño variable, lo que ayuda a la utilización en el caso común donde se necesitan menos de ocho registros para una llamada. También separó los registros en un conjunto global de 64 y 128 adicionales para las ventanas. De manera similar, la arquitectura IA-64 (Itanium) utilizó ventanas de tamaño variable, con 32 registros globales y 96 para las ventanas.
En la arquitectura Infineon C166 , la mayoría de los registros son simplemente ubicaciones en la RAM interna que tienen la propiedad adicional de ser accesibles como registros. De estos, las direcciones de los 16 registros de propósito general (R0-R15) no son fijas. En cambio, el registro R0 está ubicado en la dirección apuntada por el registro "Context Pointer" (CP), y los 15 registros restantes siguen secuencialmente a partir de entonces. [1]
Las ventanas de registro también proporcionan una ruta de actualización sencilla. Dado que los registros adicionales son invisibles para los programas, se pueden agregar ventanas adicionales en cualquier momento. Por ejemplo, el uso de programación orientada a objetos a menudo da como resultado un mayor número de llamadas "más pequeñas", que se pueden acomodar aumentando las ventanas de ocho a dieciséis, por ejemplo. Este fue el enfoque utilizado en SPARC, que ha incluido más ventanas de registro con las nuevas generaciones de la arquitectura. El resultado final es menos operaciones lentas de derrame y llenado de ventanas de registro porque las ventanas de registro se desbordan con menos frecuencia.
Crítica
Las ventanas de registro no son la única forma de mejorar el rendimiento del registro. El grupo de la Universidad de Stanford que diseñó el MIPS vio el trabajo de Berkeley y decidió que el problema no era la escasez de registros, sino la mala utilización de los existentes. En cambio, invirtieron más tiempo en la asignación de registros de su compilador , asegurándose de que utilizaran sabiamente el conjunto más grande disponible en MIPS. Esto resultó en una complejidad reducida del chip, con la mitad del número total de registros, al tiempo que ofrece un rendimiento potencialmente mayor en aquellos casos en los que un solo procedimiento podría hacer uso del mayor espacio de registro visible. Al final, con los compiladores modernos, MIPS hace un mejor uso de su espacio de registro incluso durante las llamadas a procedimientos. [ cita requerida ]
Referencias
- ^ "Manual del conjunto de instrucciones de la familia Infineon C166" (PDF) . Keil . Consultado el 12 de marzo de 2020 .
- Frantzen, Mike; Shuey, Mike (2001). "StackGhost: protección de pila facilitada por hardware" . Actas del X Simposio de Seguridad de Usenix . USENIX . págs. 55–66 . Consultado el 27 de agosto de 2010 .
- Magnusson, Peter (abril de 1997). "Comprensión de pilas y registros en la arquitectura (s) Sparc" . Archivado desde el original el 24 de diciembre de 2012 . Consultado el 27 de agosto de 2010 .
- Mueller, Frank. "setjmp / longjmp" . Discutiendo la compleja implementación de Sparc debido a las ventanas.