UNIDAD 1: Introducción a la arquitectura de computadoras. 1.1 Introducción La tecnología de computadoras ha progresado increíblemente en los últimos cincuenta años. En 1945 no había computadoras con programa almacenado. Hoy, con menos de mil dólares es posible comprar una computadora personal con más prestaciones, más memoria principal y más memoria en disco que una computadora que en 1965 costaba un millón de dólares. Desde 1985 ha habido una media-docena de nuevas máquinas cuya introducción aparentaba revolucionar la industria de la informática; sin embargo estas revoluciones sólo fueron ilusorias, porque alguien más construyó una computadora con un mejor rendimiento. Los avances en la industria de la computación han producido una nueva revolución, la revolución de la información que se sitúa a la par con la revolución industrial o con la revolución agrícola. Si la industria del transporte hubiera evolucionado al paso que la industria de la computación, por ejemplo, hoy podríamos viajar de costa a costa en 5 segundos por 50 centavos. Algunas aplicaciones que hace algunas décadas resultaban como parte de la ficción, hoy en día forman parte de nuestra vida diaria, por ejemplo: • Cajeros automáticos: Una computadora puesta en las paredes de los bancos, para distribuir y colectar efectivo, era un concepto ridículo en los 1950’s, cuando la computadora más barata costaba al menos $500, 000.00 dólares y era del tamaño de un automóvil. • Computadoras en los automóviles: El control por computadora en los automóviles fue absurdo hasta la década de los 1980’s, cuando los microprocesadores mejoraron dramáticamente en precio y rendimiento. Actualmente, las computadoras reducen la contaminación y mejoran la eficiencia del combustible a través del control de inyectores e incrementan la seguridad por medio de los controles de velocidad y el inflado de bolsas de aire que protegen a los ocupantes en caso de accidentes. • Computadoras portátiles: Esto sólo podía ocurrir en sueños, sin embargo los avances en los sistemas de cómputo permiten llevar las computadoras prácticamente a cualquier sitio. • El proyecto del genoma humano: El costo del equipo de cómputo necesario para monitorear las secuencias de DNA humano fue de algunos millones de dólares. Es poco probable que alguien hubiera considerado este proyecto si el costo fuera de 10 a 100 veces más alto, como ocurría hace 15 o 25 años. • Internet: Actualmente el Internet esta transformando nuestra sociedad, entre sus usos están la distribución de noticias, compras desde catálogos en línea, planeación de vacaciones, envío de flores, encontrar a otros que compartan los mismos intereses, etc. Claramente los avances en la tecnología de las computadoras afectan casi todos los aspectos de nuestra sociedad. Los avances en hardware han permitido a los programadores crear software increíblemente útil. Algunas aplicaciones que son ficción para el mañana son: La sociedad sin efectivo, autopistas inteligentes y el cómputo auténticamente ubicuo: no llevar computadoras por que ellas estarán disponibles en donde sea. En la década de los 1960’s y 1970’s, una restricción primaria sobre el rendimiento del cómputo fue el tamaño de la memoria de las computadoras. Los programadores obedecían a un credo simple: Al minimizar el espacio de memoria se hacen programas más rápidos. En la última década, los avances en el diseño de las computadoras y en la tecnología de las memorias han reducido la importancia de la memoria pequeña. Los programadores interesados en el rendimiento ahora necesitan entender los tópicos que han reemplazado al modelo simple de memoria de los 1960’s: La naturaleza jerárquica de las memorias y la naturaleza paralela de los procesadores. Los programadores que busquen construir versiones competitivas de compiladores, sistemas operativos, bases de datos, etc., deberán contar con conocimientos de la organización de las computadoras. 1.2 Abstracciones en software Tanto en Hardware como en software encontramos abstracciones, es decir, un conjunto de capas jerárquicas donde la capa de un nivel mas bajo oculta detalles a la capa siguiente. El principio de abstracción es la forma en que los diseñadores de hardware y software se las arreglan con la complejidad de los sistemas de cómputo. Para entender las abstracciones existentes en software, primeramente explicaremos lo que hay debajo de un programa. Para “hablarle” a una máquina electrónica, sería necesario enviarle señales eléctricas. Las señales que las máquinas entienden fácilmente son “encendido” y “apagado”, de modo que el alfabeto de las máquinas solo se forma por dos letras. Así como las 27 letras del alfabeto español no nos limitan cuanto puede ser escrito, con las dos letras del alfabeto de las computadoras no les establece un límite de lo que se puede hacer con ellas. Los dos símbolos para estas dos letras son los números 0 y 1, por lo que comúnmente consideramos como el lenguaje de las máquinas a los números en base 2, o números binarios. A cada “letra” la referimos como un dígito binario o bit. Las computadoras son esclavas de nuestros comandos; y el nombre de un comando individual se denomina instrucción. Las instrucciones son una secuencia de bits que la computadora entiende, pueden ser pensadas como números. Por ejemplo, los bits: 1000110010100000 Le dicen a una computadora que sume dos números. Un fundamento del cómputo es el uso de números para instrucciones y datos, esto se revisará con mayor detalle en la Unidad 2. La programación de computadoras con números binarios es bastante tediosa y expuesta a errores, por lo que fue necesaria la invención de nuevas notaciones más cercanas a la forma de pensar de los humanos. Las primeras notaciones se trasladaban a binario a mano, pero los pioneros de la computación se preguntaron ¿Por qué no utilizar a la máquina para programar a la máquina?, Pronto se crearon programas encargados de trasladar de notación simbólica a binario. Al primero de estos programas se le denominó ensamblador. Por ejemplo, para sumar dos números el programador escribía en notación simbólica: add A, B y el ensamblador lo trasladaría a 1000110010100000 El nombre acuñado para este lenguaje simbólico, aún usado actualmente, es lenguaje ensamblador. Sin embargo el lenguaje ensamblador aún se encuentra lejos de la forma de pensamiento humano, y aunque es fácilmente entendible para los profesionistas dedicados a la computación, no es un lenguaje que permita a los físicos expresar el comportamiento de un fluido o a los contadores organizar sus libros de balances. El lenguaje ensamblador requiere que el programador escriba una línea por cada instrucción que la máquina ejecutará, forzando al programador a pensar como la máquina. Una simple pregunta se hicieron los pioneros de la computación: Si fue posible construir un programa que traslade de notación simbólica a instrucciones binarias, para simplificar la programación ¿Qué impide la creación de un programa que traduzca de un lenguaje más cercano al pensamiento humano a lenguaje ensamblador?, la respuesta fue: Nada. A estos programas se les conoce como compiladores y a los lenguajes que ellos compilan se les conoce como lenguajes de programación de alto nivel. En un lenguaje de alto nivel el programador escribiría la expresión: A+B El compilador debería compilar la instrucción a lenguaje ensamblador: add A, B Y el ensamblador lo traduciría a : 1000110010100000 En la figura 1 se muestra la relación entre estos programas y lenguajes. Fig. 1 – Programa en C compilado al Lenguaje ensamblador y después ensamblado a lenguaje de máquina binaria. Los lenguajes de programación de alto nivel ofrecen diferentes beneficios: Primero, permiten al programador pensar en un lenguaje mas natural, usando palabras en ingles y notación algebraica. Más aún, los lenguajes se han diseñado de acuerdo a su uso inherente, así Fortran fue creado para cómputo científico, Cobol para procesamiento de datos de negocios, Lisp para manipulación simbólica, etc. La segunda ventaja es que se mejora la productividad del programador, por que para expresar una idea se escriben menos líneas en un lenguaje de alto nivel, en lugar de expresar la idea en lenguaje ensamblador. La ventaja final es que estos lenguajes de programación permiten a los programas ser independientes de la computadora en la cual fueron escritos, dado que los compiladores y ensambladores pueden trasladar los programas en lenguajes de alto nivel a instrucciones binarias de cualquier máquina. Estas tres ventajas son tan fuertes que actualmente poca programación se escribe en lenguaje ensamblador. Cuando un programador escribe un programa en un lenguaje de alto nivel, puede olvidarse de lo que hay por debajo, es decir, puede ignorar la notación del lenguaje ensamblador, y mejor aún, puede ignorar el código binario, en otras palabras, esta utilizando una abstracción. Como era natural, los programadores notaron que el reutilizar al software es más eficiente que iniciar con un programa desde cero. De aquí que los programadores hagan uso de varias rutinas que se encuentran en diferentes librerías. Una de las primeras librerías contenía rutinas de entrada y salida de datos, la cual incluía, por ejemplo, rutinas para controlar impresoras, que aseguraban que la impresora tuviera papel antes de iniciar la impresión. Tal software controlaba dispositivos de entrada y salida como discos magnéticos, cintas magnéticas y pantallas de video. Pronto se descubrió que los programas se ejecutaban en forma eficiente si existía otro programa encargado de supervisar su ejecución. Cuando terminaba una tarea, el programa supervisor iniciaba con la siguiente, evitando pérdidas de tiempo. Estos programas supervisores también incluían librerías con rutinas de entrada/salida, y son la base de los sistemas operativos actuales. Los sistemas operativos son programas que manejan los recursos de una computadora para el beneficio de los programas que corren en esa máquina. Puede notarse que desde el momento que se carga al sistema operativo, el usuario de computadoras trabaja sobre una abstracción, puesto que todos sus programas trabajan sobre una plataforma establecida, de la cual el programador puede ignorar los detalles que hay por debajo. Otra abstracción la encontramos en la clasificación del software. El software se clasifica por su uso, al software que proporciona servicios que son comúnmente útiles se le llama Software de Sistema, los sistemas operativos, compiladores y ensambladores son ejemplos de software de sistemas; son programas de interés para los programadores. En contraste, al software dedicado a resolver problemas específicos de los usuarios se le denomina Software de Aplicación. Por ejemplo, editores de textos, programas de dibujos, etc. En la figura 2 se muestra al software organizado como capas jerárquicas, mostrando el ámbito donde cada capa se desenvuelve. El usuario de computadoras sólo se concreta en aplicaciones e ignora al software del sistema. Mientras que el programador puede abarcar las dos capas más altas e ignorar lo que hay en el hardware. Por lo tanto, nuevamente tenemos abstracciones. Fig. 2 – Una vista simplificada del Hardware y Software como capas jerárquicas Fig. 3 – Un ejemplo de la clasificación del Software. La vista simplificada del software por capas genera algunos conflictos, por ejemplo en el caso de los compiladores, los compiladores son utilizados para producir programas, tanto aplicaciones como software de sistema. Sin embargo, cuando una aplicación se esta ejecutando, ya no requiere del compilador. Por lo que el software de aplicaciones no puede estar como una capa monolítica ubicada sobre el software de sistemas. Para ello se han dado otro tipo de clasificaciones, como la que se muestra en la figura 3, no obstante, en esta nueva clasificación para el software también se encuentran abstracciones. 1.3 Abstracciones en hardware En hardware también encontramos abstracciones, un usuario de computadoras se olvida de las partes que componen a la computadora y la utiliza como un sistema conjunto, como una herramienta que le ayudará a resolver problemas diversos. En la figura 4 mostramos a una computadora típica de escritorio con sus diferentes elementos: Teclado, ratón, pantalla, bocinas y el gabinete, que internamente contiene mas hardware. Fig. 4 – Computadora típica de escritorio. Sin embargo usuarios mas avanzados podrían abrir el gabinete, para encontrar mas elementos de hardware: La tarjeta madre (una tarjeta verde con diferentes elementos conectados), el disco duro, la unidad de disco flexible, la unidad de disco compacto, la fuente de alimentación y los cables de conexiones. El ensamblador de computadoras puede olvidarse de lo que contiene cada uno de estos elementos y utilizarlos para ensamblar una computadora, es decir, el ensamblador de computadoras trabaja sobre otro conjunto de abstracciones. Pero podríamos ir observando con mayor detalle a los elementos que están dentro del gabinete, por ejemplo a la tarjeta madre, ésta contiene diferentes elementos: Al procesador (o CPU), la DRAM, la ROM, puertos, etc. En la figura 5 se muestra la organización típica de una tarjeta madre de una PC. Fig. 5 – Tarjeta madre de una PC. El procesador es la parte activa de la tarjeta madre, sigue las instrucciones de un programa al pie de la letra. Suma números, prueba números, activa señales de dispositivos de I/O, etc. Los programas se almacenan en memoria secundaria (disco magnético o disco compacto) y para su ejecución deben ser transferidos a memoria principal (la DRAM). No es el objetivo de esta sección explicar detalladamente el funcionamiento de los elementos que integran a la tarjeta madre, pero basta explorar un poco para encontrar mas detalles de funcionamiento, es decir, revisar un nivel jerárquico mas bajo. Como muestra, exploremos un poco al procesador (típicamente conocido como CPU). El procesador Pentium de Intel contiene las unidades funcionales siguientes: El camino de los datos -para enteros y punto flotante-, el control, la memoria caché –para instrucciones y datos-, y el control de los saltos. En la figura 6 se muestra la distribución es estos bloques funcionales. El área del chip es de 91 mm2 y contiene cerca de 3.3 millones de transistores; la memoria caché ocupa al menos 1 millón de transistores. Fig. 6 – Dentro del procesador Intel Pentium. Es conveniente notar que al hacer referencia a los bloques funcionales y no a las compuertas lógicas, o directamente al número de transistores, se están utilizando más abstracciones. Los circuitos integrados son una de las abstracciones mas importantes de la electrónica, por debajo de un circuito integrado se oculta todo el proceso que requiere para su fabricación, desde que se toma una barra de silicio hasta que se empaquetan los chips. En la figura 6 se muestra en forma representativa el proceso de manufactura de los chips. Y aún llegando al silicio encontramos algunas abstracciones que nos ocultan las propiedades físicas de este elemento o bien de las impurezas que se le agregan para formar los diferentes materiales. En conclusión, el desarrollo de hardware y software está lleno de abstracciones; y entre todas ellas existe una que es de interés para este curso (y en general para los desarrolladores de computadoras). La abstracción de interés es aquella en la que el hardware se relaciona con el software de bajo nivel y se denomina: Arquitectura de un repertorio de instrucciones o simplemente Arquitectura de una computadora. La arquitectura establece los principios sobre los cuales se diseña una computadora: Su repertorio de instrucciones, el tamaño de los datos, el número de registros, etc. Y sobre una misma arquitectura se estudiarán diferentes implementaciones que pueden variar en costo y rendimiento, pero que ejecutan el mismo software. Fig. 7 – Proceso de manufactura de los circuitos integrados. Además, como una abstracción, se representa a una computadora con cinco componentes clásicos: Entradas, salidas, memoria, camino de los datos y control, por lo general los últimos dos componentes se combinan y se les denomina procesador. Esta representación se muestra en la figura 8 y es una representación estándar, independientemente de la tecnología. Los diferentes elementos de una computadora actual o del pasado, caen dentro de alguna de estas categorías. Entrada Control Camino de los datos Memoria Salida Procesador Fig. 8 – Cinco componentes clásicos de una computadora. TAREA 1 1.- Si la industria del transporte hubiera evolucionado al paso que la industria de la computación ¿Cuál sería el costo aproximado de un automóvil y cual sería su velocidad máxima?, investigar en Internet el costo y velocidad aproximada del primer automóvil y de la primera computadora electrónica (en la computadora consideremos el número de instrucciones por segundo) y de acuerdo a las características de las nuevas computadoras estimar las características que se deberían tener en el automóvil. 2.- Explica con tus propias palabras que es una abstracción, y en un par de objetos de la vida diaria: automóvil, casa, televisión, etc., ilustra el uso de abstracciones. Los siguientes ejercicios se tomaron directamente del texto (se sugiere revisarlo para responder adecuadamente): 3. Encontrar la palabra o frase de la lista siguiente que mejor corresponda a la descripción de las siguientes preguntas. Utilizar en la respuesta las letras a la izquierda de las palabras. Cada respuesta debe utilizarse sólo una vez. a) b) c) d) e) f) g) h) i) j) k) l) m) n) abstracción ensamblador número binario bit caché CPU (unidad central de proceso) chip compilador familia de computadores control camino de datos defecto dado DRAM (memoria dinámica de acceso aleatorio) o) implementación p) instrucción q) arquitectura del repertorio de instrucciones r) circuito integrado s) memoria t) sistema operativo u) procesador v) semiconductor w) supercomputador x) transistor y) VLSI (circuito integrado de muy alta escala) z) aprovechamiento (yield) [ ]. Abstracción especifica que el hardware proporciona al software de bajo nivel. [ ]. Parte activa del computador que sigue las instrucciones del programa al pie de la letra: suma números, examina números, etc. [ ]. Otro nombre para procesador. [ ]. Aproximación al diseño hardware o software. El sistema está formado por capas jerárquicas, en las que cada capa de nivel inferior oculta detalles de la capa de nivel superior. [ ]. Número en base 2. [ ]. Dígito binario. [ ]. Colección de implementaciones de la misma arquitectura del repertorio de instrucciones que están disponibles a la vez y varían en precio y rendimiento. [ ]. Componente del procesador que realiza operaciones aritméticas. [ ]. Componente del procesador que indica al camino de datos, memoria y dispositivos de E/S lo que deben hacer de acuerdo con las instrucciones del programa. [ ]. Hardware que obedece la abstracción de la arquitectura del repertorio de instrucciones. [ ]. Máquina de alto rendimiento que cuesta más de un millón de dólares. [ ]. Orden individual para un computador. [ ]. Circuito integrado normalmente utilizado para construir la memoria principal. [ ]. Integra desde docenas hasta cientos de transistores en un solo chip. [ ]. Integra desde cientos de miles hasta millones de transistores en un solo chip. [ ]. Localización de los programas cuando se están ejecutando, también contiene los datos que necesitan. [ ]. Defecto microscópico en una oblea. [ ]. Apodo para un dado o circuito integrado. [ ]. Conmutador «on-off» controlado por electricidad. [ ]. Porcentaje de dados buenos del número total de dados de la oblea. [ ]. Programa que gestiona los recursos del computador en beneficio de los programas que corren en esa máquina. [ ]. Programa que traduce una versión simbólica de una instrucción a la versión binaria. [ ]. Programa que traduce una notación de más alto nivel al lenguaje ensamblador. [ ]. Componente rectangular que se obtiene al trocear una oblea. [ ]. Memoria pequeña rápida que actúa como buffer para la memoria principal. [ ]. Sustancia que no conduce bien la electricidad. 4. Utilizando las categorías de la tabla siguiente, clasificar los siguientes ejemplos. Utilizar en la respuesta las letras a la izquierda de las palabras. De forma distinta al ejercicio anterior, las respuestas de la tabla pueden utilizarse más de una vez. a) b) c) d) e) f) g) h) i) j) software de aplicaciones lenguaje de programación de alto nivel dispositivo de entrada circuito integrado mini computadora dispositivo de salida computador personal semiconductor supercomputador software del sistema [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ ]. ]. ]. ]. ]. ]. ]. ]. ]. ]. ]. ]. ]. ]. ]. ]. ]. ]. Apple 11. Ensamblador. Compilador. Cray 1. DRAM. Fortran. IBM PC. Teclado. Microprocesador. Ratón. Sistema operativo. Pascal. PDP-8. Impresora. Pantalla de tubo de rayos catódicos. Silicio. Hoja electrónica. Editor de textos.