La serie ICL 2900 fue una gama de sistemas de computadoras mainframe anunciada por el fabricante británico International Computers Limited el 9 de octubre de 1974. La compañía había comenzado el desarrollo bajo el nombre de "New Range" inmediatamente después de su formación en 1968. La gama no fue diseñada para ser compatible con ninguna máquina anterior producida por la compañía, ni para ser compatible con las máquinas de ningún competidor: más bien, fue concebida como una opción sintética , que combinaba las mejores ideas disponibles de una variedad de fuentes.
En términos de marketing, la Serie 2900 fue reemplazada por la Serie 39 a mediados de la década de 1980; sin embargo, la Serie 39 fue esencialmente un nuevo conjunto de máquinas que implementaron la arquitectura de la Serie 2900, al igual que las máquinas ICL posteriores denominadas "Trimetra".
Cuando se formó ICL en 1968 como resultado de la fusión de International Computers and Tabulators (ICT) con English Electric Leo Marconi y Elliott Automation , la empresa consideró varias opciones para su futura línea de productos. Estas incluían mejoras en la Serie 1900 de ICT o en el Sistema 4 de English Electric , y un desarrollo basado en la Máquina de Lenguaje Básico de J. K. Iliffe . La opción finalmente seleccionada fue la llamada Opción Sintética : un nuevo diseño conceptualizado desde cero.
Como su nombre lo indica, el diseño estuvo influenciado por muchas fuentes, incluidas las máquinas ICL anteriores. El diseño de los mainframes de Burroughs fue influyente, aunque ICL rechazó el concepto de optimizar el diseño para un lenguaje de alto nivel. El sistema Multics proporcionó otras ideas, en particular en el área de protección. Sin embargo, la mayor influencia externa fue probablemente la máquina MU5 desarrollada en la Universidad de Manchester .
La arquitectura de la Serie 2900 utiliza el concepto de máquina virtual como el conjunto de recursos disponibles para un programa. El concepto de máquina virtual en la arquitectura de la Serie 2900 difiere del término que se utiliza en otros entornos . Debido a que cada programa se ejecuta en su propia máquina virtual, el concepto puede compararse con un proceso en otros sistemas operativos , mientras que el proceso de la Serie 2900 es más parecido a un hilo .
El recurso más obvio en una máquina virtual es el almacén virtual (memoria). Otros recursos incluyen periféricos, archivos y conexiones de red.
En una máquina virtual, el código puede ejecutarse en cualquiera de las dieciséis capas de protección, llamadas niveles de acceso (o niveles ACR, por el Registro de Control de Acceso que controla el mecanismo). Los niveles más privilegiados del código del sistema operativo (el núcleo ) operan en la misma máquina virtual que la aplicación del usuario, al igual que los niveles intermedios, como los subsistemas que implementan el acceso al almacén de archivos y la red. Las llamadas al sistema implican, por tanto, un cambio de nivel de protección, pero no una llamada costosa para invocar código en una máquina virtual diferente. Cada módulo de código se ejecuta en un nivel de acceso particular y puede invocar las funciones ofrecidas por el código de nivel inferior (más privilegiado), pero no tiene acceso directo a la memoria u otros recursos en ese nivel. Por tanto, la arquitectura ofrece un mecanismo de encapsulación integrado para garantizar la integridad del sistema.
Los segmentos de memoria se pueden compartir entre máquinas virtuales. Existen dos tipos de memoria compartida: segmentos públicos utilizados por el sistema operativo (que están presentes en todas las máquinas virtuales) y segmentos globales utilizados para datos compartidos a nivel de aplicación: este último mecanismo se utiliza solo cuando existe un requisito de aplicación para que dos máquinas virtuales se comuniquen. Por ejemplo, los segmentos de memoria global se utilizan para tablas de bloqueo de bases de datos. Hay instrucciones de semáforo de hardware disponibles para sincronizar el acceso a dichos segmentos. Una pequeña curiosidad es que dos máquinas virtuales que comparten un segmento global utilizan direcciones virtuales diferentes para las mismas ubicaciones de memoria, lo que significa que las direcciones virtuales no se pueden pasar de forma segura de una máquina virtual a otra.
El término utilizado en las máquinas de la serie ICL 2900 y la serie ICL 39 para la unidad central de procesamiento (CPU) es "Procesador de código de pedido" (OCP).
La arquitectura 2900 admite una pila de llamadas basada en hardware , lo que proporciona un vehículo eficiente para ejecutar programas de lenguaje de alto nivel, especialmente aquellos que permiten llamadas de función recursivas . Esta fue una decisión con visión de futuro en ese momento, porque se esperaba que los lenguajes de programación dominantes inicialmente fueran COBOL y FORTRAN . La arquitectura proporciona mecanismos integrados para realizar llamadas a procedimientos utilizando la pila y registros de propósito especial para direccionar la parte superior de la pila y la base del marco de pila actual.
Los datos fuera de la pila se direccionan normalmente a través de un descriptor . Se trata de una estructura de 64 bits que contiene una dirección virtual de 32 bits y 32 bits de información de control. La información de control identifica si el área que se está direccionando es código o datos; en el caso de los datos, el tamaño de los elementos direccionados (1, 8, 32, 64 o 128 bits); un indicador para indicar si se requiere una comprobación de límites de matriz de hardware; y varios otros refinamientos.
La dirección virtual de 32 bits comprende un número de segmento de 14 bits y un desplazamiento de 18 bits dentro del segmento.
El código de órdenes no es estrictamente parte de la arquitectura del 2900. Este hecho se ha aprovechado para emular otras máquinas mediante la microcodificación de sus conjuntos de instrucciones . Sin embargo, en la práctica, todas las máquinas de la serie 2900 implementan un código de órdenes o conjunto de instrucciones común, conocido como PLI (Primitive Level Interface). Este está diseñado principalmente como objetivo para los compiladores de lenguajes de alto nivel. Las máquinas más potentes, como el 2980 y el 2988, implementaban todas las instrucciones en hardware, mientras que las demás utilizaban firmware microcodificado.
Existen varios registros, cada uno diseñado para un propósito específico. Hay disponible un registro acumulador (ACC) para uso general y puede tener un tamaño de 32, 64 o 128 bits. El registro B se utiliza para indexar en matrices; el registro LNB (Local Name Base) apunta a la base del marco de pila actual, mientras que el registro SF (Stack Front) apunta a la "parte superior" móvil de la pila; el registro DR se utiliza para almacenar descriptores para direccionar en el montón, y así sucesivamente. También hay dos punteros de 32 bits a datos fuera de la pila; XNB (eXtra Name Base) y LTB (Linkage Table Base).
Los formatos de datos reconocidos por las instrucciones PLI incluyen enteros sin signo de 32 bits ; enteros en complemento a dos de 32 y 64 bits; coma flotante de 32, 64 y 128 bits; y decimal empaquetado de 32, 64 y 128 bits . Al contrario de la convención de C y UNIX, el valor booleano verdadero se representa como cero y falso se representa como menos uno. Las cadenas se almacenan como matrices de caracteres de 8 bits, codificadas convencionalmente en EBCDIC (aunque el EBCDIC de ICL tiene variaciones menores con respecto a la versión de IBM). Es posible utilizar ISO (esencialmente ASCII ) en lugar de EBCDIC estableciendo un bit de control en un registro privilegiado; entre otras cosas, esto afecta a ciertas instrucciones de conversión decimal.
Debido a que algunas de las instrucciones PLI, en particular las de llamada a procedimientos, son muy potentes (especialmente las llamadas al sistema), las velocidades de instrucción de la Serie 2900 no siempre son directamente comparables con las del hardware de la competencia. La literatura de marketing de ICL tendía a utilizar el concepto de "MIPS equivalente a IBM", que es la clasificación de MIPS de un mainframe IBM que logró el mismo rendimiento en las pruebas de rendimiento de la aplicación. Las eficiencias logradas por la arquitectura 2900, en particular la evitación de sobrecargas de llamadas al sistema, compensaron el rendimiento relativamente lento del hardware en bruto.
Las primeras máquinas anunciadas en la Serie 2900 fueron las 2980 y 2970. La 2980 permitía uno o dos procesadores de código de órdenes (OCP), cada uno operando hasta 3 millones de instrucciones por segundo, con memoria real configurable hasta 8 megabytes, con un tiempo de acceso de 500 nanosegundos.
El 2980 fue inicialmente el mainframe más potente de la gama New Range de ICL. Además de los OCP, estaba formado por un controlador de acceso múltiple de almacenamiento (SMAC) y uno o más controladores de acceso de almacenamiento (SAC), un controlador periférico general (GPC), uno o más controladores de archivos de disco (DFC) y un controlador de enlace de comunicaciones (CLC), junto con unidades de disco (una configuración típica tendría ocho unidades EDS 200), pletinas de cinta, una estación de operación (OPER), impresoras de línea y lectores de tarjetas. Podía ejecutar el sistema operativo ICL VME (VME/B, VME/K) o el sistema de acceso múltiple de Edimburgo (EMAS). Una configuración típica del 2980 costaría unos 2 millones de libras (equivalente a 16 millones de libras en 2023).
A diferencia del 2980, el 2970 y el posterior 2960 estaban microcodificados, lo que permitía la emulación de conjuntos de instrucciones como los de la antigua Serie 1900 o el Sistema 4.
Se construyó una máquina de la serie 2900 a partir de una serie de módulos funcionales, cada uno de ellos alojado en un gabinete independiente. Los dispositivos periféricos se conectaron mediante la interfaz primitiva de ICL (conjunto de conectores y cables) a un adaptador de puerto en el SMAC. Se empleó un direccionamiento lógico y se utilizó un esquema de grupo para identificar los componentes del sistema en términos de puertos, enlaces troncales y flujos.
Un Trunk era un nombre genérico y una dirección de hardware dentro de un Puerto al que se asignaría un controlador periférico. Un Trunk era un nombre genérico para un controlador para una serie de dispositivos Stream. Un Stream era el nombre genérico para el canal bajo el cual se podía hacer referencia a dispositivos periféricos individuales.
El proceso de arranque de la serie 2960 merece una mención especial: el OCP contenía un miniterminal OPER y una pletina de casete. Al arrancar, el OCP realizaba su carga inicial de programa (IPL) desde el dispositivo IPL designado. El código IPL proporcionaba los medios para que el OCP descubriera la configuración de hardware del sistema consultando los flujos, troncales y puertos para encontrar el dispositivo de arranque predeterminado o elegido manualmente para el conjunto de microcódigos y/o el sistema operativo que se iba a arrancar. Este proceso se denominaba GROPE o reconocimiento general de equipos periféricos. El método de carga de casete también permitía al personal de ingeniería cargar y ejecutar software de diagnóstico.
Las primeras máquinas fueron reemplazadas posteriormente por una familia de máquinas basadas en el diseño de gama media 2966, que era menos costoso de construir y utilizaba interconexiones en serie en lugar de paralelas . El 2966 se amplió en rendimiento hasta el 2988 y se redujo hasta el 2958, aumentado por versiones de doble procesador , para cubrir todo el rango de rendimiento. [2]