martes, 28 de junio de 2016

La tablet del Apolo XI


El otro día escuché a una persona maldecir su ordenador. Achacaba su lentitud para realizar una tarea a la escasa memoria que, según él, tenía el ordenador. Un gigabyte (un "giga") [1]. Durante las últimas décadas los ordenadores han crecido de modo imparable en prestaciones a la vez que reducido su tamaño (te puede interesar investigar sobre la ley de Moore -ver referencias al final-). Se han convertido en una parte más de muchos de nosotros (incluso podríamos decir que nos tienen esclavizados). La mayoría de hogares tienen uno, con acceso a Internet. Tienes un problema, no pasa nada, www.google.es y todo arreglado. Incluso el teléfono móvil, cuyo objetivo era la comunicación oral entre nosotros, se ha convertido en un potente centro de datos que nos permite acceder a infinidad de recursos cuando lo deseamos. 
Y asociado con toda esta revolución en la forma de comunicarnos está el incremento de los recursos hardware [2] solicitados por el software. El software quiere más, y más, y más... espacio de almacenamiento para datos, memoria, velocidad de procesador... Actualmente si nos ofrecen un ordenador con un gigabyte de memoria, pensaríamos que nos están estafando. Sin embargo, viajemos un poco en el tiempo...

Hace 25 años...
Estamos acostumbrados a que si tenemos algún problema, aparezca un simpático asistente cibernético por alguna esquina que nos ayude, o a realizar las cosas mediante sencillas pantallas que casi nos dicen que hacer: 'Siguiente','Cancelar'. Pero no siempre todo han sido pantallas táctiles con entornos gráficos. Sin irnos más lejos, hace 25 años el sistema operativo usado habitualmente en los ordenadores era el MSDOS. Arrancabamos el ordenador, aparecía un churro de mensajes muchas veces difíciles de entender y se quedaba detenido con el siguiente mensaje:    c:\>

Si era la primera vez que te enfrentabas a esto, podría ocurrir que el dialogo fuese complicado:
c:\> hola?
"hola?" no se reconoce como un comando interno o externo, programa o archivo por lotes ejecutable.
c:\> quiero escribir una carta
"quiero" no se reconoce como un comando interno o externo, programa o archivo por lotes ejecutable.
c:\> apagar
"apagar" no se reconoce como un comando interno o externo, programa o archivo por lotes ejecutable.
c:\> te odio
"te" no se reconoce como un comando interno o externo, programa o archivo por lotes ejecutable.
c:\> 
Por esta época la memoria se media en megabytes (para algunos, la mayoría lo hacíamos en kilobytes) y las pantallas empezaban a abandonar el monocromatismo (mayoritariamente eran en modo carácter, bastante parecido a como se veían en Matrix). Aún así, hubo una época aún más dura y complicada...
Hace 45 años...
20 de julio de 1969. 20:17:39 h UTC. En el centro de control de la NASA en Houston se recibe un mensaje: "Houston…aquí base Tranquilidad, el Águila ha alunizado". El hombre acababa de llegar con éxito a la Luna. Neil Armstrong y Buzz Aldrin habían logrado alunizar con éxito en su superficie, al sur del Mar de la Tranquilidad, y a unos noventa kilómetros al este de dos cráteres casi gemelos denominados Ritter y Sabine.
La misión Apolo XI iba equipada con un sistema computerizado conocido como AGC (Apollo Guidance Computer). Si consideráis obsoleto vuestro ordenador de un gigabyte de memoria, leed a continuación. Vamos a estudiar en detalle aquel sistema. 
El primer diseño del sistema AGC se remonta al año 1961. Fue realizado por el MIT (Massachusetts Institute of Technology) y el conocido como Bloque I estaba diseñado en tecnología de transistores. Poco después la tecnología avanzó, siendo posible rediseñarlo usando circuitos integrados. Así, se rediseñó el sistema, surgiendo el conocido como Bloque II, que sería el que en adelante se usaría para misiones tripuladas. El Bloque I quedó para misiones no tripuladas. Dado que la misión Apolo XI constaría de dos módulos para la tripulación (El módulo de Mando -en adelante CM- y el Módulo Lunar -en adelante LM-), iría equipado con dos ordenadores, uno para cada módulo. 
Evidentemente un viaje tripulado a la Luna era una aventura peligrosa. Aunque se pueda pensar que lo ideal es llevar un sistema redundante de ordenadores, de modo que el fallo de uno no pusiese en peligro la misión, ésto no fue así. Los motivos para descartar esta opción fueron que el centro de control en Houston sería el responsable de determinar en todo momento el vector posición y dirección [3] de la nave y que equipar con dicho sistema redundante tendría un impacto en el diseño de la misión: mayor consumo de energía, mayor peso y más espacio usado. Dado que el consumo de energía era un factor determinante para garantizar el éxito (imaginaros el drama que ocurre cuando nos quedamos sin batería en el smarthphone pero en el caso de estar en el espacio y que lo que se ha quedado sin batería es el sistema de soporte vital... -alguno le preocuparía más quedarse sin conexión al Twitter-), y que el espacio era escaso, no hubo sistemas redundantes.
El Hierro

Los dos ordenadores montados tanto en el CM como en el LM eran iguales. Sus dimensiones eran 61 x 32 x 15,5 centímetros, pesaban 40 kilogramos y consumían 70 W. Cada ordenador constaba de 2 bandejas, cada una de ellas iba equipada con 24 módulos, cada uno de los cuales incluía dos grupos de 60 paquetes conectados. Cada uno de estos paquetes incluía 2 puertas lógicas. Podéis ver rápidamente el "enorme" número de puertas lógicas disponibles para que el ordenador realizase sus tareas...
Cada bandeja tenía una función concreta. Así, mientras una de ellas se encargaba de incluir los circuitos lógicos, los interfaces necesarios y el control de suministro de la potencia eléctrica, la otra gestionaba la memoria, los dispositivos analógicos de las alarmas y el reloj para el procesado, con una velocidad de un megahertzio [4] (¿Te parecen ahora poco los 2 ó 3 gigahertzios que puede tener tu ordenador?). A todo esto, y con el objetivo de reducir el tamaño y peso, se añadió una unidad con un circuito dedicado exclusivamente a sumas, tales como incrementos en las direcciones de acceso a los registros, aritmética,...
El ordenador usaba para los datos un tamaño de palabra de 16 bits. Esto era novedoso respecto a los estándares de la época, que solía ser mayor, 24 bits o más. Puede ser impactante que un ordenador que iba a tomar decisiones críticas redujese el tamaño de las palabras que usase, y por lo tanto la precisión de los datos almacenados, pero el MIT tomó esta decisión por varios motivos. En primer lugar decidió que cuando fuese necesaria mayor precisión, uniría varias palabras. Por otro lado, la reducción del tamaño de la palabra simplificaba los circuitos, además de realizarse a mayor velocidad los cálculos.

El interface usado para que la tripulación pudiese interactuar con el ordenador se denominaba DSKY, e incluía una pantalla de tipo display vfd (vacuum fluorescent display, como el que usan algunos despertadores: nada de ventanitas tipo Windows, claro) y un teclado (como veis en la imagen, bastante básico, con menos teclas que una calculadora). También eran iguales tanto para el CM como el LM, y tenían una dimensión de 20 x 20 x 18 centímetros y un peso de 8 kilogramos.
En concreto, en el CM había dos DSKYs, uno en el panel principal de control y otro en la estación de navegación. Adicionalmente, en la estación de navegación existía un botón independiente del DSKY para notificar al ordenador que una estrella de referencia para la navegación había sido seleccionada.
El Bloque I fue por primera vez instalado en una nave en 1965, y posteriormente se empezó a usar el Bloque II, del que la empresa Raytheon fabricó 75, además de 138 DSKYs.
La memoria
La memoria de estos ordenadores, tal y como correspondía a la época, era escasa y era una fuente continua de problemas cara al desarrollo del software por las limitaciones que le imponía. Había dos tipos de memoria. Por un lado la borrable, que permitía modificar la información contenida, cara a manejar datos de operaciones intermedias, determinar la posición de la nave, llevar registro de las operaciones lógicas,... Y por otro lado estaba la memoria fija, que no se podía cambiar y que contenía los programas, y por lo tanto no se modificaba durante la misión.
En el diseño original, el MIT incluyó una memoria fija de 4096 palabras y una memoria borrable de 256 palabras. En 1963 se incrementó a 10240 palabras la fija y 1024 la borrable. Finalmente, cara a la misión del Apolo XI y ante las necesidades que se observaban para incrementar la seguridad, se aumentó hasta 36864 palabras la fija y 2048 la variable. ¿Ahora te parece poco 1 gigabyte de memoria para escribir una carta, cuando el Apolo XI para llegar a la Luna incluía en cada ordenador únicamente 76 kilobytes entre ambas memorias (Casi 14000 veces menos de memoria)? Conviene recordar que una SIM de teléfono móvil típica, donde almacenamos el PIN y nuestra agenda tiene 64 kilobytes. O sea, que estos ordenadores tenían poco más de memoria que un SIM de teléfono...
La memoria estaba construida en núcleos de ferrita, aunque la memoria fija tenía un diseño diferente. Mientras que en la memoria borrable, cada núcleo contenía únicamente un bit, la fija cada núcleo constaba de 64 espiras, que le permitían almacenar 4 palabras.

El "Windows" que viajaría a la Luna
El sistema operativo del AGC era un sistema basado en interrupciones por prioridad, de modo que siempre ejecutaba la tarea de máxima prioridad en la cola de tareas pendientes. Era capaz de manejar varias tareas simultáneamente y disponía de dos colas de tareas que lo alimentaban. Por un lado la parte correspondiente a la cola ejecutiva era capaz de ejecutar siete tareas a la vez y estaba destinada a las tareas más críticas y la pantalla del DSKY. Revisaba cada 20 milisegundos en la cola nuevas tareas que atender y si no encontraba ninguna, una tarea ficticia, conocida como DUMMY JOB se ejecutaba en modo continuo hasta la llegada de una nueva.
Por otra parte, la parte correspondiente a la cola de lista de espera se destinaba para tareas cortas que no requiriesen más de 4 milisegundos de tiempo. Si dicho tiempo se superaba, la tarea era enviada a la cola ejecutiva.
Un lenguaje de programación avanzado para la época
Una aventura como la conquista de la Luna hizo que se invirtiesen grandes cantidades de recursos. En aquella época, el lenguaje más empleado era el lenguaje ensamblador. El lenguaje ensamblador es un lenguaje de nivel superior al lenguaje máquina, en el cual se introduce directamente los datos interpretables por el ordenador. Este lenguaje era bastante más claro para el programador que el máquina, pero aún así, la NASA consideró que recaía demasiada responsabilidad en los programadores, cara a como interactuarían los programas con el ordenador diseñado por el MIT. Para simplificar la tarea, a la vez que reducir los posibles errores, el MIT desarrollo un lenguaje de más nivel, cuyos programas eran interpretados en tiempo de ejecución (se traducían a lenguaje máquina en el mismo instante en que se iban a ejecutar, no antes). Eran más lentos que los programas desarrollados en ensamblador, que no se necesitaban interpretación, pero el MIT logró el código ocupase menos, logrando ahorrar espacio al desarrollar los programas. Recordemos que había poca memoria y no se podía malgastar. 
En este nuevo lenguaje, las instrucciones tardaban de media dos ciclos en ejecutarse (sobre 24 milisegundos). El MIT incluyó un total de 128 instrucciones en el lenguaje, frente a las 11 que existían únicamente en el ensamblador (por ejemplo para sumar se usaba la instrucción ADD, y para multiplicar, se repetía las veces necesarias la instrucción ADD).

Los programas que se crearon se denominaron COLOSSUS para el instalado en el CM y LUMINARY para el instalado en el LM. en concreto, el COLOSSUS fue empleado por primera vez en 1968, en la misión Apolo VIII.
A medio camino entre la Tierra y la Luna no es buen lugar para que el "Windows" de tu nave espacial dé un "pantallazo azul". Dado que el software tenía que ser capaz de actuar ante posibles fallos y cuelgues, la programación incluía un programa encargado del reinicio del sistema. Los fallos más probables eran los fallos en el reloj (y por lo tanto la no correcta ejecución de las instrucciones, que se ejecutaban a golpe de ciclo del reloj), de alimentación eléctrica, en el sistema del control de interrupciones o en la gestión de la cola ejecutiva (que dejase de buscar nuevas tareas).

Cuando ocurría un fallo, el programa limpiaba registros, datos de salida y las alertas, y reiniciaba el sistema apuntando a una dirección de memoria concreta. A partir de dicha dirección, y siguiendo en orden creciente, se iba encontrando una secuencia de programas para dejar operativo de nuevo el sistema. Uno de los momentos en que se empleó dicho programa fue durante el alunizaje del Apolo XI. 
Se calcula que de media una misión completa a la Luna requería de 10.500 pulsaciones por parte de los astronautas. Puede parecer poco, pero dada la complejidad del sistema (a bordo iba un extenso manual de uso pues el sistema incluso con experiencia,  no era nada intuitivo -no tenían tecla de F1 ni Google para solucionar un error-) y el propio diseño del DSKY, suponía un enorme esfuerzo para la tripulación.

Es sorprendente ver como tres hombres lograron llegar hasta la Luna con unos ordenadores que eran poco más que las actuales calculadoras de bolsillo... y nos quejamos de que nuestros ordenadores, tablets o smarthphones son una birria.


Referencias
Sobre la misión Apolo XI:
- "20 de Julio". Cronología Astronómica
- "Exploración del espacio". Varios. Ed. Orbis
Sobre la arquitectura del hardware de los ordenadores:
- "Estructura y tecnología de Computadores". Dormido/Canto/Mira/Delgado. Ed. Sanz y Torres
- "Electrónica digital". Mira/Delgado/Dormido/Canto. Ed. Sanz y Torres
- "How Moore's Law Works". howstuffworks.com
Sobre los sistemas operativos y lenguajes de programación:
- "Sistemas operativos: teoría...". Aranda/Canto/de la Cruz/Dormido/Mañoso. Ed. Sanz y Torres
- "Lenguajes ensambladores". Varios. Ed. Paraninfo
- "Lenguajes de programación: diseño e implementación". Zelkowitz. Ed. Prentice Hall

Notas

[1] Un byte está formado por 8 bits (aunque puede estarlo también por 7). Un bit es la unidad básica de la información, pudiendo valer 0 ó 1. Un kilobyte son 1024 bytes. Un megabyte son 1024 kilobytes. Un gigabyte son 1025 megabytes. Una palabra (word) equivale generalmente a 2 bytes.
[2] Hardware hace referencia a la parte física del ordenador (principalmente CPU o unidad central de proceso, memoria, discos, unidades de entrada/salida y perifericos -impresoras, teclados, ratones, pantalla,...-), mientras que dentro del software quedaría incluido el sistema operativos, los programas y los datos.
[3] el vector posición viene dado por unas coordenadas donde situar un objeto respecto a un origen seleccionado, mientras que el vector dirección nos determina la dirección hacia donde se desplaza un objeto en relación a un origen dado.
[4] Un hertzio (Hz) equiva a un ciclo completo. Un kilohertzio (KHz) son 1000 hertzios. Un megahertzio (MHz) son 1000 kilohertzios. Un gigahertzio (GHz) son 1000 megahertzios. La unidad central de proceso usa un reloj que le marca en ciclos (hertzios) el procesado.

No hay comentarios:

Publicar un comentario en la entrada