CAPÍTULO 2 EVOLUCION DE LOS COMPUTADORES Y PRESTACIONES Ing. Gabriel Reynaldo Sirpa Huayhua INTRODUCCIÓN Este capítulo describe las generalidades sobre la familia de microprocesadores Intel. Se incluye una discusión sobre la historia de las computadoras y la función del microprocesador en el sistema de computadora basado en microprocesador. En este capítulo explicaremos con detalle cómo se almacenan los datos en la memoria, de manera que se pueda utilizar cada tipo de datos a medida que se vaya desarrollando el software. ANTECEDENTES HISTÓRICOS En esta primera sección describiremos los eventos históricos que produjeron el desarrollo del microprocesador y específicamente, los extremadamente poderosos y actuales microprocesadores 80X86. Aunque no es esencial un estudio de la historia para comprender el funcionamiento del microprocesador, sirve como lectura de interés y proporciona una perspectiva histórica de la rápida evolución de la computadora. LA ERA MECÁNICA La idea de un sistema computacional no es nueva; ya existía mucho antes de que se desarrollaran los dispositivos eléctricos y electrónicos modernos. La idea de realizar cálculos con una máquina se remonta hasta el año 500 a.C., cuando los babilonios inventaron el ábaco, la primera calculadora mecánica. El ábaco tiene hileras de cuentas con las que se realizan los cálculos. Los sacerdotes de Babilonia lo utilizaban para llevar la cuenta de sus vastos almacenes de grano. El ábaco, que aún se utiliza en la actualidad, se mejoró hasta 1642 cuando el matemático Blaise Pascal inventó una calculadora construida con base en engranajes y ruedas. Cada engranaje contenía 10 dientes que, cuando se movían una vuelta completa, hacían que un segundo engranaje avanzara una posición. Éste es el mismo principio que se utiliza en el mecanismo del odómetro de un automóvil y es la base de todas las calculadoras mecánicas. De hecho, el lenguaje de programación PASCAL se nombra así en honor de Blaise Pascal, por su trabajo pionero en las matemáticas y con la calculadora mecánica. LA ERA ELÉCTRICA La década de 1800 fue testigo de la llegada del motor eléctrico (concebido por Michael Faraday) con lo cual surgió una multitud de máquinas de sumar controladas por motores, todas basadas en la calculadora mecánica desarrollada por Blaise Pascal. Estas calculadoras mecánicas controladas en forma eléctrica no fueron piezas comunes del equipo de oficina sino hasta principios de la década de 1970, cuando apareció la pequeña calculadora electrónica portátil, introducida por primera vez por Bomar Corporation y llamada el Cerebro Bomar. Monroe fue también un pionero líder de las calculadoras electrónicas, pero sus máquinas eran modelos de escritorio de 4 funciones, del tamaño de cajas registradoras. En 1889 Herman Hollerith desarrolló la tarjeta perforada para almacenar datos. Al igual que Babbage, aparentemente él también tomó prestada la idea de una tarjeta perforada de Jacquard. También desarrolló un equipo mecánico (controlado por uno de los nuevos motores eléctricos) que contaba, ordenaba y cotejaba información almacenada en tarjetas perforadas. La idea de calcular mediante maquinaria intrigó tanto al gobierno de los EE.UU. que Hollerith fue comisionado para utilizar su sistema de tarjetas perforadas para almacenar y tabular información para el censo de 1890. Recientemente se descubrió (por medio de la desclasificación de documentos militares de los ingleses) que la primera computadora electrónica se puso en operación en 1943 para quebrantar los códigos militares secretos de los alemanes. Este primer sistema computacional electrónico, que utilizaba tubos al vacío, fue inventado por Alan Turing, quien llamó a su máquina Colossus, probablemente por su tamaño. Un problema con Colossus fue que, aunque su diseño le permitía quebrantar códigos militares secretos de los alemanes, generados por la máquina Enigma mecánica, no podía resolver otros problemas. Colossus no era programable; era un sistema computacional de programa fijo, lo que se conoce actualmente como una computadora de propósito especial. El primer sistema computacional electrónico programable de propósito general se desarrolló en 1946, en la Universidad de Pensilvania. Esta computadora moderna se llamó ENIAC (Calculadora e Integradora Numérica Electrónica). La ENIAC era una máquina enorme que contenía más de 17,000 tubos al vacío y más de 500 millas de cables. Esta máquina pesaba más de 30 toneladas y realizaba sólo aproximadamente 100,000 operaciones por segundo. La ENIAC llevó al mundo a la era de las computadoras electrónicas. Se programaba cambiando el cableado de sus circuitos; un proceso que tomaba a muchos trabajadores varios días en completarlo. Los trabajadores cambiaban las conexiones eléctricas en tableros de conexiones que tenían una apariencia como la de los conmutadores telefónicos. Otro problema con la ENIAC era la vida de los componentes de tubos al vacío, que requerían de un mantenimiento frecuente. Los descubrimientos posteriores fueron el desarrollo del transistor, en diciembre 23 de 1947, en los laboratorios Bell por John Bardeen, William Shockley y Walter Brattain. Después le siguió, en 1958, la invención del circuito integrado por Jack Kilby de Texas Instruments. El circuito integrado condujo al desarrollo de los circuitos integrados digitales (RTL, o lógica de resistencia a transistor) en la década de 1960 y al primer microprocesador en Intel Corporation en 1971. En ese tiempo, los ingenieros de Intel Federico Faggin, Ted Hoff y Stan Mazor desarrollaron el microprocesador 4004 (Patente de los E.U. 3,821,715); el dispositivo que empezó la revolución de los microprocesadores, el cual continúa actualmente a un ritmo cada vez más acelerado. AVANCES EN LA PROGRAMACIÓN Una vez desarrolladas las máquinas programables, empezaron a aparecer los programas y los lenguajes de programación. Como se mencionó anteriormente, el primer sistema computacional electrónico programable se programaba volviendo a cablear sus circuitos. Como esto era demasiado laborioso para una aplicación práctica, en la primera etapa de la evolución de los sistemas computacionales comenzaron a aparecer los lenguajes computacionales para controlar la computadora. El primer lenguaje de ese tipo, el lenguaje máquina, estaba compuesto de unos y ceros y utilizaba códigos binarios almacenados en el sistema de memoria computacional como grupos de instrucciones, a lo cual se le llamaba programa. Esto era más eficiente que volver a cablear una máquina para programarla, pero aún requería de mucho tiempo el desarrollar un programa debido al número total de códigos requeridos. El matemático John von Neumann fue la primera persona en desarrollar un sistema que aceptaba instrucciones y las almacenaba en memoria. A menudo a las computadoras se les llama máquinas de von Neumann en honor de John von Neumann. Una vez que estuvieron disponibles los sistemas computacionales tales como el UNIVAC, a principios de la década de 1950, se utilizó el lenguaje ensamblador para simplificar la tarea de introducir código binario en una computadora como sus instrucciones. El ensamblador permite al programador utilizar códigos nemónicos en inglés, como ADD para la suma, en lugar de un número binario tal como 0100 0111. Aunque el lenguaje ensamblador era una ayuda para la programación, no fue sino hasta 1957 cuando Grace Hopper desarrolló el primer lenguaje de programación de alto nivel llamado FLOWMATIC, que las computadoras se hicieron más fáciles de programar. En el mismo año, IBM desarrolló el lenguaje FORTRAN (FORmula TRANslator – Traductor de fórmulas) para sus sistemas computacionales. Este lenguaje permitía a los programadores desarrollar programas que utilizaran fórmulas para resolver problemas matemáticos. FORTRAN es utilizado aún por algunos científicos para la programación de computadoras. Otro lenguaje similar, introducido un año después de FORTRAN, fue ALGOL (ALGOrithmic Language –Lenguaje algorítmico). El primer lenguaje de programación verdaderamente exitoso y de amplio uso para las aplicaciones comerciales fue COBOL (COmputer Business Oriented Language – Lenguaje computacional orientado a los negocios). Aunque el uso del COBOL ha diminuido de manera considerable en la actualidad, aún juega un papel importante en muchos sistemas comerciales extensos. Otro lenguaje de negocios que una vez fue popular es RPG (Report Program Generator –Generador de programas de reportes), el cual permite la programación especificando la forma de la entrada, la salida y los cálculos. Desde los primeros días de programación han aparecido varios lenguajes adicionales. Algunos de los más comunes son BASIC, Java, C#, C/C++, PASCAL y ADA. Los lenguajes BASIC y PASCAL se diseñaron como lenguajes de enseñanza, pero han escapado del salón de clases y se utilizan en muchos sistemas computacionales. El lenguaje BASIC es probablemente el más fácil de aprender. Algunas estimaciones indican que el lenguaje BASIC se utiliza en la computadora personal en el 80% de los programas escritos por los usuarios. En la década pasada una nueva versión de BASIC, llamada Visual BASIC, ha facilitado la programación en el entorno Windows. El lenguaje Visual BASIC puede eventualmente suplantar a C/C++ y PASCAL como un lenguaje científico, pero eso es dudoso. En la comunidad científica, C/C++ y en ocasiones PASCAL y FORTRAN aparecen como programas de control. Estos lenguajes, en especial C/C++, permiten al programador un control casi completo sobre el entorno de programación y el sistema computacional. En muchos casos, C/C++ está sustituyendo a varios de los controladores o del software de control de máquina de bajo nivel, reservados normalmente para el lenguaje ensamblador. Aún así, el lenguaje ensamblador sigue jugando un papel importante en la programación. La mayoría de los videojuegos para la computadora personal están escritos casi de manera exclusiva en lenguaje ensamblador. Este lenguaje también se entremezcla con C/C++ y PASCAL para realizar las funciones de control de la máquina eficientemente. LA ERA DEL MICROPROCESADOR El primer microprocesador en el mundo, fue Intel 4004, era de 4 bits; un controlador programable en un chip. Podía direccionar tan solo 4096 posiciones de memoria de 4 bits. (Un bit es un dígito binario con un valor de uno o cero). El conjunto de instrucciones del 4004 contenía solamente 45 instrucciones. Estaba fabricado con la tecnología MOSFET de canal P (que en ese entonces era la más avanzada) que sólo le permitía ejecutar instrucciones a una lenta velocidad de 50 KIPs (kilo instrucciones por segundo). Esto era lento si se le comparaba con las 100,000 instrucciones ejecutadas por segundo por la computadora ENIAC de 30 toneladas en 1946. La principal diferencia era que el 4004 pesaba menos de una onza. Al principio, las aplicaciones abundaban para este dispositivo. El microprocesador de 4 bits fue usado en los primeros sistemas de videojuegos y en los pequeños sistemas de control basados en microprocesador. Los principales problemas con este microprocesador eran su velocidad, la anchura de las palabras y el tamaño de la memoria. La mejora del microprocesador de 4 bits terminó cuando Intel sacó al mercado el microprocesador 4040, una versión actualizada del 4004. El 4040 operaba a una mayor velocidad, aunque carecía de mejoras en la anchura de las palabras y en el tamaño de la memoria. Otras compañías, en especial Texas Instruments (TMS-1000), también produjeron microprocesadores de 4 bits. Este tipo de microprocesador aún sobrevive en aplicaciones de bajo nivel tales como hornos de microondas y pequeños sistemas de control, y aún está disponible a través de algunos fabricantes de microprocesadores. La mayoría de las calculadoras se basan todavía en microprocesadores de 4 bits que procesan códigos BCD (Decimal codificado en binario) de 4 bits. A finales de 1971 y teniendo en cuenta que el microprocesador era un producto comercialmente viable, Intel Corporation sacó al mercado el 8008; una versión extendida de 8 bits del microprocesador 4004. El 8008 direccionaba un tamaño de memoria expandida (16 Kbytes) y contenía instrucciones adicionales (un total de 48) que brindaban la oportunidad para su aplicación en sistemas más avanzados. (Un byte es por lo general un número binario de 8 bits, y un K equivale a 1024. A menudo, el tamaño de la memoria se especifica en Kbytes.) A medida que los ingenieros fueron desarrollando usos más demandantes para el microprocesador 8008, descubrieron que su tamaño de memoria relativamente pequeño, su baja velocidad y su conjunto de instrucciones limitaban su utilidad. Intel reconoció estas limitaciones y presentó el microprocesador 8080 en 1973; el primero de los microprocesadores modernos de 8 bits. Aproximadamente seis meses después de que Intel lanzó el microprocesador 8080, Motorola Corporation introdujo su microprocesador MC6800. En poco tiempo, otras compañías empezaron a introducir sus propias versiones del microprocesador de 8 bits. ¿QUÉ TENÍA DE ESPECIAL EL 8080? Este microprocesador no sólo podía direccionar más memoria y ejecutar instrucciones adicionales, sino que las ejecutaba 10 veces más rápido que el 8008. Resumiendo, un sistema basado en el 8008 tardaba 20 μs (50,000 instrucciones por segundo) y un sistema basado en el 8080 requería de sólo 2.0 μs (500,000 instrucciones por segundo). Además, el 8080 era compatible con tecnología TTL (lógica transistor-transistor), mientras que el 8008 no era directamente compatible. Esto hizo que la interfaz fuera más sencilla y menos costosa. El 8080 también direccionaba cuatro veces más memoria (64 Kbytes) 8080 que el 8008 (16 Kbytes). Estas mejoras anunciaron la era del y los avances de este microprocesador continua. Bill Gates y Paul Allen, los fundadores de Microsoft Corporation, desarrollaron el intérprete de lenguaje BASIC escrito para la computadora Altair 8800 en 1975. Digital Research escribió el programa ensamblador para la Altair 8800, empresa que produjo el DR-DOS para la computadora personal. EL MICROPROCESADOR 8085 En 1977 Intel Corporation presentó una versión actualizada del 8080: el 8085. Éste fue el último microprocesador de propósito general de 8 bits desarrollado por Intel. Aunque era sólo un poco más avanzado que un microprocesador 8080, el 8085 ejecutaba software a una velocidad aún mayor. Resaltando, el 8080 tardaba 2.0 μs (500,000 instrucciones por segundo en el 8080) y el 8085 requería solamente de 1.3 μs (769,230 instrucciones por segundo). Las principales ventajas del 8085 eran su generador de reloj interno, su controlador de sistema interno y una frecuencia de reloj más alta. Este mayor nivel de integración de los componentes redujo el costo del 8085 y aumentó su utilidad. EL MICROPROCESADOR MODERNO En 1978, Intel sacó al mercado el microprocesador 8086; aproximadamente un año después sacó al mercado el 8088. Ambos dispositivos eran microprocesadores de 16 bits, los cuales ejecutaban instrucciones en tiempos de hasta 400 ns (2.5 MIPs, o 2.5 millones de instrucciones por segundo). Esto representó una considerable mejora en cuanto a la velocidad de ejecución del 8085. Además, el 8086 y el 8088 direccionaban 1 Mbyte de memoria, que era 16 veces más memoria que la direccionada por el 8085. (Una memoria de 1 Mbyte contiene posiciones de memoria de un tamaño de 1024 Kbytes, o 1,048,576 bytes.) La mayor velocidad de ejecución y el tamaño más grande de memoria permitieron que el 8086 y el 8088 sustituyeran a las minicomputadoras más pequeñas en muchas aplicaciones. Otra de las características incluidas en el 8086/8088 era una caché o cola de instrucciones de 4 o 6 bytes que obtenían previamente unas cuantas instrucciones antes de ejecutarlas. La cola agilizó la operación de muchas secuencias de instrucciones y se consolidó como base para las cachés de instrucciones mucho mayores que se encuentran en los microprocesadores modernos. El microprocesador de 16 bits mejoró principalmente debido a la necesidad de sistemas de memoria más extensas. La popularidad de la familia Intel se aseguró en 1981, cuando IBM Corporation decidió utilizar el microprocesador 8088 en su computadora personal. Las aplicaciones tales como las hojas de cálculo, los procesadores de palabras, los correctores ortográficos y los tesauros basados en computadora requerían mucha memoria, de hecho más de los 64 Kbytes que se encuentran en los microprocesadores de 8 bits, para ejecutarse eficientemente. Los microprocesadores 8086 y 8088 de 16 bits contaban con 1 Mbyte de memoria para estas aplicaciones. En poco tiempo, hasta el sistema de memoria de 1 Mbyte resultó ser limitante para las bases de datos extensas y otras aplicaciones. Esto llevó a Intel a presentar el microprocesador 80286 (un 8086 actualizado) en 1983. EL MICROPROCESADOR 80286 Este microprocesador (que también tenía una arquitectura de 16 bits) era casi idéntico al 8086 y al 8088, con la excepción de que direccionaba un sistema de memoria de 16 Mbytes en vez de 1 Mbyte, y contaba con unas cuantas instrucciones adicionales que administraban los 15 Mbytes de memoria adicional. Se incrementó la velocidad del reloj del 80286 para que ejecutara algunas instrucciones en tan sólo 250 ns con la versión original de 8.0 MHz. También hubo algunos cambios en cuanto a la ejecución interna de las instrucciones, lo cual produjo un aumento de ocho veces más la velocidad para muchas instrucciones, en comparación con las instrucciones del 8086/8088. EL MICROPROCESADOR DE 32 BITS Las aplicaciones empezaron a demandar velocidades mayores para los microprocesadores, y rutas de datos más amplias. Esto provocó que en 1986 llegara el 80386 fabricado por Intel Corporation. Este microprocesador representó un importante adelanto en la arquitectura de 16 bits de los microprocesadores 8086-80286. El 80386 fue el primer microprocesador de 32 bits práctico de Intel que contenía un bus de datos de 32 bits y una dirección de memoria de 32 bits. (Hay que considerar que Intel produjo antes un microprocesador de 32 bits que no tuvo éxito, llamado iapx-432.) Mediante estos buses de 32 bits, el 80386 direccionaba hasta 4 Gbytes de memoria. EL MICROPROCESADOR 80486 En 1989 Intel sacó al mercado el microprocesador 80486, que incorporaba un microprocesador parecido al 80386, un coprocesador numérico similar al 80387 y un sistema de memoria de caché de 8 Kbytes en un paquete integrado. Aunque el microprocesador 80486 no era radicalmente distinto del 80386, incluía un cambio substancial. La estructura interna del 80486 se había modificado en base al 80386, de tal forma que la mitad de sus instrucciones se ejecutaran en un ciclo de reloj en vez de dos. Como el 80486 estaba disponible en una versión de 50 Mhz, casi la mitad de las instrucciones se ejecutaban en 25ns. La mejora promedio de velocidad para una mezcla común de instrucciones era de un 50% más que un 80386 que funcionara a la misma velocidad de reloj. EL FUTURO DE LOS MICROPROCESADORES Nadie puede hacer predicciones precisas, pero el éxito de la familia Intel debe continuar por muchos años todavía. Por tanto el software de la familia de microprocesadores 80X86, sobrevivirá para el sistema y la premisa básica detrás de esta tecnología es que muchos microprocesadores se comunican directamente entre sí, lo que permite el procesamiento en paralelo sin necesidad de cambios en el conjunto de instrucciones o en el programa. En la actualidad la tecnología superescalar utiliza muchos microprocesadores, pero todos comparten el mismo conjunto de registros. Esta nueva tecnología contiene muchos microprocesadores, cada uno de los cuales contiene su propio conjunto de registros que está vinculado con los registros de los otros microprocesadores. Esta tecnología ofrece un verdadero procesamiento en paralelo sin necesidad de escribir un programa especial. MAPA DE MEMORIA DE UNA COMPUTADORA LA MEMORIA Y EL SISTEMA DE E/S Las estructuras de memoria de todas las computadoras personales basadas en Intel son similares. Aquí se incluyen desde las primeras computadoras personales basadas en el 8088, introducidas en 1981 por IBM, hasta las versiones más poderosas de alta velocidad de la actualidad, basadas en el Pentium Core. La anterior figura ilustra el mapa de memoria de un sistema de computadora personal. Este mapa se aplica a cualquier computadora personal , o a cualquiera de los muchos clones compatibles con IBM que hay en existencia. EL MICROPROCESADOR En el corazón del sistema computacional basado en microprocesador está el circuito integrado del microprocesador. Este elemento, que algunas veces se le denomina como el CPU (unidad central de proceso), es el elemento de control en un sistema computacional. El microprocesador controla la memoria y la E/S a través de una serie de conexiones llamadas buses. Los buses seleccionan un dispositivo de E/S o de memoria, transfieren datos entre un dispositivo de E/S o la memoria y el microprocesador, y controlan el sistema de E/S y de memoria. La memoria y la E/S se controlan mediante instrucciones que se almacenan en la memoria para que el microprocesador las ejecute. El microprocesador realiza tres tareas principales para el sistema computacional: 1. transfiere datos entre sí mismo y los sistemas de memoria o de E/S. 2. operaciones simples aritméticas y lógicas. 3. el flujo del programa mediante decisiones simples. Aunque éstas son tareas sencillas, es por medio de ellas que el microprocesador realiza casi cualquier serie de operaciones o tareas. El poder del microprocesador está en su capacidad de ejecutar billones de instrucciones por segundo, provenientes de un programa o software (grupo de instrucciones) almacenado en el sistema de memoria. Este concepto de programa almacenado ha convertido al microprocesador y al sistema computacional en dispositivos muy poderosos. SISTEMAS NUMÉRICOS Para usar el microprocesador se requiere un conocimiento práctico de los sistemas numéricos binario, decimal y hexadecimal. En esta sección veremos las bases sobre estos sistemas numéricos para aquellos que no estén familiarizados. Describiremos las conversiones entre decimal y binario, entre decimal y hexadecimal, y entre binario y hexadecimal. DÍGITOS Antes de convertir los números de una base a otra, hay que comprender qué son los dígitos. Anteriormente aprendimos que un número decimal (base 10) se construye con 10 dígitos: del 0 al 9. El primer dígito en cualquier sistema numérico es siempre cero. Por ejemplo, un número de base 8 (octal) contiene 8 dígitos: del 0 al 7; un número de base 2 (binario) contiene 2 dígitos: 0 y 1. Si la base de un número se pasa de 10, utilizamos las letras del alfabeto para los dígitos adicionales, empezando con una A. CONVERSIÓN DESDE DECIMAL Las conversiones desde el sistema decimal hacia otros sistemas numéricos son fáciles de realizar. Para convertir la porción entera de un número desde decimal, se divide entre la base. CONVERSIÓN A DECIMAL para convertir de cualquier base numérica a decimal, se determinan los pesos o valores de cada posición del número y luego se suman los pesos para formar el equivalente en decimal COMPLEMENTOS Algunas veces los datos se almacenan en forma de complemento para representar números negativos. Se utilizan dos sistemas para representar datos negativos: complementos a la base y complementos a la base –1. El primer sistema fue el complemento a la base –1, en el que cada dígito del número se resta de la base –1 para generar el complemento a la base –1, para representar un número negativo. En el siguiente ejemplo se muestra cómo el número binario de 8 bits 01001100 es complementado a uno (base –1) para representarlo como un valor negativo. Observe que a cada dígito del número se le resta uno para generar el complemento a la base –1 (a uno). En este ejemplo el negativo de 01001100 es 10110011. La misma técnica puede aplicarse a cualquier sistema numérico. En la actualidad el complemento a la base –1 no se utiliza por sí solo; se utiliza como un paso para encontrar el complemento a la base. Este complemento se utiliza para representar números negativos en los sistemas computacionales modernos. (El complemento a la base –1 se utilizaba en los primeros días de la tecnología computacional.) El principal problema con el complemento a la base –1 es que existe un cero negativo o un cero positivo; en el sistema de complemento a la base sólo puede existir un cero positivo. Para formar el complemento a la base primero hay que encontrar el complemento a la base –1 y después se suma uno al resultado. El siguiente ejemplo muestra cómo se convierte el número 0100 1000 en un valor negativo, complementándolo a dos (base). TAREA SOBRE LA LECTURA Realizar un mapa mental sobre la evolución del microprocesador. Enviar el trabajo al correo electrónico: rgsirpa@gmail.com