Catto / Mapa de Temas · Informática I 1er nivel
Informática I · 120 h · Contenido 1 de 6

Estructura de un sistema computacional

Antes de escribir una línea de código conviene saber sobre qué máquina se escribe: qué partes tiene, cómo busca y ejecuta cada instrucción, dónde guarda los datos y qué la hace rápida.

Von Neumann Ciclo de instrucción Memoria Buses Rendimiento

01Una computadora es una pila de máquinas

Nadie programa una computadora «entera». Se programa la máquina que ofrece la capa de abajo. Quien escribe en C ve una máquina que entiende funciones y variables; el compilador la traduce a la máquina que entiende instrucciones; el procesador ejecuta cada instrucción con circuitos digitales, y esos circuitos son transistores que conmutan. Cada capa esconde los detalles de la siguiente y ofrece algo más fácil de usar. A esa idea se la llama abstracción, y es la herramienta más importante de toda la informática.

CapaQué se ve desde ahíQuién trabaja en ella
AplicaciónVentanas, archivos, datos del problemaEl usuario y el programador de aplicaciones
Lenguaje de alto nivelVariables, funciones, estructuras (C, Python)El programador
Sistema operativoProcesos, memoria virtual, archivos, dispositivosEl núcleo del sistema
Arquitectura del repertorio (ISA)Registros, instrucciones, modos de direccionamientoEl compilador y el ensamblador
MicroarquitecturaUnidad de control, ALU, caché, segmentaciónEl diseñador del procesador
Lógica digitalCompuertas, flip-flops, registros, sumadoresEl diseño digital
DispositivosTransistores MOS que conmutanLa electrónica
La frontera más importante

La arquitectura del repertorio de instrucciones (ISA, por Instruction Set Architecture) es el contrato entre el software y el hardware: la lista de instrucciones, los registros visibles y la forma de acceder a memoria. Todo lo que está arriba puede cambiar sin tocar el procesador, y el procesador puede rediseñarse por dentro sin romper el software, mientras se respete ese contrato. Por eso un programa compilado para x86 hace veinte años sigue corriendo en un procesador actual.

Esta materia se mueve en las capas del medio: cómo se representan los datos, cómo se piensa un algoritmo y cómo se escribe en C sabiendo qué hace la máquina con eso. Las capas de abajo se ven con más detalle en lógica combinacional y en arquitectura de microprocesadores.

02El modelo de von Neumann

En 1945 John von Neumann describió, en el informe preliminar sobre la EDVAC, la organización que todavía usan casi todas las computadoras. La idea central es el programa almacenado: las instrucciones no están cableadas, se guardan en la misma memoria que los datos, como números. Cambiar de programa es cambiar el contenido de la memoria.

CPU Unidad de control ALU aritmética y lógica Registros PC · IR · acumulador · banderas Memoria instrucciones y datos juntos Entrada / salida teclado, pantalla, puertos bus de direcciones bus de datos bus de control
Figura 1. Los tres bloques de von Neumann y los tres buses que los unen. La CPU pone una dirección en el bus de direcciones, indica en el bus de control si lee o escribe, y el dato viaja por el bus de datos.
  • Unidad central de procesamiento (CPU). La unidad de control busca las instrucciones y las interpreta; la unidad aritmético-lógica (ALU) hace las cuentas; los registros son la memoria interna, pequeña y muy rápida.
  • Memoria principal. Un arreglo de celdas numeradas. El número de cada celda es su dirección y lo que guarda es su contenido: dos cosas que no hay que confundir nunca.
  • Entrada/salida. Los caminos hacia el mundo exterior.
  • Buses. Conjuntos de líneas compartidas. El de direcciones va siempre de la CPU hacia afuera; el de datos es bidireccional.
Von Neumann y Harvard

Compartir una memoria para instrucciones y datos es simple, pero crea un cuello de botella: la CPU no puede traer la próxima instrucción y un dato en el mismo momento. La arquitectura Harvard usa dos memorias con buses separados. Los microcontroladores AVR y PIC son Harvard: el programa vive en la flash y los datos en la RAM. Los procesadores de PC son von Neumann hacia afuera, pero por dentro tienen cachés separadas de instrucciones y de datos, que es una forma de Harvard.

03El ciclo de instrucción, paso a paso

La CPU repite siempre lo mismo, miles de millones de veces por segundo:

  1. Búsqueda (fetch): copia en el registro de dirección de memoria (MAR) el valor del contador de programa (PC), lee esa celda y guarda la instrucción en el registro de instrucción (IR). Después incrementa el PC para que apunte a la siguiente.
  2. Decodificación: la unidad de control separa en el IR el código de operación (qué hacer) y el operando (con qué).
  3. Ejecución: hace la operación. Puede leer o escribir memoria, operar en la ALU o cambiar el PC, que es lo que hace un salto.

La máquina de abajo es una CPU de acumulador de 8 bits con 16 celdas de memoria. Cada instrucción ocupa un byte: los 4 bits altos son el código de operación y los 4 bajos, la dirección. Tiene cargado un programa que multiplica A × B sumando A tantas veces como diga B, porque esta CPU no sabe multiplicar. Avanzá de a una fase y mirá cómo se mueven los datos.

Laboratorio · una CPU de juguete

Verde: la celda que se lee. Amarillo: la que se escribe. Azul: a donde apunta el PC.

BúsquedaDecodificaciónEjecución Ciclos de instrucción: 0
Memoria
Registros de la CPU
Repertorio
0x1a LOAD a · ACC ← M[a]
0x2a STORE a · M[a] ← ACC
0x3a ADD a · ACC ← ACC + M[a]
0x4a SUB a · ACC ← ACC − M[a]
0x5a JMP a · PC ← a
0x6a JZ a · si Z, PC ← a
0x70 HALT · detener
Lo que muestra la máquina

Una instrucción y un dato son indistinguibles en la memoria: la celda 1 contiene 0x3B y la CPU lo trata como «ADD 11» sólo porque el PC pasó por ahí. Si el PC llegara a la celda 11, que contiene el número 3, lo ejecutaría como la instrucción 0x03. Un salto con la dirección equivocada no da error: ejecuta basura.

04La memoria y su jerarquía

La unidad es el bit; ocho bits forman un byte, que es la menor cantidad direccionable en casi todos los procesadores. La palabra es el tamaño con el que la CPU trabaja de una vez: 8 bits en un AVR, 32 en un ARM Cortex-M, 64 en una PC.

Con n líneas de dirección se distinguen 2n posiciones:

posiciones=2n 216=65 536 232=4 294 967 296 Un bus de 16 bits direcciona 64 KiB; uno de 32 bits, 4 GiB. Por eso los sistemas de 32 bits no podían usar más de 4 GiB de RAM.
kilo no es kibi

En el Sistema Internacional, kilo es 1000. Pero la memoria crece en potencias de 2, así que se usaron «kilobyte» para 1024 bytes durante décadas. La IEC separó los dos: kB = 1000 B y KiB = 1024 B; MiB = 220, GiB = 230. Un disco de «1 TB» tiene 1012 bytes, que son 931 GiB: no falta nada, está medido con otra unidad. El conversor de prefijos SI ayuda con los decimales.

Ninguna memoria es a la vez grande, rápida y barata. La solución es una jerarquía: pocas celdas muy rápidas cerca de la CPU y muchas lentas lejos. Funciona porque los programas tienen localidad: usan varias veces los mismos datos (localidad temporal) y los datos vecinos (localidad espacial).

NivelTamaño típicoTiempo de accesoTecnología
Registroscientos de bytes< 1 nsFlip-flops en la CPU
Caché L132–64 KiB≈ 1 nsSRAM
Caché L2 y L3MiB3–20 nsSRAM
Memoria principalGiB60–100 nsDRAM
Disco de estado sólidocientos de GBdecenas de µsFlash NAND
Disco rígidoTB5–10 msMagnético

Son órdenes de magnitud, no datos de un modelo. Lo que importa es la escala: entre un registro y un disco rígido hay un factor de diez millones. Si un acceso a registro durara un segundo, leer el disco tardaría cuatro meses. Los tipos de memoria se ven en memorias y dispositivos programables.

05Entrada y salida

Para la CPU, un periférico es un grupo de registros: uno de datos, uno de estado y uno de control. Se llega a ellos de dos maneras. En la E/S mapeada en memoria los registros ocupan direcciones del mismo espacio que la RAM y se leen y escriben con las instrucciones comunes; es lo que hacen los microcontroladores. En la E/S aislada hay un espacio aparte con instrucciones propias, como IN y OUT en x86.

Y hay tres formas de saber cuándo el periférico tiene algo:

Consulta (polling)

La CPU lee el registro de estado una y otra vez. Simple, pero ocupa al procesador esperando.

Interrupciones

El periférico avisa con una señal; la CPU deja lo que hace, atiende y vuelve. Ver interrupciones.

Acceso directo (DMA)

Un controlador mueve bloques entre el periférico y la memoria sin pasar por la CPU, que sólo recibe el aviso de «terminado».

06Del código fuente a la ejecución

La CPU sólo ejecuta código máquina. Un programa en C recorre este camino antes de correr:

EtapaEntraSaleQué hace
Preprocesador.c.iResuelve #include, #define y la compilación condicional
Compilador.i.sTraduce C a lenguaje ensamblador del procesador destino
Ensamblador.s.oTraduce cada mnemónico a su código máquina
Enlazador.o + bibliotecasejecutableUne los objetos y fija las direcciones definitivas
CargadorejecutableprocesoEl sistema operativo lo copia a memoria y salta a su primera instrucción

El sistema operativo es el programa que administra el hardware y lo reparte entre los demás programas: decide quién usa la CPU, le da a cada proceso su espacio de memoria y ofrece los archivos y los dispositivos a través de llamadas al sistema. En un microcontrolador chico no hay sistema operativo: el programa es el único dueño de la máquina. Las etapas de la compilación se practican en el tema de programación estructurada.

07¿Qué hace rápida a una computadora?

La frecuencia de reloj no alcanza para comparar procesadores. El tiempo que tarda un programa depende de tres factores, y la llamada ecuación clásica del rendimiento los junta:

T=Ni·CPIf Ni: instrucciones ejecutadas · CPI: ciclos de reloj promedio por instrucción · f: frecuencia de reloj.
Ejemplo resuelto

Un programa ejecuta 2·109 instrucciones. En el procesador A, a 3 GHz, promedia 1,5 ciclos por instrucción; en el B, a 2,5 GHz, promedia 1,2.

TA = 2·109 · 1,5 / 3·109 = 1,00 s y TB = 2·109 · 1,2 / 2,5·109 = 0,96 s.

B es más rápido con un reloj 17 % más lento. El compilador influye en Ni, la microarquitectura en el CPI y la tecnología en f: ninguno de los tres decide solo.

08En el laboratorio

Práctica 1 · Inventario de una PC

En Windows, abrir el administrador de tareas (pestaña Rendimiento) y en Linux ejecutar lscpu y free -h. Anotar núcleos, frecuencia, tamaño de cada caché y RAM total. Ubicar cada dato en la tabla de la jerarquía. Para el hardware físico, ver mantenimiento de PC.

Práctica 2 · Programar la CPU de juguete

Escribir en papel, con el repertorio de la sección 3, un programa que calcule A − B y deje el resultado en la celda 13. Después uno que calcule el mayor de dos números. Codificar cada instrucción en hexadecimal y verificar con la máquina cuántos ciclos lleva.

Práctica 3 · La localidad se mide

Recorrer una matriz de 4000 × 4000 enteros en C primero por filas y después por columnas, midiendo el tiempo con clock(). Explicar la diferencia con la localidad espacial y la organización de la matriz en memoria, que se ve en contenedores de datos complejos.

09Errores frecuentes

  • Confundir dirección y contenido. La celda 13 no «vale 13»: vale lo que tenga guardado.
  • Creer que más GHz es siempre más rápido. El CPI y la cantidad de instrucciones pesan tanto como el reloj.
  • Mezclar kB con KiB y concluir que «falta memoria».
  • Pensar que la RAM guarda sólo datos. El programa que se ejecuta también está ahí.
  • Olvidar que el PC ya fue incrementado al ejecutar la instrucción: por eso un salto relativo se cuenta desde la instrucción siguiente.

10Autoevaluación

¿Qué es un programa almacenado y qué ventaja trajo?

Es guardar las instrucciones en la memoria, como datos. Permite cambiar de programa sin recablear la máquina y hace posible que un programa (un compilador, un cargador) genere o cargue otros.

¿Cuántas posiciones direcciona un bus de 20 bits? ¿Cuánta memoria es, si cada posición es un byte?

220 = 1 048 576 posiciones: 1 MiB. Era el límite del 8086 original.

¿Qué registro cambia en todas las búsquedas, sin excepción?

El contador de programa, que se incrementa para apuntar a la instrucción siguiente. El IR también se carga siempre.

¿Cómo implementa un salto la CPU?

Escribiendo una dirección nueva en el PC durante la ejecución. La búsqueda siguiente trae la instrucción desde ahí.

¿Por qué funciona la jerarquía de memoria?

Por la localidad de los programas: la mayoría de los accesos cae en datos usados hace poco o cercanos a ellos, que ya están en los niveles rápidos.

Un procesador ejecuta 5·108 instrucciones con CPI 2 a 1 GHz. ¿Cuánto tarda?

T = 5·108 · 2 / 109 = 1 s.

¿Qué diferencia a la arquitectura Harvard de la de von Neumann?

Harvard tiene memorias y buses separados para instrucciones y datos, y puede acceder a los dos a la vez. Von Neumann comparte una sola memoria y un solo camino.

11Para ampliar

  • Andrew S. Tanenbaum y Todd Austin. Organización de computadoras. Un enfoque estructurado. 4.ª ed., Pearson Educación, 2000. El libro de la «pila de máquinas»: está organizado capa por capa, de la lógica digital al sistema operativo.
  • David A. Patterson y John L. Hennessy. Estructura y diseño de computadores. La interfaz hardware/software. 4.ª ed., Reverté, 2011. El capítulo 1 desarrolla la ecuación del rendimiento; el de la jerarquía de memoria es la referencia del tema.
  • William Stallings. Organización y arquitectura de computadores. 7.ª ed., Pearson Prentice Hall, 2006. Buses, ciclo de instrucción y entrada/salida con mucho detalle.
  • Charles Petzold. Code: The Hidden Language of Computer Hardware and Software. 2.ª ed., Microsoft Press, 2022 (en inglés). Construye una computadora desde relés y compuertas hasta el programa almacenado. Se lee como una novela.
Desarrollo del contenido «Estructura de un sistema computacional» de Informática I (primer nivel), según el diseño curricular de Ingeniería Electrónica, Plan 2023 — Ordenanza N° 1849 del Consejo Superior de la UTN. Volver al Mapa de Temas · catto.ar