Universidad Central de Venezuela Facultad de Ciencias Escuela de Computación Licenciatura en Computación Plan de Estudios 2000 Componente Básico Asignaturas Obligatorias ORGANIZACIÓN Y ESTRUCTURA DEL COMPUTADOR I UC 6 HT 4 HP 2 HL 3 Semestre II Código 6001 Requisitos - Algoritmos y Programación Ult. Actualización Marzo 2015 Fundamentación La ciencia de la computación es una disciplina que se basa en un elemento tecnológico: el computador. Para poder desarrollar programas en lenguajes de alto y bajo nivel, no sólo funcionales sino además que se ejecuten de forma rápida y eficiente, el futuro egresado requiere una adecuada comprensión del sistema de computación en si mismo con la finalidad de identificar y resolver cualquier ineficiencia en dichos programas. Existe una relación fundamental entre el hardware y diversos aspectos de programación, por ende, con la finalidad de escribir software de forma adecuada es muy importante comprender el sistema de computación como un todo. Esto requiere tener un dominio de los aspectos teóricos y de los fundamentos tecnológicos involucrados en dichos sistemas. Este curso es de carácter teórico-práctico, involucrando a su vez el desarrollo de proyectos y laboratorios que permiten poner en práctica los conocimientos impartidos. Resumen del Contenido La presentación de este curso está basada en los principios de ayudar a los estudiantes a convertirse en mejores programadores, mostrar la jerarquía de abstracciones e implementaciones que conforman un sistema de computación moderno, y sentar las bases para cursos posteriores en el área de sistemas (Sistemas Operativos, Comunicación de Datos, Redes de Computadores, Arquitectura de Computadores, Programación Paralela, Compiladores, Seguridad, etc.). Los estudiantes deben ser introducidos a los sistemas de computación desde la perspectiva de un programador, en lugar de la perspectiva más tradicional de un implementador de sistemas. Esto significa que se debe enseñar el sistema de computación como un todo, considerando tanto el hardware, como el sistema operativo y los compiladores involucrados. Se parte de la premisa de que los estudiantes pueden aprender mejor a partir de la evaluación de programas reales que se ejecutan sobre máquinas reales. Entre los temas cubiertos tenemos la representación de los datos, representaciones a nivel de máquina de programas en lenguaje C, la jerarquía de memoria, el proceso de compilación/ensamblaje/enlace, flujo de control excepcional, memoria virtual y evaluación y optimización de rendimiento a nivel de programa. Estos conceptos son reforzados a través de ejercicios de práctica y diversos talleres-laboratorios. Objetivos del Curso Conocer el funcionamiento de un computador: su estructura interna a nivel de los subsistemas procesador, bus, memoria y entrada/salida; así como la ejecución de un programa en lenguaje máquina. Diferenciar los distintos modos de representación de los datos y aplicar los algoritmos aritméticos básicos. Saber representar y operar con números enteros y reales en diferentes formatos. Saber cómo se almacenan y se acceden datos estructurados en el computador. Saber traducir rutinas y construcciones de programación en alto nivel (expresiones, condicionales, bucles, subrutinas, etc.) al lenguaje ensamblador de una máquina real (o vicecersa) utilizando una interfaz binaria de aplicación (ABI) estándar. Conocer los conceptos de excepción y de interrupción y tener una noción básica de su gestión. Conocer la estructura interna y el funcionamiento de una memoria caché, con especial énfasis en aquellos aspectos que afectan al rendimiento de un sistema. Entender la utilidad de la memoria virtual, su funcionamiento básico y el soporte hardware que requiere. Comprender los procesos de compilación, montaje y carga en el desarrollo del software. Describir la estructura interna y funcionamiento de los principales componentes de la jerarquía de memoria y las técnicas para mejorar su rendimiento. Aplicar optimizaciones sencillas en fragmentos de código para mejorar su rendimiento. 1 Contenidos Temáticos 1.- Introducción a la Organización y Arquitectura del Computador. Organización, arquitectura básica y aspectos fundamentales de los computadores: El concepto de programa almacenado, la arquitectura Von Neumann, la arquitectura Harvard. Estructura y función. Niveles de máquinas. Máquinas multinivel contemporáneas. Evolución e historia de los computadores. Componentes del computador: Diagrama de interconexión de los componentes de hardware, subsistema de buses, subsistema de memoria, unidad de control, unidad aritmético y lógica, subsistema de entrada/salida. Funcionamiento del computador: ejecución de instrucciones. 2.- Representación y Manipulación de la Información. Almacenamiento de información: Notación hexadecimal, bits, bytes, palabras, tamaño de los datos, direccionamiento y ordenamiento a nivel de bytes. Representación de caracteres y cadenas de caracteres. Representación de instrucciones. Sistemas numéricos posicionales. Conversión de base numérica (binarios, octales, hexadecimales). Representación (signo y magnitud, exceso a M, complemento a 1, complemento a 2, BCD) y aritmética (suma, resta, multiplicación y división) de números enteros. Representación de números de punto fijo. Representación de números en punto flotante. Estudio de casos. 3.- Arquitectura de Conjunto de Instrucciones. Evolución histórica. Codificación de programas. Formatos de los datos. Propiedades del nivel de la arquitectura de conjunto de instrucciones: Modelos de memoria, registros. Modos de direccionamiento. Formatos de las instrucciones: Elementos, tamaño. Operandos: Número, localización, tipo y tamaño. Introducción al lenguaje ensamblador: Estructura de un programa, nemónicos, seudoinstrucciones, sintaxis, valores inmediatos (constantes), contador de posiciones, tabla de símbolos, segmentos de ensamblador, literales, macros, desensambladores. Tipos de instrucciones: Bits de resultado, transferencia de datos, aritméticas y lógicas, flujo de control (salto condicional e incondicional, etiquetas), llamada y retorno a procedimientos (subrutinas), corrutinas, interrupción de software y retorno de una rutina de servicio de interrupción (flujo de control excepcional), instrucciones de entrada/salida. Mecanismos de llamada a procedimientos. Administración de la pila. Traducción de tipos de datos estructurados: Asignación y acceso a arreglos, estructuras de datos heterogéneas, referencias a memoria fuera de límite y desbordamiento de búfer. Estudio de casos: Procesadores de 32 y 64 bits. 4.- Nivel del Procesador del Lenguaje. El proceso de compilación: Traductores, intérpretes y compiladores. El proceso de ensamblaje: Funciones básicas. Características de un ensamblador, ensamblador de dos pasos, ensamblador de un paso, ensamblador de varios pasos. El depurador. Proceso de enlace y carga: Funciones básicas realizadas por el enlazador y por el cargador, interfaces binarias de aplicación (ABI). Estructura de un módulo objeto. Archivos objeto relocalizables, símbolos y tablas de símbolos, resolución de símbolos, relocalización, archivos objeto ejecutables, bibliotecas. Carga de archivos objeto ejecutables en memoria. Tiempo de enlace, relocalización dinámica, relocalización estática, enlace y carga dinámicos, bibliotecas compartidas, carga y enlace de bibliotecas compartidas desde las aplicaciones. Código independiente de la posición (PIC). Herramientas para manipular archivos objeto. Procesos concurrentes, espacio de direcciones privado, modo kernel y modo usuario, cambios de contexto. Estudio de casos. 5.- Organización de la Jerarquía de Memoria Tecnologías de almacenamiento: Memorias de acceso aleatorio - RAM (SRAM, DRAM, ROM, EPROM, EEPROM, etc.), almacenamiento en disco (geometría, capacidad, operación, conexión con los dispositivos de entrada/salida, IDE, SCSI, acceso a los discos, rendimiento de los discos, caching de disco), discos de estado sólido, memoria óptica, cintas magnéticas, tendencias en las tecnologías de almacenamiento. Principio de localidad de referencias. La jerarquía de memoria. Memoria caché: Organización genérica de la memoria caché, elementos de diseño, caché de correspondencia directa, caché asociativa por conjunto, caché completamente asociativa, aspectos de desempeño. Principios para escribir código que aproveche la caché. Impacto de la caché en el rendimiento de los programas. Memoria virtual: Direccionamiento físico y virtual, espacio de direcciones, funcionamiento de la memoria virtual, ventajas de utilizar la memoria virtual para administrar la memoria, uso de la memoria virtual para la protección de memoria, traducción de direcciones, relación entre memoria caché y memoria virtual, búfer de traducción adelantada (TLB), tablas de páginas multinivel, tablas de páginas invertidas. Correspondencia de memoria. Asignación dinámica de memoria. Recolección de memoria no referenciada. Errores comunes relacionados con la memoria que ocurren en programas. Estudio de casos: Procesadores de 32 y 64 bits. 6.- Optimización de Rendimiento a Nivel de Programa. Capacidades y limitaciones de los compiladores. Expresión del rendimiento de un programa. Eliminación de ineficiencias a nivel de bucles. Reducción de las llamadas a procedimiento. Eliminación de referencias innecesarias a memoria. Comprensión de los procesadores modernos. Desenrrollado de bucles. Mejora de paralelismo. Factores limitantes. Comprensión del rendimiento de la memoria. Técnicas de mejora del rendimiento. Identificación y reducción de cuellos de botella en el rendimiento. Bibliografía El contenido de esta asignatura está basado principalmente en el libro de Bryant & O’Hallaron [1]. Para los aspectos relacionados con el lenguaje de programación C, se recomienda el clásico de Kernighan & Ritchie [2]. Otro par de textos muy completos sobre el lenguaje de programación C son los de Harbison & Steele [15] y King [16]. Un texto algo antiguo pero con muy buen basamento teórico para los temas de esta asignatura es el de Maccabe [3]. Excelentes complementos para los contenidos son los libros de Parhami [4], Tanenbaum [5] y Stallings [6]. Ciertos partes del contenido pueden encontrarse en el libro de Hamacher 2 et al. [7]. Para el tema de nivel del procesador del lenguaje se recomiendan los textos de Levine [8], Beck [9] y Salomon [10]. Las características de programación y estructura de los procesadores Intel de 32 y 64 bits puede revisarse en Irvine [11], Brey [12] y en los manuales de Intel para desarrolladores de software [13] y para optimización de software [14]. [1] Randal E. Bryant and David R. O’Hallaron, Computer Systems: A Programmer’s Perspective, 3rd, Addison-Wesley Publishing Company, USA, 2015. [2] Brian W. Kernighan and Dennis M. Ritchie, El Lenguaje de Programacion C, 2da, Pearson Educación, S.A., Madrid, 1995. [3] Arthur B. Maccabe, Sistemas Computacionales: Arquitectura, Organización y Programación de Sistemas, 1ra, Irwin Professional PublishingMcGraw Hill Interamericana, España, 1995. [4] Behrooz Parhami, Arquitectura de Computadoras: De los Microprocesadores a las Supercomputadoras, 1ra, McGraw Hill, México, 2007. [5] Andrew S. Tanenbaum, Structured Computer Organization, 6th, Prentice Hall, USA, 2012. [6] William Stallings, Computer Organization and Architecture: Designing for Performance, 10th, Prentice Hall, USA, 2015. [7] Carl Hamacher, Zvonko Vranesic, Safwat Zaky, and Naraig Manjikian, Computer Organization and Embedded Systems, 6ta, McGraw Hill, USA, 2011. [8] John R. Levine, Linkers & Loaders, 1st, Morgan Kaufmann Publishers, USA, 1999. [9] Leland L. Beck, System Software: An Introduction to Systems Programming, 3rd, Addison-Wesley Publishing Company, USA, 1996. [10] David Salomon, Assemblers And Loaders (1993), http://www.davidsalomon.name/assem.advertis/asl.pdf. Accessed 5 de abril de 2015. Publicado originalmente por Ellis Horwood Ltd. y disponible ahora en línea. [11] Kip R. Irvine, Assembly Language for x86 Processors, 7th, Prentice Hall, USA, 2014. [12] Barry B. Brey, The Intel microprocessors 8086/8088, 80186/80188, 80286, 80386, 80486, Pentium, Pentium Pro processor, Pentium II, Pentium III, Pentium 4, and Core2 with 64-bit extensions: architecture, programming, and interfacing, 8th, Prentice Hall, USA, 2008. [13] Intel Corporation, Intel 64 and IA-32 Architectures Software Developer’s Manual: Combined Volumes: 1, 2A, 2B, 2C, 3A, 3B and 3C (Enero de 2015), http://www.intel.com/content/dam/www/public/us/en/documents/manuals/ 64-ia-32-architectures-software-developer-manual-325462.pdf. Accessed 5 de abril de 2015. Conjunto de volúmenes combinados de manuales para desarrolladores de software de las arquitecturas Intel 64 e IA-32. [14] , Intel 64 and IA-32 Architectures Optimization Reference Manual (Septiembre de 2014), http://www.intel.com/content/dam/www/ public/us/en/documents/manuals/64-ia-32-architectures-optimization-manual.pdf. Accessed 5 de abril de 2015. Manual de referencia para la optimización de software. [15] Samuel P. Harbison and Guy L. Steele Jr., C: A Reference Manual, 5th, Prentice Hall, USA, 2002. [16] K. N. King, C Programming: A Modern Approach, 2nd, W. W. Norton & Company, USA, 2008. 3