Generado con IA · Tema 2

Elementos funcionales d'un ordenador digital. Arquitectura.

Sistemas Aplicaciones Informaticas Comunidad Valenciana 10.844 palabras Castellano Valencià
Descargar:
Este tema lo ha redactado la IA de OposicionesIA, sin retoques. Es una muestra de la calidad y el formato que obtienes al generar tus propios temas dentro de la plataforma.

Tema 2. Elementos funcionales d'un ordenador digital. Arquitectura.

ÍNDEX

  1. INTRODUCCIÓ
  2. Concepto d'ordenador digital i modelos teóricos de computació
  3. La máquina de Turing com fundamento teórico
  4. El modelo de von Neumann frente a la arquitectura Harvard
  5. La Untat Central de Procés (CPU): estructura i funcionament
  6. El cicle d'instrucció: búsqueda, decodificació i ejecució
  7. El subsistema de memòria i su jerarquía
  8. El subsistema d'entrada/eixida (I/S)
  9. El sistema d'interconexión: buses de datos, adreces i control
  10. Generacions i evolució dels ordenadores digitales
  11. Aplicació didáctica i relació amb el currículum
  12. CONCLUSIÓ
  13. Bibliografia i referències

1. INTRODUCCIÓ

l'ordenador digital constituye l'artefacto tecnológico més versátil que ha producido la ingeniería, i su estudio resulta imprescindible para cualquier docent de la especialtat de Sistemas i Aplicacions Informáticas. Comprender qué és un ordenador no se limita a enumerar les piezas que lo componen, sinó que exige entender la articulació funcional d'eixes piezas en torno a una idea central: la máquina de programa almacenado. Un ordenador no és una calculadora rápida ni un conjunto de circuitos sueltos, sinó la materialització física d'un modelo abstracto de computació capaz d'ejecutar cualquier algoritmo expresable, dins dels límites de su memòria i su temps.

El propósito d'aquest tema és analizar els elementos funcionales d'un ordenador digital, això és, les untats que, mitjançant su cooperació, fan possible el procesament automático de la informació. Para abordarlo amb el rigor que exige una prova d'oposició, conviene partir dels fundamentos teóricos —la máquina de Turing, que defineix qué significa computar— para descender després a la arquitectura concreta —el modelo de von Neumann i su alternativa, la arquitectura Harvard— i, finalmente, describir els subsistemas físicos: la untat central de procés, la memòria, els dispositius d'entrada/eixida i el sistema de buses que els interconecta. Cerraremos amb la perspectiva histórica de les generacions i amb la inserció d'aquests conceptos en el currículum de la Formació professional i de la Educació secundària.

l'enfoque será deliberadamente integrador: cada elemento s'explicará no de forma aislada, sinó com parte d'un sistema cuyo comportament global emerge de la interacció entre componentes. Aquesta visió sistémica és, a més, la que mejor traslada al alumnat la naturaleza profunda de la computació i la que conviene cultivar en l'aula. Conviene anticipar, asimismo, una tesis que vertebra tot el tema: els ordenadores han cambiado de tecnología vàries veces —del relé a la válvula, de la válvula al transistor, del transistor al circuito integrado nanométrico—, però els elementos funcionales i su lógica de cooperació s'han mantenido com invariantes conceptuales. Distinguir lo que és contingente (la implementació) de lo que és estructural (la funció) és precisamente la marca d'una exposició de nivell de tribunal.

2. Concepto d'ordenador digital i modelos teóricos de computació

Un ordenador digital és una máquina automática capaz d'aceptar datos d'entrada, procesarlos siguiendo un conjunto d'instruccions almacenadas (el programa) i producir resultats d'eixida, operando sobre informació representada de forma discreta, normalmente mitjançant el sistema binari. l'adjetiu «digital» s'opone a «analógico»: mientras un computador analógico representa magnitudes mitjançant variables físicas continuas (tensions, ángulos, presions), el digital representa la informació mitjançant dígitos, lo que le confiere precisió arbitrària, inmuntat relativa al ruido i, sobre tot, la capactat d'aplicar la teoría matemática del álgebra de Boole a su disseny.

La elecció del sistema binari, amb només dos nivells lógicos, no és caprichosa. Un sistema de dos estats (típicamente dos umbrales de tensió) maximiza el margen de ruido: para confundir un 0 amb un 1 fa falta una perturbació que cruce tot l'intervalo de guarda entre ambdós nivells, mientras que un sistema decimal amb deu nivells necesitaría discriminar franjas de tensió molt més estrechas i sería incomparablemente més frágil. A eixa robustez física se suma la regeneració de la señal: cada puerta lógica recibe nivells degradados i emite nivells limpios, de modo que l'error no s'acumula al llarg d'una cadena de miles de puertas. És aquesta combinació de robustez i capactat de regeneració la que fa possible que un procesador amb decenas de miles de millones de transistores conmutando miles de millones de veces por segundo funcione durant anys sense errar un només bit de forma perceptible. La teoría de la informació de Claude Shannon (1948) i su formulació de la capactat de canal dan el marco cuantitatiu de por qué lo discreto vence a lo continu en presencia de ruido.

Tres propiedades caracterizan al ordenador digital moderno i lo distinguen de máquinas anteriores:

  • Automatismo: una vez iniciada la ejecució, l'ordenador procede sense intervenció humana, gobernado por su programa.
  • Universaltat o programabiltat: la mateixa máquina física pot resolver problemes distintos sense més que cambiar el programa. Aquesta propiedad, hoy obvia, fue la gran ruptura conceptual frente a les máquinas de propósito fijo.
  • Programa almacenado: el programa reside en la memòria amb el mateix estatus que els datos, lo que permet que un programa modifique a altre, se compile, s'interprete o se cargue dinámicamente.

Aquestes propiedades no surgieron del ensayo ingenieril, sinó d'una reflexión teórica previa. Abans de que existiera el primer ordenador electrónico, els matemáticos ja habían formalizado qué significa calcular. En la década de 1930, en el contexto del programa d'Hilbert i de la pregunta sobre la decidibiltat (el Entscheidungsproblem), se propusieron varis modelos formales de computació: la máquina de Turing d'Alan Turing, el cálculo lambda d'Alonzo Church i les funcions recursivas de Gödel, Kleene i Herbrand. La demostració de que els tres modelos són equivalentes —defineixen exactamente la mateixa classe de funcions computables— condujo a la tesis de Church-Turing: tota funció intuitivamente calculable mitjançant un procediment mecánico és computable por una máquina de Turing. Conviene subrayar que la tesis no és un teorema demostrable, pues relaciona una noció intuitiva («calculable mitjançant un procediment mecánico») amb una noció formal; és, més bien, una definició ampliamente aceptada perquè tot modelo de cómputo razonable propuesto en noventa anys ha resultat equivalente o més débil.

Aquesta tesis és la piedra angular de la informática teórica i té una consecuencia práctica de primer Orde: cualquier ordenador real, por sofisticado que sea, no pot calcular nada que una máquina de Turing no pueda calcular. Les diferencias entre máquinas són de eficiencia (temps, memòria, consumo), no de poder de cómputo. Por eso l'estudio de la máquina de Turing no és una curiostat histórica, sinó el marco que defineix els límites teóricos de tot elemento funcional que describiremos.

Merece la pena introducir aquí una observació de gran calado conceptual, que distingue una exposició notable d'una excelente. El conjunto de tots els programas possibles és numerable (infinito, però contable, pues cada programa és una cadena finita de símbolos), mientras que el conjunto de totes les funcions dels naturales en els naturales té la cardinaltat del continu, estrictamente major. Por un sencillo argumento de cardinaltat se concluye que casi totes les funcions són incomputables: no existe ni podrá existir programa alguno que les calcule. Lo vertaderament notable no és que haya problemes irresolubles, sinó que la inmensa mayoría lo sea i que, aun así, casi tots els problemes que nos interesan en la práctica caigan del lado computable. Sobre eixa classe de lo computable, la teoría de la complejtat superpone després una jerarquía de dificultad práctica —classes com P, NP, PSPACE— que clasifica els problemes resolubles segons els recursos de temps i espai que exigen, i que és materia de temes posteriores del temari.

3. La máquina de Turing com fundamento teórico

La máquina de Turing, descrita por Alan Turing en 1936 en su article «On Computable Numbers, with an Application to the Entscheidungsproblem», és un modelo matemático abstracto que captura la esencia del cálculo mecánico. No és un dispositiu físico, sinó una definició formal cuya simplictat la fa especialment valiosa para razonar sobre lo computable.

3.1. Definició formal i componentes

Una máquina de Turing se defineix com una séptupla M = (Q, \Sigma, \Gamma, \delta, q_0, b, F), on Q és un conjunto finito de estats, \Gamma és el alfabeto de cinta (els símbolos que poden escribirse), \Sigma \subseteq \Gamma és l'alfabeto d'entrada, q_0 \in Q és el estat inicial, b \in \Gamma és el símbolo blanco, F \subseteq Q és el conjunto de estats finales o d'aceptació, i \delta és la funció de transició que constituye el «programa» de la máquina. En su versió determinista, la funció de transició té la forma

\delta : Q \times \Gamma \longrightarrow Q \times \Gamma \times \{L, R\},

és a dir, dado l'estat actual i el símbolo leído, produeix un nou estat, un símbolo a escribir i una adreça de moviment (izquierda o derecha). Físicamente, el modelo se describe amb tres elementos intuitius:

  • Una cinta infinita dividida en celdas, cada una de les cuales conté un símbolo del alfabeto. La cinta fa les veces de memòria i de dispositiu d'entrada i eixida simultáneamente.
  • Un cabezal de lectura/escritura que se posiciona sobre una celda, pot leer su símbolo, escribir un nou i desplazarse una posició a la izquierda o a la derecha.
  • Una untat de control que, en funció del estat actual i del símbolo leído, decide qué símbolo escribir, en qué adreça moverse i a qué estat transitar. És l'embrión de la futura Untat de Control de la CPU.

El funcionament procede por passos discretos. En cada pas, la funció de transició consulta el par (estat, símbolo leído) i determina la terna (símbolo a escribir, adreça de moviment, nou estat). El cómputo termina quan s'assoleix un estat final o quan no hi ha transició definida. La situació completa de la máquina en un instante —contingut de la cinta, posició del cabezal i estat actual— se denomina configuració o descripció instantánea, i la sucesió de configuracions constituye el cómputo.

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 760 440" font-family="ui-sans-serif, system-ui, Arial, sans-serif"> <rect x="0" y="0" width="760" height="440" fill="#ffffff"/> <!-- Títol --> <text x="380" y="30" font-size="17" font-weight="bold" fill="#0f172a" text-anchor="middle">Màquina de Turing (model abstracte del còmput)</text> <line x1="40" y1="40" x2="720" y2="40" stroke="#e2e8f0" stroke-width="1"/> <!-- ============ CINTA (dalt) ============ --> <text x="110" y="60" font-size="11" fill="#64748b">cinta infinita</text> <text x="650" y="60" font-size="11" fill="#64748b" text-anchor="end">cinta infinita</text> <!-- cel·la 1: ... --> <rect x="110" y="70" width="60" height="60" fill="#f8fafc" stroke="#334155" stroke-width="1.5"/> <text x="140" y="107" font-size="15" fill="#64748b" text-anchor="middle">...</text> <!-- cel·la 2: 1 --> <rect x="170" y="70" width="60" height="60" fill="#f8fafc" stroke="#334155" stroke-width="1.5"/> <text x="200" y="109" font-size="16" fill="#0f172a" text-anchor="middle">1</text> <!-- cel·la 3: 0 --> <rect x="230" y="70" width="60" height="60" fill="#f8fafc" stroke="#334155" stroke-width="1.5"/> <text x="260" y="109" font-size="16" fill="#0f172a" text-anchor="middle">0</text> <!-- cel·la 4: 1 --> <rect x="290" y="70" width="60" height="60" fill="#f8fafc" stroke="#334155" stroke-width="1.5"/> <text x="320" y="109" font-size="16" fill="#0f172a" text-anchor="middle">1</text> <!-- cel·la 5: 1 (activa, ressaltada) --> <rect x="350" y="70" width="60" height="60" fill="#fef3c7" stroke="#ea580c" stroke-width="2"/> <text x="380" y="109" font-size="16" font-weight="bold" fill="#0f172a" text-anchor="middle">1</text> <!-- cel·la 6: 0 --> <rect x="410" y="70" width="60" height="60" fill="#f8fafc" stroke="#334155" stroke-width="1.5"/> <text x="440" y="109" font-size="16" fill="#0f172a" text-anchor="middle">0</text> <!-- cel·la 7: 1 --> <rect x="470" y="70" width="60" height="60" fill="#f8fafc" stroke="#334155" stroke-width="1.5"/> <text x="500" y="109" font-size="16" fill="#0f172a" text-anchor="middle">1</text> <!-- cel·la 8: B (blanc) --> <rect x="530" y="70" width="60" height="60" fill="#f8fafc" stroke="#334155" stroke-width="1.5"/> <text x="560" y="102" font-size="15" fill="#0f172a" text-anchor="middle">B</text> <text x="560" y="120" font-size="9.5" fill="#64748b" text-anchor="middle">(blanc)</text> <!-- cel·la 9: ... --> <rect x="590" y="70" width="60" height="60" fill="#f8fafc" stroke="#334155" stroke-width="1.5"/> <text x="620" y="107" font-size="15" fill="#64748b" text-anchor="middle">...</text> <!-- ============ CAPÇAL L/E (triangle sota la cel·la activa) ============ --> <polygon points="380,136 372,150 388,150" fill="#ea580c"/> <polygon points="362,180 398,180 386,152 374,152" fill="#fef3c7" stroke="#ea580c" stroke-width="1.5"/> <!-- etiqueta a la DRETA del triangle, amb clearance --> <text x="410" y="170" font-size="12.5" font-weight="bold" fill="#0f172a">capçal L/E</text> <!-- ============ CONNEXIÓ Unitat de control -> capçal (ortogonal, passadís lliure) ============ --> <line x1="140" y1="284" x2="140" y2="224" stroke="#2563eb" stroke-width="1.8"/> <line x1="140" y1="224" x2="380" y2="224" stroke="#2563eb" stroke-width="1.8"/> <line x1="380" y1="224" x2="380" y2="192" stroke="#2563eb" stroke-width="1.8"/> <polygon points="380,180 374,192 386,192" fill="#2563eb"/> <!-- etiqueta paral·lela al tram horitzontal, per davall --> <text x="160" y="244" font-size="11" fill="#2563eb">control de posició i estat</text> <!-- ============ UNITAT DE CONTROL (baix-esquerra) ============ --> <rect x="40" y="284" width="200" height="64" fill="#eff6ff" stroke="#2563eb" stroke-width="1.5" rx="6"/> <text x="140" y="312" font-size="14" font-weight="bold" fill="#0f172a" text-anchor="middle">Unitat de control</text> <text x="140" y="332" font-size="13" fill="#334155" text-anchor="middle">(estat q)</text> <!-- ============ FUNCIÓ DE TRANSICIÓ (a la dreta, unió horitzontal) ============ --> <rect x="420" y="276" width="300" height="78" fill="#ecfdf5" stroke="#059669" stroke-width="1.5" rx="6"/> <text x="570" y="298" font-size="13.5" font-weight="bold" fill="#0f172a" text-anchor="middle">Funció de transició</text> <text x="570" y="319" font-size="12" fill="#334155" text-anchor="middle">δ(estat, símbol llegit) →</text> <text x="570" y="338" font-size="12" fill="#334155" text-anchor="middle">(escriure, moure Esq/Dre, nou estat)</text> <!-- enllaç horitzontal bidireccional entre les dues caixes --> <line x1="240" y1="315" x2="420" y2="315" stroke="#334155" stroke-width="1.5"/> <polygon points="420,315 408,310 408,320" fill="#334155"/> <polygon points="240,315 252,310 252,320" fill="#334155"/> <!-- Peu --> <text x="380" y="420" font-size="12.5" font-style="italic" fill="#64748b" text-anchor="middle">La cinta actua com a memòria i com a dispositiu d'E/S alhora.</text> </svg>

Figura 1. Màquina de Turing: cinta infinita, capçal de lectura/escriptura, unitat de control i funció de transició.

Conviene fijar aquestes ideas amb un exemple concreto i resoluble a mano, del tipus que un tribunal agradece perquè demuestra dominio real i no memorístico. Diseñemos una máquina que calcula el sucesor d'un nombre binari, és a dir, que le suma una untat. Situamos el nombre en la cinta amb el bit menys significatiu a la derecha i colocamos el cabezal sobre su primer dígito. La máquina té tres estats —q_0 (avanzar fins al extremo dret), q_1 (propagar l'acarreo cap a la izquierda) i q_f (aceptació)— i su funció de transició se resume en la siguiente taula:

Estat Lee 0 Lee 1 Lee _ (blanco)
q_0 0, R, q_0 1, R, q_0 _, L, q_1
q_1 1, –, q_f 0, L, q_1 1, –, q_f

La lectura és directa: en q_0 la máquina simplemente recorre tot el nombre cap a la derecha sense alterarlo fins a topar amb el blanco, moment en que retrocede una casilla i pasa a q_1. En q_1 ejecuta la suma amb acarreo: cada 1 que encuentra se convierte en 0 i l'acarreo continúa cap a la izquierda; en quant encuentra un 0 (o el blanco del extremo izquierdo) escribe un 1, l'acarreo s'absorbe i la máquina se detiene. Sigamos el cómputo para la entrada 1011 (que és 11 en decimal): tras recorrerla en q_0, en q_1 se lee el 1 final i s'escribe 0 (queda 1010), s'avanza a la izquierda i se lee altre 1, que se convierte en 0 (queda 1000), i al leer el 0 s'escribe 1 i s'acepta, resultando 1100, que és 12 en decimal. La suma s'ha realizado por propagació d'acarreo, exactamente com lo hará un sumador hardware real. Aquest pequeño exemple ilustra cómo un comportament aritmético emerge de reglas locales elementales, que és la esencia de tota computació.

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 780 620" font-family="ui-sans-serif, system-ui, Arial, sans-serif"> <text x="390" y="32" text-anchor="middle" font-size="16" font-weight="bold" fill="#0f172a">Máquina de Turing: sucesor d'un nombre binari</text> <line x1="372" y1="78" x2="372" y2="448" stroke="#e2e8f0" stroke-width="1.5"/> <text x="180" y="62" text-anchor="middle" font-size="13" font-weight="bold" fill="#334155">Diagrama d'estats</text> <text x="180" y="76" text-anchor="middle" font-size="10" font-style="italic" fill="#64748b">inici</text> <line x1="180" y1="84" x2="180" y2="91" stroke="#334155" stroke-width="1.6"/> <polygon points="180,100 173,90 187,90" fill="#334155"/> <circle cx="180" cy="130" r="30" fill="#f8fafc" stroke="#0f172a" stroke-width="1.8"/> <text x="180" y="135" text-anchor="middle" font-size="13" font-weight="bold" fill="#0f172a">q0</text> <path d="M154,112 C112,96 108,166 154,148" fill="none" stroke="#334155" stroke-width="1.6"/> <polygon points="155,148 146,150 151,140" fill="#334155"/> <text x="100" y="123" text-anchor="end" font-size="11" fill="#0f172a">0 / 0 , R</text> <text x="100" y="142" text-anchor="end" font-size="11" fill="#0f172a">1 / 1 , R</text> <line x1="180" y1="160" x2="180" y2="231" stroke="#334155" stroke-width="1.6"/> <polygon points="180,240 173,230 187,230" fill="#334155"/> <text x="196" y="203" text-anchor="start" font-size="11" fill="#0f172a">_ / _ , L</text> <circle cx="180" cy="270" r="30" fill="#f8fafc" stroke="#0f172a" stroke-width="1.8"/> <text x="180" y="275" text-anchor="middle" font-size="13" font-weight="bold" fill="#0f172a">q1</text> <path d="M154,252 C112,236 108,306 154,288" fill="none" stroke="#334155" stroke-width="1.6"/> <polygon points="155,288 146,290 151,280" fill="#334155"/> <text x="100" y="274" text-anchor="end" font-size="11" fill="#0f172a">1 / 0 , L</text> <line x1="180" y1="300" x2="180" y2="367" stroke="#334155" stroke-width="1.6"/> <polygon points="180,376 173,366 187,366" fill="#334155"/> <text x="196" y="329" text-anchor="start" font-size="11" fill="#0f172a">0 / 1 , –</text> <text x="196" y="351" text-anchor="start" font-size="11" fill="#0f172a">_ / 1 , –</text> <circle cx="180" cy="410" r="34" fill="#ecfdf5" stroke="#059669" stroke-width="1.8"/> <circle cx="180" cy="410" r="28" fill="none" stroke="#059669" stroke-width="1.8"/> <text x="180" y="415" text-anchor="middle" font-size="13" font-weight="bold" fill="#0f172a">qf</text> <text x="570" y="62" text-anchor="middle" font-size="13" font-weight="bold" fill="#334155">Taula de transició</text> <rect x="400" y="90" width="340" height="40" fill="#eff6ff"/> <rect x="400" y="130" width="70" height="80" fill="#eff6ff"/> <rect x="400" y="90" width="340" height="120" fill="none" stroke="#334155" stroke-width="1.4"/> <line x1="470" y1="90" x2="470" y2="210" stroke="#334155" stroke-width="1"/> <line x1="560" y1="90" x2="560" y2="210" stroke="#334155" stroke-width="1"/> <line x1="650" y1="90" x2="650" y2="210" stroke="#334155" stroke-width="1"/> <line x1="400" y1="130" x2="740" y2="130" stroke="#334155" stroke-width="1"/> <line x1="400" y1="170" x2="740" y2="170" stroke="#334155" stroke-width="1"/> <text x="435" y="115" text-anchor="middle" font-size="13" font-style="italic" font-weight="bold" fill="#334155">δ</text> <text x="515" y="115" text-anchor="middle" font-size="12" font-weight="bold" fill="#0f172a">Lee 0</text> <text x="605" y="115" text-anchor="middle" font-size="12" font-weight="bold" fill="#0f172a">Lee 1</text> <text x="695" y="115" text-anchor="middle" font-size="12" font-weight="bold" fill="#0f172a">Lee _</text> <text x="435" y="155" text-anchor="middle" font-size="12" font-weight="bold" fill="#0f172a">q0</text> <text x="515" y="155" text-anchor="middle" font-size="12" fill="#0f172a">0,R,q0</text> <text x="605" y="155" text-anchor="middle" font-size="12" fill="#0f172a">1,R,q0</text> <text x="695" y="155" text-anchor="middle" font-size="12" fill="#0f172a">_,L,q1</text> <text x="435" y="195" text-anchor="middle" font-size="12" font-weight="bold" fill="#0f172a">q1</text> <text x="515" y="195" text-anchor="middle" font-size="12" fill="#0f172a">1,–,qf</text> <text x="605" y="195" text-anchor="middle" font-size="12" fill="#0f172a">0,L,q1</text> <text x="695" y="195" text-anchor="middle" font-size="12" fill="#0f172a">1,–,qf</text> <text x="400" y="240" text-anchor="start" font-size="10.5" font-style="italic" fill="#64748b">_ representa el blanco de la cinta.</text> <text x="400" y="257" text-anchor="start" font-size="10.5" font-style="italic" fill="#64748b">– indica que el cabezal no se mueve.</text> <rect x="30" y="460" width="720" height="140" rx="10" fill="#f8fafc" stroke="#e2e8f0" stroke-width="1.4"/> <text x="390" y="485" text-anchor="middle" font-size="13" font-weight="bold" fill="#334155">Traza de la cinta para l'entrada 1011 (= 11)</text> <rect x="120" y="510" width="24" height="26" fill="#ffffff" stroke="#334155" stroke-width="1.2"/> <rect x="144" y="510" width="24" height="26" fill="#ffffff" stroke="#334155" stroke-width="1.2"/> <rect x="168" y="510" width="24" height="26" fill="#ffffff" stroke="#334155" stroke-width="1.2"/> <rect x="192" y="510" width="24" height="26" fill="#eff6ff" stroke="#334155" stroke-width="1.2"/> <text x="132" y="528" text-anchor="middle" font-size="12" fill="#0f172a">1</text> <text x="156" y="528" text-anchor="middle" font-size="12" fill="#0f172a">0</text> <text x="180" y="528" text-anchor="middle" font-size="12" fill="#0f172a">1</text> <text x="204" y="528" text-anchor="middle" font-size="12" font-weight="bold" fill="#2563eb">1</text> <line x1="194" y1="540" x2="214" y2="540" stroke="#2563eb" stroke-width="2.4"/> <text x="168" y="560" text-anchor="middle" font-size="10" font-style="italic" fill="#64748b">entrada</text> <line x1="224" y1="523" x2="262" y2="523" stroke="#334155" stroke-width="1.5"/> <polygon points="270,523 262,519 262,527" fill="#334155"/> <rect x="278" y="510" width="24" height="26" fill="#ffffff" stroke="#334155" stroke-width="1.2"/> <rect x="302" y="510" width="24" height="26" fill="#ffffff" stroke="#334155" stroke-width="1.2"/> <rect x="326" y="510" width="24" height="26" fill="#eff6ff" stroke="#334155" stroke-width="1.2"/> <rect x="350" y="510" width="24" height="26" fill="#ffffff" stroke="#334155" stroke-width="1.2"/> <text x="290" y="528" text-anchor="middle" font-size="12" fill="#0f172a">1</text> <text x="314" y="528" text-anchor="middle" font-size="12" fill="#0f172a">0</text> <text x="338" y="528" text-anchor="middle" font-size="12" font-weight="bold" fill="#2563eb">1</text> <text x="362" y="528" text-anchor="middle" font-size="12" fill="#0f172a">0</text> <line x1="328" y1="540" x2="348" y2="540" stroke="#2563eb" stroke-width="2.4"/> <line x1="382" y1="523" x2="420" y2="523" stroke="#334155" stroke-width="1.5"/> <polygon points="428,523 420,519 420,527" fill="#334155"/> <rect x="436" y="510" width="24" height="26" fill="#ffffff" stroke="#334155" stroke-width="1.2"/> <rect x="460" y="510" width="24" height="26" fill="#eff6ff" stroke="#334155" stroke-width="1.2"/> <rect x="484" y="510" width="24" height="26" fill="#ffffff" stroke="#334155" stroke-width="1.2"/> <rect x="508" y="510" width="24" height="26" fill="#ffffff" stroke="#334155" stroke-width="1.2"/> <text x="448" y="528" text-anchor="middle" font-size="12" fill="#0f172a">1</text> <text x="472" y="528" text-anchor="middle" font-size="12" font-weight="bold" fill="#2563eb">0</text> <text x="496" y="528" text-anchor="middle" font-size="12" fill="#0f172a">0</text> <text x="520" y="528" text-anchor="middle" font-size="12" fill="#0f172a">0</text> <line x1="462" y1="540" x2="482" y2="540" stroke="#2563eb" stroke-width="2.4"/> <line x1="540" y1="523" x2="578" y2="523" stroke="#334155" stroke-width="1.5"/> <polygon points="586,523 578,519 578,527" fill="#334155"/> <rect x="594" y="510" width="24" height="26" fill="#ffffff" stroke="#059669" stroke-width="1.3"/> <rect x="618" y="510" width="24" height="26" fill="#ecfdf5" stroke="#059669" stroke-width="1.3"/> <rect x="642" y="510" width="24" height="26" fill="#ffffff" stroke="#059669" stroke-width="1.3"/> <rect x="666" y="510" width="24" height="26" fill="#ffffff" stroke="#059669" stroke-width="1.3"/> <text x="606" y="528" text-anchor="middle" font-size="12" fill="#0f172a">1</text> <text x="630" y="528" text-anchor="middle" font-size="12" font-weight="bold" fill="#059669">1</text> <text x="654" y="528" text-anchor="middle" font-size="12" fill="#0f172a">0</text> <text x="678" y="528" text-anchor="middle" font-size="12" fill="#0f172a">0</text> <line x1="620" y1="540" x2="640" y2="540" stroke="#059669" stroke-width="2.4"/> <text x="642" y="560" text-anchor="middle" font-size="10" font-style="italic" fill="#059669">resultat (= 12)</text> </svg>

Figura 2. Máquina de Turing que calcula el sucesor d'un nombre binari: diagrama d'estats i taula de transició.

3.2. Variantes del modelo i robustez de la definició

Una pregunta natural és si la máquina de Turing és artificialmente débil o fuerte por les decisions concretas de su definició. La respuesta, i és un punto que distingue a un buen opositor, és que el modelo és robusto: numerosas variantes que parecerían més potentes resultan ser exactamente equivalentes en poder de cómputo. Una máquina amb vàries cintas pot simularse amb una sola (a costa d'un factor cuadrático de temps); una máquina no determinista, en la que \delta ofrece vàries transicions possibles i la máquina «acierta» si alguna rama acepta, pot simularse amb una determinista (a costa, en el peor cas, d'un temps exponencial, cuestión que està en el corazón del problema P frente a NP); una cinta infinita només por un extremo equivale a una infinita por ambdós. Totes aquestes variantes reconocen exactamente la mateixa classe de lenguatges, els recursivamente enumerables, i calculan exactamente les mateixes funcions. Aquesta invarianza és la que da solidez a la tesis de Church-Turing: no dependemos dels detalles del modelo. La tesis de Church-Turing extendida añade que les diferencias d'eficiencia entre modelos razonables són a lo sumo polinómicas, afirmació que la computació cuántica pone en cuestión i que constituye una de les fronteras teóricas més actives.

3.3. La máquina universal de Turing

La aportació més profunda de Turing fue demostrar la existencia d'una Máquina Universal de Turing: una única máquina U capaz de simular el comportament de cualquier altra máquina de Turing M, sense més que recibir en su cinta la descripció codificada de M —una cadena finita de símbolos que representa su taula de transició— juntament amb la entrada de M. Formalmente, U(\langle M \rangle, w) = M(w). Aquesta idea —una máquina que lee la descripció d'altra máquina i la ejecuta— és exactamente el germen conceptual del programa almacenado i, per tant, del ordenador moderno. El procesador físico és, en esencia, una realització de la máquina universal: lee instruccions codificadas en memòria (la «descripció» del programa) i les ejecuta sea cual sea el programa. La distinció entre hardware fijo (la máquina universal U, això és, el procesador) i software variable (la descripció \langle M \rangle, això és, el programa) nace aquí, en un article de matemática pura de 1936, una década abans del primer ordenador electrónico.

3.4. Implicacions: lo computable i lo incomputable

La máquina de Turing no només defineix qué se pot calcular, sinó que delimita qué no se pot. Turing demostró que el problema de la parada (decidir, dado un programa i una entrada, si la ejecució terminará o s'ejecutará indefinidamente) és indecidible: no existe ningún algoritmo general que lo resuelva. l'argumento és una diagonalització: si existiera un decisor H que resolviera la parada, podríamos construir un programa D que, aplicado a sí mateix, se detuviera si i només si no se detiene, contradicció. Aquest resultat no és una anécdota: el teorema de Rice lo generaliza afirmando que cualquier propiedad semántica no trivial dels programas (¿calcula aquesta funció una funció constante?, ¿produeix sempre una eixida vàlida?) és indecidible. d'ahí que els verificadores de software, els detectores de bucles infinitos, els analizadores de código muerto o els antivirus perfectos sean teóricamente imposibles en su forma general, i que les eines reales se conformen amb aproximacions conservadoras. Conviene transmitir al alumnat que la informática nace amb la consciència de sus propis límites, lo que la dignifica com disciplina científica i no meramente tècnica: és de les pocas ingenierías que conocen amb precisió matemática la frontera de lo impossible.

4. El modelo de von Neumann frente a la arquitectura Harvard

Si la máquina de Turing defineix qué és computable, la arquitectura de von Neumann defineix cómo organizar físicamente un ordenador de propósito general. Descrita en 1945 en el célebre «First Draft of a Report on the EDVAC», atribuido a John von Neumann però fruto del trabajo colectiu del equip del ENIAC (Eckert, Mauchly i altres), aquesta arquitectura sigue siendo, ochenta anys després, el patrón conceptual de la inmensa mayoría dels ordenadores.

4.1. Principios del modelo de von Neumann

El modelo s'asienta sobre quatre principios:

  1. Concepto de programa almacenado: les instruccions del programa se guardan en la memòria principal, igual que els datos. No hi ha distinció física entre unes i altres; ambdós són palabras binàries indistinguibles fuera de su contexto d'uso.
  2. Memòria única i direccionable: un espai de memòria lineal on cada celda posee una adreça, accesible para lectura i escritura.
  3. Ejecució secuencial: les instruccions s'ejecutan una tras altra en l'Orde en que residen en memòria, salvo que una instrucció de salt altere el flujo. Un registre especial, el contador de programa, mantiene la adreça de la siguiente instrucció.
  4. Estructura en quatre subsistemas: untat de control, untat aritmético-lógica, memòria i untats d'entrada/eixida, interconectados.

El modelo introduce una simplificació d'enorme valor: al tratar instruccions i datos por igual, un programa pot generar o modificar altre programa, lo que habilita compiladores, ensambladores, sistemas operatius i la carga dinámica de código. És la traducció ingenieril directa de la máquina universal de Turing. Ahora bien, eixa mateixa indistinció entre código i datos té una cara oscura: és la raíz última de famílies enteras de vulnerabiltats de segurtat, com els desbordaments de búfer que inyectan datos i aconsegueixen que la CPU els ejecute com código. Les contramedidas modernas —el bit de no ejecució (NX/XD), la aleatorització del espai d'adreces (ASLR) o les claves d'autenticació de punteros— poden entenderse com reintroduccions parciales i selectives de la separació Harvard en un mundo von Neumann, para acotar els peligros de tratar els datos com potenciales instruccions.

4.2. El cuello de botella de von Neumann

La memòria única conlleva una limitació estructural conocida com cuello de botella de von Neumann (von Neumann bottleneck), término acuñado por John Backus en su conferencia Turing de 1977. Com instruccions i datos comparten un mateix bus para viajar entre memòria i procesador, no poden transferirse simultáneamente: la CPU ha d'alternar entre buscar la instrucció i buscar els datos que aquesta manipula. A medida que els procesadores s'aceleraron molt més que les memorias, aquest cuello de botella se convirtió en el principal limitador del rendiment. És lo que a veces se denomina el muro de la memòria (memory wall): entre 1980 i 2010, la velocitat de la CPU creció a un ritme cercano al 50 % anual, mientras que la latencia de la DRAM apenas mejoraba un 7 % anual, abriendo una brecha de dos órdenes de magnitud. Hoy un acceso a memòria principal que falla en totes les cachés pot costar del Orde de 200 a 300 cicles de reloj, temps durant el cual un procesador superescalar moderno podría haber completado cientos d'operacions. Buena parte de la evolució arquitectónica posterior —memorias caché, segmentació, predicció de salts, ejecució fuera d'Orde, prebúsqueda— pot leerse com una batalla constante por mitigar aquesta restricció.

4.3. La arquitectura Harvard

La arquitectura Harvard, cuyo nombre proviene del computador electromecánico Harvard Mark I, separa físicamente la memòria d'instruccions de la memòria de datos, dotando a cada una de su propi bus. Esto permet buscar una instrucció i acceder a un dato en el mateix cicle, duplicando l'ancho de banda efectiu amb la memòria i eliminando, en gran medida, el cuello de botella.

Podemos cuantificar la ventaja amb un exemple sencillo. Supongamos un procesador amb un bus de datos de 64 bits (8 bytes) que opera a una frecuencia efectiva de transferencia de 2 \times 10^{9} transferencias por segundo. En una organització von Neumann pura amb un únic bus, l'ancho de banda màxim se reparte entre instruccions i datos:

BW = 8\ \text{bytes} \times 2\times 10^{9}\ \text{s}^{-1} = 16\ \text{GB/s (compartidos)}.

En una organització Harvard amb dos buses idénticos independientes, eixe mateix ancho de banda se duplica a 32 GB/s efectius, perquè instrucció i dato viajan en paralelo por caminos distintos. La diferencia, en un bucle apretado que consume una palabra de datos por instrucció, se traduce directamente en el doble de rendiment potencial.

La contrapartida és la pérdida de flexibilitat: al no compartir l'espai d'adreces, resulta més complex que un programa se trate a sí mateix com dato, i se duplican les líneas de memòria. Por ello, la arquitectura Harvard pura predomina en microcontroladores i procesadores de señal digital (DSP) —on el programa suele residir en memòria de només lectura i la separació és natural—, mientras que la von Neumann domina en els ordenadores de propósito general. En un microcontrolador para automoció o electrodomésticos, per exemple, el firmware se graba en memòria flash i els datos viven en RAM: la separació és intrínseca al problema.

La síntesis dominante hoy és la arquitectura Harvard modificada: els procesadores de propósito general presenten al programador un espai d'adreces únic (von Neumann), però internamente, en el nivell de la caché de primer nivell, separan caché d'instruccions (caché-I) i caché de datos (caché-D). Así obtienen el doble ancho de banda d'Harvard en la zona crítica próxima al núcleo, conservando la flexibilitat del modelo de programa almacenado. Aquesta hibridació és la norma en les microarquitecturas actuales, tanto de la família x86-64 com de les basadas en ARM i RISC-V.

Característica von Neumann Harvard pura
Memòria d'instruccions i datos Compartida Separada
Buses Un compartido Dos independientes
Acceso simultáneo instr./dato No
Programa com dato modificable Sencillo Difícil
Coste i complejtat de líneas Menor Major (duplicadas)
Àmbit típico Propósito general Microcontroladores, DSP
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 760 420" font-family="ui-sans-serif, system-ui, Arial, sans-serif"> <rect x="0" y="0" width="760" height="420" fill="#ffffff"/> <line x1="380" y1="20" x2="380" y2="400" stroke="#e2e8f0" stroke-width="1.5"/> <text x="190" y="42" text-anchor="middle" font-size="17" font-weight="700" fill="#0f172a">Arquitectura von Neumann</text> <rect x="100" y="70" width="180" height="56" rx="6" fill="#eff6ff" stroke="#334155" stroke-width="1.5"/> <text x="190" y="104" text-anchor="middle" font-size="15" font-weight="700" fill="#0f172a">CPU</text> <polygon points="190,130 183,144 197,144" fill="#2563eb"/> <line x1="190" y1="144" x2="190" y2="246" stroke="#2563eb" stroke-width="2.5"/> <polygon points="190,260 183,246 197,246" fill="#2563eb"/> <text x="204" y="200" text-anchor="start" font-size="11" font-style="italic" fill="#64748b">bus únic</text> <rect x="90" y="264" width="200" height="64" rx="6" fill="#f8fafc" stroke="#334155" stroke-width="1.5"/> <text x="190" y="290" text-anchor="middle" font-size="13" font-weight="700" fill="#0f172a">Memòria única</text> <text x="190" y="310" text-anchor="middle" font-size="11" fill="#334155">instruccions + dades</text> <text x="190" y="382" text-anchor="middle" font-size="10.5" font-style="italic" fill="#64748b">un sol camí → coll de botella</text> <text x="570" y="42" text-anchor="middle" font-size="17" font-weight="700" fill="#0f172a">Arquitectura Harvard</text> <rect x="475" y="70" width="190" height="40" rx="6" fill="#f8fafc" stroke="#334155" stroke-width="1.5"/> <text x="570" y="95" text-anchor="middle" font-size="12" fill="#0f172a">Memòria d'instruccions</text> <polygon points="570,114 563,128 577,128" fill="#2563eb"/> <line x1="570" y1="128" x2="570" y2="164" stroke="#2563eb" stroke-width="2.5"/> <polygon points="570,178 563,164 577,164" fill="#2563eb"/> <text x="584" y="150" text-anchor="start" font-size="10.5" font-style="italic" fill="#64748b">bus d'instruccions</text> <rect x="480" y="182" width="180" height="56" rx="6" fill="#eff6ff" stroke="#334155" stroke-width="1.5"/> <text x="570" y="216" text-anchor="middle" font-size="15" font-weight="700" fill="#0f172a">CPU</text> <polygon points="570,242 563,256 577,256" fill="#059669"/> <line x1="570" y1="256" x2="570" y2="292" stroke="#059669" stroke-width="2.5"/> <polygon points="570,306 563,292 577,292" fill="#059669"/> <text x="584" y="278" text-anchor="start" font-size="10.5" font-style="italic" fill="#64748b">bus de dades</text> <rect x="475" y="310" width="190" height="40" rx="6" fill="#f8fafc" stroke="#334155" stroke-width="1.5"/> <text x="570" y="335" text-anchor="middle" font-size="12" fill="#0f172a">Memòria de dades</text> <text x="570" y="382" text-anchor="middle" font-size="10.5" font-style="italic" fill="#64748b">dos camins → accés simultani</text> </svg>

Figura 3. Model de von Neumann (memòria i bus únics) enfront de l'arquitectura Harvard (memòries i busos separats).

5. La Untat Central de Procés (CPU): estructura i funcionament

La Untat Central de Procés o procesador és l'elemento funcional que interpreta i ejecuta les instruccions del programa; constituye el «cerebro» del ordenador. En la implementació física actual s'integra en un únic chip, el microprocesador, que pot contener varis núcleos (cores) capaces d'ejecutar flujos d'instruccions de forma independiente. La CPU s'organitza internamente en tres blocs funcionales: la untat de control, la untat aritmético-lógica i el banco de registres.

5.1. La Untat de Control (UC)

La Untat de Control dirige i coordina el funcionament de tot l'ordenador. Su misió és interpretar cada instrucció i generar la secuencia temporizada de señales de control que activan els demás componentes: ordena a la ALU qué operació realizar, als registres cuándo cargar o volcar su contingut, a la memòria cuándo leer o escribir, i als buses cómo encaminar la informació. Funciona sincronizada por la señal de reloj, un tren de pulsos que marca el ritme de les operacions; su frecuencia, medida en gigahercios, determina cuántos cicles por segundo ejecuta el procesador. A modo de referencia numérica, un reloj de 4 GHz impone un periodo de cicle de T = 1/(4\times10^{9}) = 0{,}25 nanosegundos; en eixe brevísimo intervalo la señal eléctrica, viajando a una fracció de la velocitat de la luz, recorre apenas uns centímetros, lo que ilustra por qué la miniaturització extrema és condició necessària para les altes frecuencias.

Existen dos grandes filosofías d'implementació de la UC:

  • Control cableado (hardwired): la lógica de control se construeix amb circuitos combinacionales i secuenciales fijos, típicamente una máquina d'estats finitos. És rápido i eficiente, però rígido i difícil de modificar. Predomina en arquitecturas RISC, amb conjuntos d'instruccions reducidos i regulares.
  • Control microprogramado: cada instrucció de máquina se descompone en una secuencia de microinstruccions almacenadas en una memòria de control interna (la microcódigo). És flexible i facilita instruccions complejas, a més de permitir corregir errors del procesador mitjançant actualitzacions de microcódigo cargadas por el firmware. Su coste és cierta lentitud añadida. És característico d'arquitecturas CISC, com la x86 clásica, que internamente traduce sus instruccions complejas a microoperacions (micro-ops) de tipus RISC ejecutadas por un núcleo d'ejecució molt segmentado.

5.2. RISC frente a CISC

La distinció entre CISC (Complex Instruction Set Computer) i RISC (Reduced Instruction Set Computer) és una de les grandes dicotomías de la arquitectura i suele ser objecte de pregunta. La filosofía CISC, encarnada por la família x86, ofrece un repertorio amplio d'instruccions potentes, de longitud variable, capaces d'operar directamente sobre memòria i de realizar en una sola instrucció tasques complejas; nació quan la memòria era escasa i cara i el código compacto resultaba valioso. La filosofía RISC, formulada a comienzos dels anys ochenta por Patterson i por Hennessy, parte de la observació de que els compiladores apenas usaban les instruccions complejas i de que un repertorio pequeño, regular i de longitud fija se segmenta amb molta major faciltat. Sus rasgos característicos són les instruccions de tamaño uniforme, el modelo carga/emmagatzematge (només instruccions específiques acceden a memòria i el resto operan únicamente entre registres), un banco de registres amplio i modos de direccionament sencillos.

Rasgo CISC (p. ej. x86) RISC (p. ej. ARM, RISC-V)
Nombre d'instruccions Elevado Reducido
Longitud d'instrucció Variable Fija (o casi)
Acceso a memòria Moltes instruccions Només carga/emmagatzematge
Modos de direccionament Numerosos Pocos
Registres de propósito general Pocos (históricamente) Molts
Implementació de la UC Microprogramada Cableada
Segmentació Difícil Natural

La frontera s'ha difuminado: els procesadores x86 modernos són CISC de cara al programador però RISC en su interior, pues descomponen cada instrucció complexa en micro-ops sencillas. Aun así, la arquitectura del repertorio (la ISA visible) sigue determinando aspectos de compatibiltat, licenciament i ecosistema que explican por qué ARM domina la computació móvil i por qué RISC-V, al ser oberta, gana terreno en sistemas empotrados i aceleradores.

5.3. La Untat Aritmético-Lógica (ALU)

La Untat Aritmético-Lógica és el circuito combinacional encargado de realizar les operacions de cálculo: aritméticas (suma, resta, i en procesadores més complejos multiplicació i divisió) i lógicas (AND, OR, NOT, XOR), a més de desplazaments i comparacions. Recibe un o dos operandos, una señal que selecciona la operació, i produeix un resultat juntament amb una serie de indicadores d'estat o flags que s'almacenan en el registre d'estat: bit de zero (Z), d'acarreo (C, carry), de signo (N), de desbordament (V, overflow) i de partat, entre altres. Aquests indicadores són esenciales para les instruccions de salt condicional, pues permeten al programa tomar decisions segons el resultat d'operacions previas.

Conviene precisar la diferencia entre acarreo i desbordament, matiz que separa una respuesta correcta d'una excelente. El acarreo señala que el resultat excede el rango de la aritmética sense signo, mientras que el desbordament señala que excede el rango de la aritmética en complemento a dos. Amb 8 bits, sumar 0111 1111 (127) i 0000 0001 (1) produeix 1000 0000: sense signo el resultat (128) és correcte i no hi ha acarreo, però en complemento a dos representa −128, un resultat erróneo respecto a la suma esperada de 128, de modo que s'activa el desbordament. La ALU calcula ambdós indicadores simultáneamente i és el programa —a través del compilador— quien decide cuál interpretar segons el tipus de dato. La condició de desbordament en complemento a dos pot expresarse compactamente com la desigualdad entre l'acarreo d'entrada i el d'eixida del bit de signo:

V = C_{n-1} \oplus C_{n},

on \oplus denota la operació XOR i C_i és l'acarreo cap al bit i.

Les operacions en coma flotante, segons l'estándar IEEE 754, suelen delegarse en una untat especializada, la FPU (Floating Point Unit), i les operacions sobre vectores en untats SIMD (Single Instruction, Multiple Data), com les extensions SSE i AVX en x86 o NEON i SVE en ARM. Conceptualmente, totes són ampliacions de la funció bàsica de la ALU. En els procesadores contemporáneos coexisten, a més, untats matriciales i de multiplicació-acumulació optimizadas para inteligencia artificial (les llamadas tensor o matrix units), que aceleran el producto de matrices en baixa precisió.

5.4. Els registres

Els registres són celdas de memòria d'altísima velocitat, internes a la CPU, que almacenan temporalmente datos, adreces i instruccions en curs. Su acceso és prácticamente instantáneo, sense la latencia de la memòria principal. Se distinguen:

  • Registres visibles al programador o de propósito general, que albergan operandos i resultats intermedios.
  • Registres especializados, entre els que destacan:
    • Contador de Programa (PC) o registre d'instrucció siguiente: conté la adreça de la próxima instrucció a ejecutar.
    • Registre d'Instrucció (IR): almacena la instrucció que està siendo decodificada i ejecutada.
    • Registre d'Adreça de Memòria (MAR): conté la adreça a la que se va a acceder en memòria.
    • Registre de Datos de Memòria (MDR o MBR): actúa com búfer del dato que se lee o escribe en memòria.
    • Acumulador: en arquitecturas clásicas, registre on la ALU deposita resultats.
    • Registre d'Estat o de banderas: alberga els flags generados por la ALU.
    • Puntero de Pila (SP): apunta a la cima de la pila del sistema, fundamental para la gestión de subrutinas i interrupcions.

Conviene distinguir els registres arquitectónicos —els que la ISA fa visibles i que el programador d'ensamblador manipula— dels registres físicos, molt més numerosos, que l'hardware emplea internamente. Mitjançant la tècnica de renombrament de registres (register renaming), un procesador fuera d'Orde asocia dinámicamente cada registre arquitectónico a distintos registres físicos, eliminando dependencias falsas (de nombre) i permitiendo que instruccions que només comparten el nombre d'un registre, però no una dependencia real de datos, s'ejecuten en paralelo. Un núcleo x86 actual pot exponer 16 registres de propósito general i disponer, no obstant això, de més de 150 registres físicos interns.

El modelo d'ejecució d'una ISA se clasifica segons dónde residen els operandos: máquinas de acumulador (un operando implícito), de pila (operandos en la cima d'una pila, com la máquina virtual de Java), de registre-memòria (un operando pot estar en memòria, típico de x86) i de registre-registre o carga/emmagatzematge (els operandos aritméticos han d'estar en registres, típico de RISC). Aquesta clasificació condiciona el nombre d'accesos a memòria por instrucció i, amb ello, el rendiment.

El conjunto d'instruccions que la CPU pot ejecutar, juntament amb sus formatos, modos de direccionament i registres visibles, constituye la Arquitectura del Conjunto d'Instruccions (ISA), la frontera precisa entre l'hardware i el software: és el contrato que garanteix que un mateix binari funcione en implementacions molt distintas de la mateixa família. Ha de distinguirse de la microarquitectura, que és la realització concreta d'eixa ISA (nombre d'etapes del cauce, tamaño de les cachés, untats d'ejecució). Exemples vigentes d'ISA són x86-64, ARM (AArch64) i la arquitectura oberta RISC-V, que ha ganado relevancia notable por su carácter libre i modular. Un matiz adicional de rigor és la ordenació de bytes o endianness: en el formato little-endian (x86, RISC-V) el byte menys significatiu ocupa la adreça més baixa, mientras que en big-endian (habitual en protocolos de xarxa) ocurre lo contrari; ignorarlo és fuente clásica d'errors al intercambiar datos binaris entre sistemas.

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 780 510" font-family="ui-sans-serif, system-ui, Arial, sans-serif"> <rect x="140" y="40" width="480" height="440" rx="10" fill="#f8fafc" stroke="#334155" stroke-width="2"/> <text x="380" y="66" text-anchor="middle" font-size="17" font-weight="700" fill="#0f172a">CPU (microprocessador)</text> <rect x="160" y="95" width="170" height="80" rx="8" fill="#eff6ff" stroke="#2563eb" stroke-width="1.5"/> <text x="245" y="120" text-anchor="middle" font-size="12" font-weight="700" fill="#0f172a">Unitat de Control (UC)</text> <text x="245" y="141" text-anchor="middle" font-size="11" fill="#64748b">seqüencia i descodifica</text> <text x="245" y="157" text-anchor="middle" font-size="11" fill="#64748b">instruccions</text> <rect x="430" y="95" width="175" height="80" rx="8" fill="#eff6ff" stroke="#2563eb" stroke-width="1.5"/> <text x="517" y="124" text-anchor="middle" font-size="14" font-weight="700" fill="#0f172a">ALU</text> <text x="517" y="144" text-anchor="middle" font-size="11" fill="#64748b">Unitat Aritmètica-Lògica</text> <rect x="455" y="187" width="125" height="30" rx="6" fill="#fef3c7" stroke="#64748b" stroke-width="1.2"/> <text x="517" y="207" text-anchor="middle" font-size="12" font-weight="700" fill="#0f172a">flags: Z N C V</text> <line x1="330" y1="135" x2="421" y2="135" stroke="#334155" stroke-width="1.5" stroke-dasharray="5,4"/> <polygon points="430,135 420,130 420,140" fill="#334155"/> <text x="380" y="105" text-anchor="middle" font-size="10.5" font-style="italic" fill="#059669">senyals de</text> <text x="380" y="120" text-anchor="middle" font-size="10.5" font-style="italic" fill="#059669">control</text> <line x1="245" y1="175" x2="245" y2="290" stroke="#334155" stroke-width="1.5"/> <polygon points="245,300 240,290 250,290" fill="#334155"/> <text x="235" y="240" text-anchor="end" font-size="10.5" font-style="italic" fill="#059669">control</text> <line x1="445" y1="185" x2="445" y2="290" stroke="#334155" stroke-width="1.5"/> <polygon points="445,175 440,187 450,187" fill="#334155"/> <polygon points="445,300 440,288 450,288" fill="#334155"/> <text x="437" y="235" text-anchor="end" font-size="10.5" font-style="italic" fill="#2563eb">operands /</text> <text x="437" y="250" text-anchor="end" font-size="10.5" font-style="italic" fill="#2563eb">resultat</text> <rect x="160" y="300" width="440" height="165" rx="8" fill="#ecfdf5" stroke="#059669" stroke-width="1.5"/> <text x="380" y="325" text-anchor="middle" font-size="14" font-weight="700" fill="#0f172a">Banc de registres</text> <rect x="175" y="340" width="95" height="32" rx="5" fill="#f8fafc" stroke="#64748b" stroke-width="1"/> <text x="222" y="361" text-anchor="middle" font-size="13" font-weight="700" fill="#0f172a">PC</text> <rect x="280" y="340" width="95" height="32" rx="5" fill="#f8fafc" stroke="#64748b" stroke-width="1"/> <text x="327" y="361" text-anchor="middle" font-size="13" font-weight="700" fill="#0f172a">IR</text> <rect x="385" y="340" width="95" height="32" rx="5" fill="#f8fafc" stroke="#64748b" stroke-width="1"/> <text x="432" y="361" text-anchor="middle" font-size="13" font-weight="700" fill="#0f172a">MAR</text> <rect x="490" y="340" width="95" height="32" rx="5" fill="#f8fafc" stroke="#64748b" stroke-width="1"/> <text x="537" y="361" text-anchor="middle" font-size="13" font-weight="700" fill="#0f172a">MDR</text> <rect x="175" y="382" width="95" height="32" rx="5" fill="#f8fafc" stroke="#64748b" stroke-width="1"/> <text x="222" y="403" text-anchor="middle" font-size="13" font-weight="700" fill="#0f172a">ACC</text> <rect x="280" y="382" width="95" height="32" rx="5" fill="#f8fafc" stroke="#64748b" stroke-width="1"/> <text x="327" y="403" text-anchor="middle" font-size="13" font-weight="700" fill="#0f172a">SP</text> <rect x="385" y="382" width="200" height="32" rx="5" fill="#f8fafc" stroke="#64748b" stroke-width="1"/> <text x="485" y="403" text-anchor="middle" font-size="13" font-weight="700" fill="#0f172a">Estat</text> <rect x="175" y="424" width="410" height="32" rx="5" fill="#eff6ff" stroke="#64748b" stroke-width="1"/> <text x="380" y="445" text-anchor="middle" font-size="13" font-weight="700" fill="#0f172a">R0 ... Rn (propòsit general)</text> <polyline points="25,111 25,95 45,95 45,127 65,127 65,95 85,95 85,127 105,127 105,111" fill="none" stroke="#334155" stroke-width="1.8"/> <text x="65" y="147" text-anchor="middle" font-size="12" font-weight="700" fill="#0f172a">rellotge</text> <line x1="105" y1="111" x2="150" y2="111" stroke="#334155" stroke-width="1.5"/> <polygon points="160,111 150,106 150,116" fill="#334155"/> <line x1="620" y1="260" x2="743" y2="260" stroke="#334155" stroke-width="1.8"/> <polygon points="755,260 743,255 743,265" fill="#334155"/> <text x="692" y="228" text-anchor="middle" font-size="11" font-style="italic" fill="#64748b">cap a memòria i E/S</text> <text x="692" y="244" text-anchor="middle" font-size="11" font-style="italic" fill="#64748b">(busos)</text> </svg>

Figura 4. Estructura interna de la CPU: unitat de control, ALU i banc de registres (PC, IR, MAR, MDR, ACC, SP, estat…), governats pel rellotge.

6. El cicle d'instrucció: búsqueda, decodificació i ejecució

El funcionament de la CPU se reduce, en su nivell més esencial, a la repetició incesante d'un cicle d'instrucció (també llamado cicle de máquina o cicle fetch-decode-execute). Aquest cicle és la realització física del comportament pas a pas de la máquina de Turing i constituye el latido del ordenador.

6.1. Fases del cicle

El cicle se descompone en tres fases fundamentales, que poden detallarse así:

  1. Búsqueda (fetch): la Untat de Control toma la adreça contenida en el Contador de Programa, la coloca en el Registre d'Adreça de Memòria i emite una señal de lectura. La memòria devuelve la instrucció, que s'aloja en el Registre de Datos de Memòria i, des d'ahí, en el Registre d'Instrucció. Acto seguido, el Contador de Programa se incrementa para apuntar a la siguiente instrucció.
  2. Decodificació (decode): la Untat de Control interpreta el código d'operació de la instrucció alojada en el Registre d'Instrucció, determina qué acció ha de realizarse i localiza els operandos segons el modo de direccionament indicado (inmediato, directe, indirecte, por registre, indexado, relatiu, etc.). Si els operandos estan en memòria, s'efectúan els accesos necessaris.
  3. Ejecució (execute): se lleva a cabo la operació. Si és aritmético-lógica, la ALU la realiza i deposita el resultat en el registre destinació, actualizando els indicadores d'estat. Si és una transferencia, se mueven datos entre registres o memòria. Si és un salt, se modifica el Contador de Programa para alterar el flujo secuencial.

És ilustratiu describir la fase de búsqueda amb notació de transferencia entre registres (RTL), que sintetitza amb precisió les microoperacions implicadas:

\text{MAR} \leftarrow \text{PC}; \quad \text{MDR} \leftarrow \text{Mem[MAR]}; \quad \text{IR} \leftarrow \text{MDR}; \quad \text{PC} \leftarrow \text{PC} + \ell,

on \ell és la longitud de la instrucció en untats direccionables (per exemple, 4 bytes en una ISA RISC d'instruccions fijas). Consideremos, com exemple completo, la ejecució d'una instrucció de suma ADD R1, R2, R3 (que calcula R1 ← R2 + R3): tras la búsqueda anterior, la decodificació identifica el código d'operació de suma i els tres registres; la ejecució encamina R2 i R3 a les entrades de la ALU, selecciona la operació de suma, i el resultat s'escribe en R1 mientras s'actualizan els flags. Ninguna d'aquestes microoperacions accede a memòria de datos, lo que explica por qué les instruccions aritméticas RISC són tan veloces i regulares.

Algunos autores añaden una cuarta fase de escritura del resultat (write-back) i una fase de comprobació d'interrupcions, en la que la CPU verifica si algún dispositiu solicita atenció abans d'iniciar el siguiente cicle. Concluido el cicle, comienza de nou amb la instrucció que ahora señala el Contador de Programa, indefinidamente, fins a que una instrucció de parada o el sistema operatiu detengan el procés.

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 720 560" font-family="ui-sans-serif, system-ui, Arial, sans-serif"> <rect x="0" y="0" width="720" height="560" fill="#ffffff"/> <text x="360" y="34" text-anchor="middle" font-size="17" font-weight="700" fill="#0f172a">Cicle d'instrucció (fetch · decode · execute)</text> <text x="360" y="54" text-anchor="middle" font-size="11" fill="#64748b">bucle tancat: es repeteix per cada instrucció</text> <!-- Caja 1: BUSQUEDA (arriba) --> <rect x="190" y="80" width="340" height="100" rx="8" fill="#eff6ff" stroke="#2563eb" stroke-width="1.5"/> <rect x="206" y="96" width="26" height="26" rx="13" fill="#2563eb"/> <text x="219" y="114" text-anchor="middle" font-size="15" font-weight="700" fill="#ffffff">1</text> <text x="360" y="115" text-anchor="middle" font-size="14" font-weight="700" fill="#0f172a">CERCA (fetch)</text> <text x="360" y="138" text-anchor="middle" font-size="12" fill="#334155">PC → MAR; llegir memòria;</text> <text x="360" y="156" text-anchor="middle" font-size="12" fill="#334155">MBR → IR; PC ← PC + 1</text> <!-- Caja 2: DECODIFICACION (derecha) --> <rect x="450" y="230" width="250" height="100" rx="8" fill="#f8fafc" stroke="#334155" stroke-width="1.5"/> <rect x="466" y="246" width="26" height="26" rx="13" fill="#334155"/> <text x="479" y="264" text-anchor="middle" font-size="15" font-weight="700" fill="#ffffff">2</text> <text x="575" y="265" text-anchor="middle" font-size="14" font-weight="700" fill="#0f172a">DESCODIFICACIÓ</text> <text x="575" y="288" text-anchor="middle" font-size="12" fill="#334155">interpretar codi d'</text> <text x="575" y="306" text-anchor="middle" font-size="12" fill="#334155">operació; localitzar operands</text> <!-- Caja 3: EJECUCION (abajo) --> <rect x="190" y="380" width="340" height="100" rx="8" fill="#ecfdf5" stroke="#059669" stroke-width="1.5"/> <rect x="206" y="396" width="26" height="26" rx="13" fill="#059669"/> <text x="219" y="414" text-anchor="middle" font-size="15" font-weight="700" fill="#ffffff">3</text> <text x="360" y="415" text-anchor="middle" font-size="14" font-weight="700" fill="#0f172a">EXECUCIÓ (execute)</text> <text x="360" y="438" text-anchor="middle" font-size="12" fill="#334155">l'ALU opera / transferència / salt;</text> <text x="360" y="456" text-anchor="middle" font-size="12" fill="#334155">actualitzar flags</text> <!-- Caja pequeña: comprobacion (izquierda) --> <rect x="20" y="230" width="200" height="100" rx="8" fill="#fef3c7" stroke="#d97706" stroke-width="1.5"/> <text x="120" y="272" text-anchor="middle" font-size="13" font-weight="700" fill="#0f172a">interrupció</text> <text x="120" y="292" text-anchor="middle" font-size="13" font-weight="700" fill="#0f172a">pendent?</text> <!-- Flecha 1 -> 2 --> <path d="M 530 150 C 620 160 660 190 660 226" fill="none" stroke="#334155" stroke-width="2"/> <polygon points="660,234 654,222 666,222" fill="#334155"/> <!-- Flecha 2 -> 3 --> <path d="M 575 330 C 575 366 510 374 470 376" fill="none" stroke="#334155" stroke-width="2"/> <polygon points="462,376 474,370 474,382" fill="#334155"/> <!-- Flecha 3 -> comprobacion --> <path d="M 190 414 C 110 414 80 380 90 334" fill="none" stroke="#334155" stroke-width="2"/> <polygon points="92,326 98,338 86,338" fill="#334155"/> <!-- Flecha comprobacion -> 1 (retorno / repetir) --> <path d="M 120 230 C 120 150 130 120 186 112" fill="none" stroke="#2563eb" stroke-width="2.2"/> <polygon points="194,111 182,105 183,117" fill="#2563eb"/> <!-- Etiqueta repetir sobre la flecha de retorno --> <rect x="44" y="150" width="118" height="44" rx="6" fill="#eff6ff" stroke="#2563eb" stroke-width="1.2"/> <path d="M 62 165 a 9 9 0 1 1 -3 -6" fill="none" stroke="#2563eb" stroke-width="2"/> <polygon points="60,156 66,162 56,164" fill="#2563eb"/> <text x="112" y="170" text-anchor="middle" font-size="13" font-weight="700" fill="#2563eb">↻ repetir</text> <text x="103" y="187" text-anchor="middle" font-size="10" fill="#64748b">següent instrucció</text> </svg>

Figura 5. El cicle d'instrucció com a bucle: cerca (fetch), descodificació (decode) i execució (execute), amb comprovació d'interrupcions.

6.2. La ecuació del rendiment

Para razonar cuantitativamente sobre la velocitat d'un procesador s'emplea la llamada ecuació fundamental del rendiment o «llei d'hierro» (iron law), que expresa el temps de CPU d'un programa com producto de tres factors:

T_{\text{CPU}} = N_{\text{instr}} \times \text{CPI} \times T_{\text{ciclo}},

on N_{\text{instr}} és el nombre d'instruccions ejecutadas, CPI és el nombre medi de cicles por instrucció i T_{\text{ciclo}} és el periodo de reloj. Aquesta descomposició és didácticamente valiosísima perquè mostra que cada factor està gobernado por una capa distinta: N_{\text{instr}} depende del algoritmo, del compilador i de la ISA; el CPI depende de la microarquitectura (segmentació, cachés, ejecució superescalar); i T_{\text{ciclo}} depende de la tecnología de fabricació i de la frecuencia. Optimizar el rendiment exige actuar sobre els tres, i mejorar un a costa d'empeorar altre pot ser contraproducente. Per exemple, una ISA CISC reduce N_{\text{instr}} però tiende a aumentar el CPI; una RISC fa lo contrari. Com exemple numérico, un programa de 10^{9} instruccions amb un CPI de 1,5 en un procesador a 4 GHz tarda 10^{9} \times 1{,}5 \times 0{,}25\,\text{ns} = 0{,}375 segundos.

6.3. Interrupcions

El mecanismo de interrupció permet que un suceso extern o intern (la finalització d'una operació d'I/S, un error aritmético, una señal de reloj) interrumpa la ejecució normal. La CPU guarda su estat —el Contador de Programa i els registres pertinentes en la pila—, atiende la rutina de servicio d'interrupció i, al terminar, restaura l'estat i reanuda el programa interrumpido. Les interrupcions són el fundamento de la multitarea, de la respuesta a esdeveniments i de la comunicació eficiente amb els periféricos, pues evitan la espera activa (consultar repetidamente si un dispositiu està listo) en favor d'una atenció sota demanda.

Conviene distinguir tres categorías, que un tribunal aprecia bien delimitadas. Les interrupcions hardware proceden de dispositius externs i són asíncronas respecto al programa. Les excepcions o interrupcions internes les genera la pròpia CPU al detectar una condició durant la ejecució (una divisió por zero, un fallada de pàgina, un acceso a memòria no permitido). I les llamadas al sistema o interrupcions software (syscall, trap) les provoca deliberadamente el programa para solicitar un servicio al sistema operatiu, i són el mecanismo que separa el modo usuari del modo privilegiado o supervisor, piedra angular de la protecció. Quan concurren vàries, un controlador d'interrupcions les prioriza i pot encadenar interrupcions anidadas.

6.4. Segmentació i paralelismo

Ejecutar les fases de manera estrictamente secuencial desaprovecha l'hardware, pues mientras se decodifica una instrucció la untat de búsqueda està ociosa. La segmentació (pipelining) solapa la ejecució de vàries instruccions, de modo que mientras una s'ejecuta, la siguiente se decodifica i la tercera se busca, a la manera d'una cadena de montatge. El cauce clásico RISC de cinc etapes —búsqueda d'instrucció (IF), decodificació i lectura de registres (ID), ejecució en la ALU (EX), acceso a memòria (MEM) i escritura de resultat (WB)— idealmente finaliza una instrucció por cicle una vez lleno el cauce, encara que cada instrucció individual sigue tardando cinc cicles en atravesarlo. La ganancia teórica d'un cauce de k etapes s'aproxima al factor k para un nombre grande d'instruccions, pues el temps d'ejecutar n instruccions pasa de n\cdot k cicles (secuencial) a k + (n-1) cicles (segmentado).

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 740 420" font-family="ui-sans-serif, system-ui, Arial, sans-serif"> <text x="370" y="26" text-anchor="middle" font-size="17" font-weight="700" fill="#0f172a">Cronograma del canal segmentat (5 etapes)</text> <text x="406" y="52" text-anchor="middle" font-size="12" font-weight="700" fill="#334155">Cicle de rellotge &#8594;</text> <rect x="40" y="65" width="60" height="30" rx="3" fill="#f8fafc" stroke="#e2e8f0" stroke-width="1"/> <text x="70" y="85" text-anchor="middle" font-size="11" font-weight="700" fill="#334155">Instr.</text> <rect x="100" y="65" width="68" height="30" fill="#f8fafc" stroke="#e2e8f0" stroke-width="1"/> <text x="134" y="85" text-anchor="middle" font-size="12" font-weight="700" fill="#0f172a">1</text> <rect x="168" y="65" width="68" height="30" fill="#f8fafc" stroke="#e2e8f0" stroke-width="1"/> <text x="202" y="85" text-anchor="middle" font-size="12" font-weight="700" fill="#0f172a">2</text> <rect x="236" y="65" width="68" height="30" fill="#f8fafc" stroke="#e2e8f0" stroke-width="1"/> <text x="270" y="85" text-anchor="middle" font-size="12" font-weight="700" fill="#0f172a">3</text> <rect x="304" y="65" width="68" height="30" fill="#f8fafc" stroke="#e2e8f0" stroke-width="1"/> <text x="338" y="85" text-anchor="middle" font-size="12" font-weight="700" fill="#0f172a">4</text> <rect x="372" y="65" width="68" height="30" fill="#fef3c7" stroke="#e2e8f0" stroke-width="1"/> <text x="406" y="85" text-anchor="middle" font-size="12" font-weight="700" fill="#0f172a">5</text> <rect x="440" y="65" width="68" height="30" fill="#f8fafc" stroke="#e2e8f0" stroke-width="1"/> <text x="474" y="85" text-anchor="middle" font-size="12" font-weight="700" fill="#0f172a">6</text> <rect x="508" y="65" width="68" height="30" fill="#f8fafc" stroke="#e2e8f0" stroke-width="1"/> <text x="542" y="85" text-anchor="middle" font-size="12" font-weight="700" fill="#0f172a">7</text> <rect x="576" y="65" width="68" height="30" fill="#f8fafc" stroke="#e2e8f0" stroke-width="1"/> <text x="610" y="85" text-anchor="middle" font-size="12" font-weight="700" fill="#0f172a">8</text> <rect x="644" y="65" width="68" height="30" fill="#f8fafc" stroke="#e2e8f0" stroke-width="1"/> <text x="678" y="85" text-anchor="middle" font-size="12" font-weight="700" fill="#0f172a">9</text> <line x1="100" y1="95" x2="100" y2="295" stroke="#e2e8f0" stroke-width="1"/> <line x1="168" y1="95" x2="168" y2="295" stroke="#e2e8f0" stroke-width="1"/> <line x1="236" y1="95" x2="236" y2="295" stroke="#e2e8f0" stroke-width="1"/> <line x1="304" y1="95" x2="304" y2="295" stroke="#e2e8f0" stroke-width="1"/> <line x1="372" y1="95" x2="372" y2="295" stroke="#e2e8f0" stroke-width="1"/> <line x1="440" y1="95" x2="440" y2="295" stroke="#e2e8f0" stroke-width="1"/> <line x1="508" y1="95" x2="508" y2="295" stroke="#e2e8f0" stroke-width="1"/> <line x1="576" y1="95" x2="576" y2="295" stroke="#e2e8f0" stroke-width="1"/> <line x1="644" y1="95" x2="644" y2="295" stroke="#e2e8f0" stroke-width="1"/> <line x1="712" y1="95" x2="712" y2="295" stroke="#e2e8f0" stroke-width="1"/> <line x1="100" y1="95" x2="712" y2="95" stroke="#e2e8f0" stroke-width="1"/> <line x1="100" y1="135" x2="712" y2="135" stroke="#e2e8f0" stroke-width="1"/> <line x1="100" y1="175" x2="712" y2="175" stroke="#e2e8f0" stroke-width="1"/> <line x1="100" y1="215" x2="712" y2="215" stroke="#e2e8f0" stroke-width="1"/> <line x1="100" y1="255" x2="712" y2="255" stroke="#e2e8f0" stroke-width="1"/> <line x1="100" y1="295" x2="712" y2="295" stroke="#e2e8f0" stroke-width="1"/> <rect x="40" y="95" width="60" height="40" fill="#eff6ff" stroke="#334155" stroke-width="1.2"/> <text x="70" y="120" text-anchor="middle" font-size="13" font-weight="700" fill="#0f172a">I1</text> <rect x="40" y="135" width="60" height="40" fill="#eff6ff" stroke="#334155" stroke-width="1.2"/> <text x="70" y="160" text-anchor="middle" font-size="13" font-weight="700" fill="#0f172a">I2</text> <rect x="40" y="175" width="60" height="40" fill="#eff6ff" stroke="#334155" stroke-width="1.2"/> <text x="70" y="200" text-anchor="middle" font-size="13" font-weight="700" fill="#0f172a">I3</text> <rect x="40" y="215" width="60" height="40" fill="#eff6ff" stroke="#334155" stroke-width="1.2"/> <text x="70" y="240" text-anchor="middle" font-size="13" font-weight="700" fill="#0f172a">I4</text> <rect x="40" y="255" width="60" height="40" fill="#eff6ff" stroke="#334155" stroke-width="1.2"/> <text x="70" y="280" text-anchor="middle" font-size="13" font-weight="700" fill="#0f172a">I5</text> <rect x="100" y="95" width="68" height="40" fill="#eff6ff" stroke="#334155" stroke-width="1.2"/> <text x="134" y="119" text-anchor="middle" font-size="12" font-weight="700" fill="#0f172a">IF</text> <rect x="168" y="95" width="68" height="40" fill="#ecfdf5" stroke="#334155" stroke-width="1.2"/> <text x="202" y="119" text-anchor="middle" font-size="12" font-weight="700" fill="#0f172a">ID</text> <rect x="236" y="95" width="68" height="40" fill="#fef3c7" stroke="#334155" stroke-width="1.2"/> <text x="270" y="119" text-anchor="middle" font-size="12" font-weight="700" fill="#0f172a">EX</text> <rect x="304" y="95" width="68" height="40" fill="#ea580c" opacity="0.15"/> <rect x="304" y="95" width="68" height="40" fill="none" stroke="#334155" stroke-width="1.2"/> <text x="338" y="119" text-anchor="middle" font-size="12" font-weight="700" fill="#0f172a">MEM</text> <rect x="372" y="95" width="68" height="40" fill="#64748b" opacity="0.18"/> <rect x="372" y="95" width="68" height="40" fill="none" stroke="#334155" stroke-width="1.2"/> <text x="406" y="119" text-anchor="middle" font-size="12" font-weight="700" fill="#0f172a">WB</text> <rect x="168" y="135" width="68" height="40" fill="#eff6ff" stroke="#334155" stroke-width="1.2"/> <text x="202" y="159" text-anchor="middle" font-size="12" font-weight="700" fill="#0f172a">IF</text> <rect x="236" y="135" width="68" height="40" fill="#ecfdf5" stroke="#334155" stroke-width="1.2"/> <text x="270" y="159" text-anchor="middle" font-size="12" font-weight="700" fill="#0f172a">ID</text> <rect x="304" y="135" width="68" height="40" fill="#fef3c7" stroke="#334155" stroke-width="1.2"/> <text x="338" y="159" text-anchor="middle" font-size="12" font-weight="700" fill="#0f172a">EX</text> <rect x="372" y="135" width="68" height="40" fill="#ea580c" opacity="0.15"/> <rect x="372" y="135" width="68" height="40" fill="none" stroke="#334155" stroke-width="1.2"/> <text x="406" y="159" text-anchor="middle" font-size="12" font-weight="700" fill="#0f172a">MEM</text> <rect x="440" y="135" width="68" height="40" fill="#64748b" opacity="0.18"/> <rect x="440" y="135" width="68" height="40" fill="none" stroke="#334155" stroke-width="1.2"/> <text x="474" y="159" text-anchor="middle" font-size="12" font-weight="700" fill="#0f172a">WB</text> <rect x="236" y="175" width="68" height="40" fill="#eff6ff" stroke="#334155" stroke-width="1.2"/> <text x="270" y="199" text-anchor="middle" font-size="12" font-weight="700" fill="#0f172a">IF</text> <rect x="304" y="175" width="68" height="40" fill="#ecfdf5" stroke="#334155" stroke-width="1.2"/> <text x="338" y="199" text-anchor="middle" font-size="12" font-weight="700" fill="#0f172a">ID</text> <rect x="372" y="175" width="68" height="40" fill="#fef3c7" stroke="#334155" stroke-width="1.2"/> <text x="406" y="199" text-anchor="middle" font-size="12" font-weight="700" fill="#0f172a">EX</text> <rect x="440" y="175" width="68" height="40" fill="#ea580c" opacity="0.15"/> <rect x="440" y="175" width="68" height="40" fill="none" stroke="#334155" stroke-width="1.2"/> <text x="474" y="199" text-anchor="middle" font-size="12" font-weight="700" fill="#0f172a">MEM</text> <rect x="508" y="175" width="68" height="40" fill="#64748b" opacity="0.18"/> <rect x="508" y="175" width="68" height="40" fill="none" stroke="#334155" stroke-width="1.2"/> <text x="542" y="199" text-anchor="middle" font-size="12" font-weight="700" fill="#0f172a">WB</text> <rect x="304" y="215" width="68" height="40" fill="#eff6ff" stroke="#334155" stroke-width="1.2"/> <text x="338" y="239" text-anchor="middle" font-size="12" font-weight="700" fill="#0f172a">IF</text> <rect x="372" y="215" width="68" height="40" fill="#ecfdf5" stroke="#334155" stroke-width="1.2"/> <text x="406" y="239" text-anchor="middle" font-size="12" font-weight="700" fill="#0f172a">ID</text> <rect x="440" y="215" width="68" height="40" fill="#fef3c7" stroke="#334155" stroke-width="1.2"/> <text x="474" y="239" text-anchor="middle" font-size="12" font-weight="700" fill="#0f172a">EX</text> <rect x="508" y="215" width="68" height="40" fill="#ea580c" opacity="0.15"/> <rect x="508" y="215" width="68" height="40" fill="none" stroke="#334155" stroke-width="1.2"/> <text x="542" y="239" text-anchor="middle" font-size="12" font-weight="700" fill="#0f172a">MEM</text> <rect x="576" y="215" width="68" height="40" fill="#64748b" opacity="0.18"/> <rect x="576" y="215" width="68" height="40" fill="none" stroke="#334155" stroke-width="1.2"/> <text x="610" y="239" text-anchor="middle" font-size="12" font-weight="700" fill="#0f172a">WB</text> <rect x="372" y="255" width="68" height="40" fill="#eff6ff" stroke="#334155" stroke-width="1.2"/> <text x="406" y="279" text-anchor="middle" font-size="12" font-weight="700" fill="#0f172a">IF</text> <rect x="440" y="255" width="68" height="40" fill="#ecfdf5" stroke="#334155" stroke-width="1.2"/> <text x="474" y="279" text-anchor="middle" font-size="12" font-weight="700" fill="#0f172a">ID</text> <rect x="508" y="255" width="68" height="40" fill="#fef3c7" stroke="#334155" stroke-width="1.2"/> <text x="542" y="279" text-anchor="middle" font-size="12" font-weight="700" fill="#0f172a">EX</text> <rect x="576" y="255" width="68" height="40" fill="#ea580c" opacity="0.15"/> <rect x="576" y="255" width="68" height="40" fill="none" stroke="#334155" stroke-width="1.2"/> <text x="610" y="279" text-anchor="middle" font-size="12" font-weight="700" fill="#0f172a">MEM</text> <rect x="644" y="255" width="68" height="40" fill="#64748b" opacity="0.18"/> <rect x="644" y="255" width="68" height="40" fill="none" stroke="#334155" stroke-width="1.2"/> <text x="678" y="279" text-anchor="middle" font-size="12" font-weight="700" fill="#0f172a">WB</text> <rect x="372" y="95" width="68" height="200" fill="none" stroke="#dc2626" stroke-width="2.5"/> <text x="406" y="313" text-anchor="middle" font-size="10.5" font-style="italic" font-weight="700" fill="#dc2626">canal ple: 5 etapes actives alhora</text> <rect x="40" y="336" width="14" height="14" fill="#eff6ff" stroke="#334155" stroke-width="1"/> <text x="60" y="347" font-size="10.5" fill="#334155">IF: cerca</text> <rect x="170" y="336" width="14" height="14" fill="#ecfdf5" stroke="#334155" stroke-width="1"/> <text x="190" y="347" font-size="10.5" fill="#334155">ID: descodif.</text> <rect x="300" y="336" width="14" height="14" fill="#fef3c7" stroke="#334155" stroke-width="1"/> <text x="320" y="347" font-size="10.5" fill="#334155">EX: execució</text> <rect x="440" y="336" width="14" height="14" fill="#ea580c" opacity="0.15"/> <rect x="440" y="336" width="14" height="14" fill="none" stroke="#334155" stroke-width="1"/> <text x="460" y="347" font-size="10.5" fill="#334155">MEM: memòria</text> <rect x="580" y="336" width="14" height="14" fill="#64748b" opacity="0.18"/> <rect x="580" y="336" width="14" height="14" fill="none" stroke="#334155" stroke-width="1"/> <text x="600" y="347" font-size="10.5" fill="#334155">WB: escriptura</text> <rect x="40" y="372" width="500" height="32" rx="5" fill="#ecfdf5" stroke="#059669" stroke-width="1.2"/> <text x="54" y="392" font-size="11" fill="#0f172a">Règim permanent: es completa 1 instrucció per cicle (IPC ideal = 1).</text> </svg>

Figura 6. Cronograma del canal segmentat (pipeline) clàssic de cinc etapes.

En la práctica, els riesgos (hazards) impiden alcanzar eixe ideal. Els riesgos estructurales surgen quan dos etapes compiten por el mateix recurs; els riesgos de datos aparecen quan una instrucció necessita un resultat que altra aún no ha escrito, i se mitigan amb l'adelantament d'operandos (forwarding) o, si no basta, amb burbujas de detenció; i els riesgos de control, causados por els salts, obligan a esperar a conocer el destinació o a recurrir a la predicció de salts i a la ejecució especulativa, descartando el trabajo si la predicció falla. Els predictores modernos superan el 95 % d'aciertos, xifra imprescindible dado que aproximadamente una de cada cinc instruccions és un salt.

Els procesadores actuales van més allá amb el paralelismo a escala d'instrucció: les arquitecturas superescalares disponen de vàries untats d'ejecució i lanzan vàries instruccions por cicle (logrando un CPI inferior a 1, o su inverso, un IPC superior a 1); la ejecució fuera d'Orde (out-of-order) reordena les instruccions para no detenerse ante dependencias; i el multihilo simultáneo (SMT, comercializado por Intel com Hyper-Threading) aprovecha els huecos d'un núcleo para ejecutar varis hilos. Por encima, els procesadores multinúcleo ofrecen paralelismo a escala d'hilo i de procés. La ganancia d'aquest paralelismo està acotada por la llei d'Amdahl, que estableix que si una fracció f del trabajo és paralelizable i el resto és estrictamente secuencial, la aceleració màxima amb p procesadores és

S(p) = \frac{1}{(1-f) + \dfrac{f}{p}},

de modo que, encara que p\to\infty, la aceleració mai supera 1/(1-f): un programa amb un 10 % de código secuencial no pot acelerarse més de deu veces por molts núcleos que se le añadan. Aquest resultat explica por qué el paralelismo masivo no és una panacea i por qué la especialització del hardware ha cobrado tanta importancia. Conviene subrayar que totes aquestes tècniques són refinaments sobre el mateix cicle d'instrucció bàsic; preservan la semántica del modelo de von Neumann (el programador percibe una ejecució secuencial i correcta) encara que internamente l'Orde físico d'ejecució sea molt distint.

7. El subsistema de memòria i su jerarquía

La memòria és el subsistema que almacena instruccions i datos. Idealmente desearíamos una memòria a la vez molt rápida, de gran capactat i de sota coste, però aquestes tres propiedades resultan tecnológicamente incompatibles: la memòria rápida és cara i pequeña, i la memòria barata i grande és lenta. La solució a aquest dilema és la jerarquía de memòria, una organització en nivells que combina distintas tecnologías para aproximarse al ideal a un coste razonable.

7.1. El principio de localtat

La jerarquía funciona perquè els programas reales exhiben el principio de localtat de referencia, que té dos vertientes: la localtat temporal (si s'accede a un dato, és probable que se vuelva a acceder pronto, com ocurre amb la variable de control d'un bucle) i la localtat espacial (si s'accede a una posició, és probable que s'acceda a posicions cercanas, com ocurre al recorrer un vector o ejecutar instruccions consecutives). Gracias a la localtat, mantener cerca de la CPU una copia pequeña dels datos més usados resulta sorprendentemente eficaz. La localtat no és una llei física, sinó una propiedad empírica del software real; els programas que la violan sistemáticamente —recorridos aleatorios d'estructuras enormes, per exemple— rinden molt por debajo de su potencial precisamente perquè derrotan a la jerarquía.

7.2. Els nivells de la jerarquía

De més rápido i pequeño a més lento i grande, els nivells típicos són:

  • Registres de la CPU: el nivell superior, de capactat mínima (decenas de registres) i acceso en un cicle.
  • Memòria caché, normalmente en tres nivells. La caché L1 (subdividida en instruccions i datos, vestigio de la arquitectura Harvard) és la més rápida i pequeña, del Orde de decenas de kibibytes i integrada por núcleo, amb latencias de 3 a 5 cicles; la L2 és major (cientos de kibibytes o algunos mebibytes) i algo més lenta; i la L3 suele ser de varis mebibytes i compartida por tots els núcleos. La caché se fabrica amb memòria estática (SRAM), basada en biestables de sis transistores, rápida però costosa i voluminosa.
  • Memòria principal o RAM, de tecnología dinámica (DRAM), que almacena la informació en condensadores d'un només transistor i requereix refresco periódico perquè els condensadores se descargan. Els mòduls actuales siguen estándares de la família DDR (els més recientes, DDR5), definidos por el comité JEDEC. És volátil: pierde su contingut al cortar la alimentació.
  • Emmagatzematge secundari: discos d'estat sólido (SSD, basados en memòria flash NAND, conectados por interfaces com SATA o, sobre tot, NVMe sobre PCI Express) i discos duros magnéticos (HDD). És no volátil, de gran capactat i molt més lento que la RAM.
  • Emmagatzematge terciari o de respaldo: cintas i emmagatzematge en la nube, de màxima capactat i mínim coste por bit, reservado a copias i fitxer.

Para dimensionar els salts de latencia entre nivells, resulta molt pedagógica la siguiente taula d'órdenes de magnitud aproximados en un sistema de sobremesa de 2026:

Nivell Latencia típica Capactat típica Tecnología
Registre < 1 ns (1 cicle) < 1 KiB Biestables
Caché L1 ≈ 1 ns (3-5 cicles) 32-64 KiB por núcleo SRAM
Caché L2 ≈ 3-10 ns 0,5-2 MiB por núcleo SRAM
Caché L3 ≈ 10-30 ns 8-64 MiB compartida SRAM
RAM (DDR5) ≈ 80-100 ns 8-128 GiB DRAM
SSD NVMe ≈ 20-100 µs 0,5-8 TB Flash NAND
HDD ≈ 5-10 ms 1-20 TB Magnética

La lecció que transmite aquesta taula és contundente: entre un registre i un disco duro median uns set órdenes de magnitud de latencia. Si un acceso a registre fuera un segundo, un acceso a disco duro equivaldría a mesos. Tota la ingeniería de la jerarquía se dirige a que la inmensa mayoría dels accesos se resuelvan en els nivells alts.

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 720 470" font-family="ui-sans-serif, system-ui, Arial, sans-serif"> <text x="360" y="34" text-anchor="middle" font-size="17" font-weight="700" fill="#0f172a">Jerarquia de memòria</text> <!-- Barra 1: Registres (més estreta, dalt) --> <rect x="260" y="60" width="200" height="50" rx="4" fill="#fef3c7" stroke="#334155" stroke-width="1.5"/> <text x="360" y="90" text-anchor="middle" font-size="13" font-weight="600" fill="#0f172a">Registres de la CPU</text> <!-- Barra 2: Memòria cau --> <rect x="220" y="120" width="280" height="50" rx="4" fill="#ecfdf5" stroke="#334155" stroke-width="1.5"/> <text x="360" y="150" text-anchor="middle" font-size="13" font-weight="600" fill="#0f172a">Memòria cau L1 / L2 / L3 (SRAM)</text> <!-- Barra 3: RAM --> <rect x="175" y="180" width="370" height="50" rx="4" fill="#eff6ff" stroke="#334155" stroke-width="1.5"/> <text x="360" y="210" text-anchor="middle" font-size="13" font-weight="600" fill="#0f172a">Memòria principal RAM (DRAM, DDR5)</text> <!-- Barra 4: Emmagatzematge secundari --> <rect x="125" y="240" width="470" height="50" rx="4" fill="#f8fafc" stroke="#334155" stroke-width="1.5"/> <text x="360" y="270" text-anchor="middle" font-size="13" font-weight="600" fill="#0f172a">Emmagatzematge secundari (SSD NVMe, HDD)</text> <!-- Barra 5: Suport (més ampla, baix) --> <rect x="80" y="300" width="560" height="50" rx="4" fill="#f8fafc" stroke="#334155" stroke-width="2"/> <text x="360" y="330" text-anchor="middle" font-size="13" font-weight="600" fill="#0f172a">Suport (cinta, núvol)</text> <!-- Fletxa ESQUERRA apuntant CAP A DALT --> <line x1="45" y1="345" x2="45" y2="90" stroke="#2563eb" stroke-width="2.5"/> <polygon points="45,62 35,92 55,92" fill="#2563eb"/> <text x="22" y="300" text-anchor="middle" font-size="12" font-weight="600" fill="#2563eb" transform="rotate(-90 22 300)">+ velocitat + cost/bit − capacitat</text> <!-- Fletxa DRETA apuntant CAP A BAIX --> <line x1="675" y1="90" x2="675" y2="320" stroke="#059669" stroke-width="2.5"/> <polygon points="675,348 665,318 685,318" fill="#059669"/> <text x="698" y="160" text-anchor="middle" font-size="12" font-weight="600" fill="#059669" transform="rotate(90 698 160)">+ capacitat − cost/bit − velocitat</text> <!-- Línia base separadora --> <line x1="40" y1="372" x2="680" y2="372" stroke="#e2e8f0" stroke-width="1"/> <text x="360" y="392" text-anchor="middle" font-size="11" fill="#64748b">Cim: ràpida, cara i petita · Base: lenta, barata i de gran capacitat</text> </svg>

Figura 7. Jerarquia de memòria: a major proximitat a la CPU, més velocitat i cost per bit i menys capacitat.

Quan la CPU solicita un dato, se busca primero en el nivell més cercano. Si està presente, se produeix un acierto (hit); si no, un fallada (miss) que obliga a traerlo del nivell inferior, moviendo a més el bloc o línea de caché que lo conté (típicamente 64 bytes) para explotar la localtat espacial. La eficacia de la jerarquía se mide por la tasa d'aciertos i por el temps medi d'acceso.

7.3. Organització i políticas de la caché

Para ubicar una línea traída de memòria dins de la caché existen tres organitzacions. En la correspondencia directa, cada bloc de memòria només pot alojarse en una línea concreta de la caché, determinada por sus bits d'ÍNDEX; és simple i rápida però sufre conflictos. En la totalmente asociativa, un bloc pot ir a cualquier línea, lo que minimiza els conflictos a costa d'una búsqueda cara. El compromiso habitual és la asociativa por conjuntos (set-associative), on la caché se divide en conjuntos i cada bloc pot ir a cualquier vía dins de su conjunto (4, 8 o 16 vías són típicas).

El mecanismo se comprende mejor desglosando la adreça de memòria en tres camps: el desplazament (offset) dins de la línea, el ÍNDEX que selecciona el conjunto i la etiqueta (tag) que identifica el bloc. Amb un exemple numérico: para una caché de correspondencia directa de 32 KiB amb líneas de 64 bytes i adreces de 32 bits, hi ha 32\,768/64 = 512 líneas; el desplazament ocupa \log_2 64 = 6 bits, l'ÍNDEX \log_2 512 = 9 bits i la etiqueta els 32 - 9 - 6 = 17 bits restantes. Al arribar una adreça, l'hardware usa l'ÍNDEX para localizar la línea, compara su etiqueta almacenada amb la de la adreça i, si coinciden i el bit de validez està actiu, hi ha acierto i el desplazament selecciona el byte pedido.

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 740 470" font-family="ui-sans-serif, system-ui, Arial, sans-serif"> <text x="370" y="24" text-anchor="middle" font-size="16" font-weight="700" fill="#0f172a">Adreça de 32 bits en una memòria cau de correspondència directa</text> <text x="40" y="58" text-anchor="start" font-size="9" fill="#64748b">bit 31</text> <text x="700" y="58" text-anchor="end" font-size="9" fill="#64748b">bit 0</text> <text x="400" y="42" text-anchor="middle" font-size="10" fill="#2563eb">etiqueta de l'adreça</text> <polyline points="170,64 170,48 645,48 645,216" fill="none" stroke="#2563eb" stroke-width="1.3"/> <polygon points="645,224 641,216 649,216" fill="#2563eb"/> <rect x="40" y="64" width="260" height="40" rx="3" fill="#eff6ff" stroke="#334155" stroke-width="1.2"/> <rect x="300" y="64" width="180" height="40" rx="3" fill="#ecfdf5" stroke="#334155" stroke-width="1.2"/> <rect x="480" y="64" width="220" height="40" rx="3" fill="#fef3c7" stroke="#334155" stroke-width="1.2"/> <text x="170" y="82" text-anchor="middle" font-size="11.5" font-weight="700" fill="#0f172a">Etiqueta (tag)</text> <text x="170" y="97" text-anchor="middle" font-size="10" fill="#334155">17 bits</text> <text x="390" y="82" text-anchor="middle" font-size="11.5" font-weight="700" fill="#0f172a">Índex</text> <text x="390" y="97" text-anchor="middle" font-size="10" fill="#334155">9 bits</text> <text x="590" y="82" text-anchor="middle" font-size="11.5" font-weight="700" fill="#0f172a">Desplaçament</text> <text x="590" y="97" text-anchor="middle" font-size="10" fill="#334155">(offset) · 6 bits</text> <text x="210" y="152" text-anchor="middle" font-size="10" fill="#059669">índex → línia 0</text> <polyline points="390,104 390,160 70,160 70,246 92,246" fill="none" stroke="#059669" stroke-width="1.4"/> <polygon points="100,246 92,242 92,250" fill="#059669"/> <text x="497" y="134" text-anchor="middle" font-size="10" fill="#ea580c">offset → byte</text> <polyline points="590,104 590,140 400,140 400,222" fill="none" stroke="#ea580c" stroke-width="1.4"/> <polygon points="400,230 396,222 404,222" fill="#ea580c"/> <rect x="100" y="198" width="460" height="180" fill="#ffffff" stroke="#334155" stroke-width="1.2"/> <rect x="100" y="230" width="460" height="32" fill="#eff6ff"/> <rect x="100" y="230" width="4" height="32" fill="#2563eb"/> <line x1="100" y1="230" x2="560" y2="230" stroke="#334155" stroke-width="1.2"/> <line x1="100" y1="262" x2="560" y2="262" stroke="#e2e8f0" stroke-width="1"/> <line x1="100" y1="292" x2="560" y2="292" stroke="#e2e8f0" stroke-width="1"/> <line x1="100" y1="322" x2="560" y2="322" stroke="#e2e8f0" stroke-width="1"/> <line x1="100" y1="348" x2="560" y2="348" stroke="#e2e8f0" stroke-width="1"/> <line x1="150" y1="198" x2="150" y2="378" stroke="#e2e8f0" stroke-width="1"/> <line x1="188" y1="198" x2="188" y2="378" stroke="#e2e8f0" stroke-width="1"/> <line x1="410" y1="198" x2="410" y2="378" stroke="#e2e8f0" stroke-width="1"/> <text x="125" y="218" text-anchor="middle" font-size="10.5" font-weight="700" fill="#334155">Línia</text> <text x="169" y="218" text-anchor="middle" font-size="10.5" font-weight="700" fill="#334155">V</text> <text x="299" y="218" text-anchor="middle" font-size="10.5" font-weight="700" fill="#334155">Dades (línia de 64 bytes)</text> <text x="485" y="218" text-anchor="middle" font-size="10.5" font-weight="700" fill="#334155">Etiqueta emmagatzemada</text> <text x="125" y="250" text-anchor="middle" font-size="10" font-weight="700" fill="#0f172a">0</text> <text x="169" y="250" text-anchor="middle" font-size="10" font-weight="700" fill="#0f172a">1</text> <text x="299" y="250" text-anchor="middle" font-size="9" fill="#334155">byte 0 · byte 1 · … · byte 63</text> <text x="485" y="250" text-anchor="middle" font-size="10" font-weight="700" fill="#0f172a">0x1F0A2</text> <text x="125" y="281" text-anchor="middle" font-size="10" fill="#334155">1</text> <text x="169" y="281" text-anchor="middle" font-size="10" fill="#334155">0</text> <text x="299" y="281" text-anchor="middle" font-size="10" fill="#64748b">…</text> <text x="485" y="281" text-anchor="middle" font-size="10" fill="#334155">0x0C4B1</text> <text x="125" y="311" text-anchor="middle" font-size="10" fill="#334155">2</text> <text x="169" y="311" text-anchor="middle" font-size="10" fill="#334155">1</text> <text x="299" y="311" text-anchor="middle" font-size="10" fill="#64748b">…</text> <text x="485" y="311" text-anchor="middle" font-size="10" fill="#334155">0x0A77E</text> <text x="125" y="340" text-anchor="middle" font-size="12" fill="#64748b">⋮</text> <text x="169" y="340" text-anchor="middle" font-size="12" fill="#64748b">⋮</text> <text x="299" y="340" text-anchor="middle" font-size="12" fill="#64748b">⋮</text> <text x="485" y="340" text-anchor="middle" font-size="12" fill="#64748b">⋮</text> <text x="125" y="366" text-anchor="middle" font-size="10" fill="#334155">511</text> <text x="169" y="366" text-anchor="middle" font-size="10" fill="#334155">1</text> <text x="299" y="366" text-anchor="middle" font-size="10" fill="#64748b">…</text> <text x="485" y="366" text-anchor="middle" font-size="10" fill="#334155">0x1D902</text> <polyline points="560,246 592,246" fill="none" stroke="#2563eb" stroke-width="1.3"/> <polygon points="600,246 592,242 592,250" fill="#2563eb"/> <polygon points="645,224 690,246 645,268 600,246" fill="#f8fafc" stroke="#2563eb" stroke-width="1.5"/> <text x="645" y="251" text-anchor="middle" font-size="13" font-weight="700" fill="#2563eb">=?</text> <polyline points="645,268 645,274" fill="none" stroke="#0f172a" stroke-width="1.3"/> <polygon points="645,282 641,274 649,274" fill="#0f172a"/> <text x="645" y="298" text-anchor="middle" font-size="11" font-weight="700" fill="#0f172a">ENCERT / FALLADA</text> <text x="645" y="314" text-anchor="middle" font-size="9" font-style="italic" fill="#64748b">coincideixen ⇒ encert</text> <text x="330" y="396" text-anchor="middle" font-size="10.5" font-style="italic" fill="#64748b">512 línies × 64 bytes = 32 KiB</text> <rect x="40" y="412" width="520" height="44" rx="6" fill="#f8fafc" stroke="#e2e8f0" stroke-width="1"/> <text x="52" y="430" text-anchor="start" font-size="10.5" font-weight="700" fill="#334155">Càlcul dels camps</text> <text x="52" y="449" text-anchor="start" font-size="10" fill="#334155">offset = log₂(64) = 6 | índex = log₂(512) = 9 | etiqueta = 32 − 9 − 6 = 17 bits</text> </svg>

Figura 8. Desglossament d'una adreça en etiqueta, índex i desplaçament en una memòria cau de correspondència directa.

Quan hi ha que fer sitio a una línea nova, una política de reemplazo decide cuál desalojar: les més habituales són LRU (Least Recently Used, la menys usada recientemente), FIFO i aleatoria, siendo LRU la que mejor explota la localtat temporal a canvi de més coste. Respecto a les escrituras, la escritura directa (write-through) actualiza a la vez caché i memòria, garantizando coherencia a costa de tráfico, mientras que la posescritura (write-back) actualiza només la caché i difiere la escritura a memòria fins al desalojo, marcando la línea com «sucia» amb un bit dirty; aquesta última reduce drásticamente el tráfico i és la dominante. En sistemas multinúcleo, mantener consistentes les copias que cada núcleo guarda d'un mateix dato exige un protocolo de coherencia de caché, com MESI (por els estats Modified, Exclusive, Shared, Invalid), que espía el bus para invalidar o actualizar copias obsoletas.

7.4. Temps medi d'acceso a memòria

La métrica que integra tot lo anterior és el temps medi d'acceso a memòria (AMAT, Average Memory Access Time), que para un nivell s'expresa com

\text{AMAT} = t_{\text{acierto}} + \text{tasa de fallos} \times \text{penalización por fallo}.

Ilustrémoslo amb un cálculo resoluble a mano. Supongamos una caché L1 amb temps d'acierto de 1 cicle i una tasa de fallades del 5 %, respaldada por una memòria principal amb una penalització de 100 cicles. El temps medi será \text{AMAT} = 1 + 0{,}05 \times 100 = 6 cicles. Si intercalamos una caché L2 amb temps d'acierto de 10 cicles i una tasa de fallades local del 20 % (de modo que només el 1 % dels accesos originales arriba fins a la memòria principal), la penalització de fallada de L1 se convierte en l'AMAT de L2, 10 + 0{,}20 \times 100 = 30 cicles, i el temps total queda en \text{AMAT} = 1 + 0{,}05 \times 30 = 2{,}5 cicles. La sola incorporació d'un nivell intermedio ha reducido el temps medi de 6 a 2,5 cicles: aquest cálculo, sencillo i de gran força expositiva, justifica cuantitativamente la existencia de la jerarquía i suele impresionar a un tribunal.

7.5. Memòria virtual i tipus de memòria

El sistema operatiu, amb apoyo de la Untat de Gestión de Memòria (MMU) del procesador, implementa la memòria virtual: cada procés percibe un espai d'adreces lineal i privat, potencialmente major que la memòria física, que se traduce a adreces reales mitjançant taules de pàgines. La memòria se gestiona en blocs de tamaño fijo llamados pàgines (habitualmente de 4 KiB, amb soporte para pàgines enormes de 2 MiB o 1 GiB que reducen la sobrecarga de traducció). La memòria virtual aporta tres beneficios capitales: el aislament entre processos (un no pot leer ni corromper la memòria d'altre), la protecció mitjançant permisos por pàgina (lectura, escritura, ejecució) i la capactat d'ejecutar programas majors que la RAM disponible, paginando cap al disco les pàgines menys usadas.

Com cada acceso lógico exigiría, en principio, un acceso adicional a la taula de pàgines para traducir la adreça, s'emplea una caché de traduccions molt rápida, la TLB (Translation Lookaside Buffer), que almacena les traduccions recientes. Un fallada de TLB obliga a recorrer la taula de pàgines (el page-table walk), i un fallada de pàgina propiamente dicho —quan la pàgina ni siquiera està en RAM— dispara una excepció que el sistema operatiu atiende trayéndola del disco, operació millones de veces més lenta. Quan la paginació se vuelve incesante perquè el conjunto de trabajo no cabe en memòria, se produeix el fenómeno de la hiperpaginació (thrashing), que degrada catastróficamente el rendiment.

Atendiendo a su comportament, distinguimos la memòria d'acceso aleatorio (RAM), de lectura i escritura i volátil, de la memòria de només lectura (ROM) i sus variantes (PROM, EPROM, EEPROM i, en la práctica actual, memòria flash), no volátiles, on reside el firmware d'arranque —el BIOS/UEFI en els ordenadores personales—. La distinció ROM/RAM és esencial para comprender el procés d'arranque: el procesador, al encenderse, busca instruccions en una adreça fija de memòria no volátil que inicia la carga del sistema operatiu. Com referencia de la evolució tecnológica, la taula siguiente resume els estándares recientes de DRAM síncrona:

Estándar Tasa de transferencia Ancho de banda por mòdul (aprox.)
DDR3 800-2.133 MT/s 6,4-17 GB/s
DDR4 1.600-3.200 MT/s 12,8-25,6 GB/s
DDR5 4.800-8.400 MT/s 38,4-67,2 GB/s

8. El subsistema d'entrada/eixida (I/S)

El subsistema de entrada/eixida és el que comunica l'ordenador amb el mundo exterior i amb els dispositius d'emmagatzematge. Sense él, la máquina sería un sistema tancat i inútil. Comprende els periféricos (teclado, ratón, pantalla, impresora, sensores, xarxes, discos) i, sobre tot, els controladores o interfaces que median entre els periféricos i el resto del sistema.

8.1. El problema de la heterogenetat

Els periféricos són extraordinariamente diversos en velocitat, naturaleza i formato dels datos: un teclado entrega uns pocos bytes por segundo de forma esporádica, mientras un SSD NVMe transfiere gigabytes por segundo, una diferencia de més de nou órdenes de magnitud. Aquesta heterogenetat se resuelve mitjançant controladores d'I/S, mòduls que adaptan les señales i els protocolos del dispositiu als del bus del sistema, ofrecen registres de datos, de control i d'estat, i desacoplan la velocitat del periférico de la de la CPU. El sistema operatiu, a su vez, abstrae els controladores mitjançant controladores de dispositiu (drivers), de modo que les aplicacions acceden als periféricos a través d'una interfaz uniforme i no necessiten conocer els detalles eléctricos de cada modelo. Aquesta doble capa d'abstracció —hardware del controlador i software del driver— és la que permet que un mateix programa funcione amb miles de dispositius distintos.

8.2. Tècniques de gestión de la I/S

Existen tres tècniques fundamentales para gobernar les transferencias d'I/S, de menor a major sofisticació:

  • I/S programada amb sondeo (polling): la CPU consulta repetidamente el registre d'estat del controlador fins a que el dispositiu està listo. És simple però ineficiente, pues malgasta cicles en espera activa; només se justifica en sistemas molt sencillos o quan la espera prevista és brevísima.
  • I/S por interrupcions: el dispositiu avisa a la CPU mitjançant una interrupció quan està listo, liberando al procesador para altres tasques mientras tanto. Mejora notablemente l'aprovechament del procesador, però cada palabra o bloc transferido sigue exigiendo la intervenció de la CPU i el coste d'atender la interrupció, lo que la fa inadecuada para dispositius molt rápidos.
  • Acceso Directe a Memòria (DMA): un controlador especializado, el controlador de DMA, transfiere blocs de datos directamente entre el periférico i la memòria principal sense intervenció de la CPU en cada palabra. La CPU només configura la transferencia —adreça d'origen, destinació i tamaño— i recibe una única interrupció al concluir el bloc completo. El DMA és imprescindible para dispositius d'alta velocitat com els discos o les tarjetas de xarxa, pues evita que la CPU sea el cuello de botella de la transferencia.
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 780 526" font-family="ui-sans-serif, system-ui, Arial, sans-serif"> <text x="390" y="30" text-anchor="middle" font-size="16" font-weight="bold" fill="#0f172a">Tècniques de gestió de l'E/S: sondeig, interrupcions i DMA</text> <text x="40" y="62" font-size="12" font-weight="bold" fill="#0f172a">1. E/S programada (sondeig / polling)</text> <rect x="524" y="48" width="236" height="20" rx="10" fill="#fef3c7" stroke="#ea580c" stroke-width="1.2"/> <rect x="534" y="53" width="9" height="9" fill="#ea580c"/> <rect x="547" y="53" width="9" height="9" fill="#ea580c"/> <rect x="560" y="53" width="9" height="9" fill="#ea580c"/> <text x="576" y="62" font-size="10" font-weight="bold" fill="#0f172a">Intervenció CPU: ALTA</text> <rect x="40" y="84" width="150" height="62" rx="8" fill="#f8fafc" stroke="#334155" stroke-width="2"/> <text x="115" y="110" text-anchor="middle" font-size="12" font-weight="bold" fill="#0f172a">Controlador</text> <text x="115" y="126" text-anchor="middle" font-size="12" font-weight="bold" fill="#0f172a">d'E/S</text> <rect x="360" y="84" width="105" height="62" rx="8" fill="#eff6ff" stroke="#334155" stroke-width="2"/> <text x="412" y="121" text-anchor="middle" font-size="14" font-weight="bold" fill="#0f172a">CPU</text> <rect x="615" y="84" width="145" height="62" rx="8" fill="#f8fafc" stroke="#334155" stroke-width="2"/> <text x="687" y="121" text-anchor="middle" font-size="13" font-weight="bold" fill="#0f172a">Memòria</text> <line x1="360" y1="100" x2="199" y2="100" stroke="#2563eb" stroke-width="1.8"/> <polygon points="190,100 199,96 199,104" fill="#2563eb"/> <text x="275" y="93" text-anchor="middle" font-size="9.5" font-style="italic" fill="#2563eb">consulta en bucle: està llest?</text> <line x1="190" y1="126" x2="351" y2="126" stroke="#2563eb" stroke-width="1.8"/> <polygon points="360,126 351,122 351,130" fill="#2563eb"/> <text x="275" y="140" text-anchor="middle" font-size="10" fill="#334155">dada</text> <line x1="465" y1="126" x2="606" y2="126" stroke="#2563eb" stroke-width="1.8"/> <polygon points="615,126 606,122 606,130" fill="#2563eb"/> <text x="540" y="140" text-anchor="middle" font-size="10" fill="#334155">dada</text> <text x="40" y="171" font-size="10.5" font-style="italic" fill="#dc2626">La CPU malbarata cicles en espera activa.</text> <line x1="30" y1="190" x2="750" y2="190" stroke="#e2e8f0" stroke-width="1"/> <text x="40" y="216" font-size="12" font-weight="bold" fill="#0f172a">2. E/S per interrupcions</text> <rect x="524" y="202" width="236" height="20" rx="10" fill="#eff6ff" stroke="#2563eb" stroke-width="1.2"/> <rect x="534" y="207" width="9" height="9" fill="#2563eb"/> <rect x="547" y="207" width="9" height="9" fill="#2563eb"/> <rect x="560" y="207" width="9" height="9" fill="#ffffff" stroke="#2563eb" stroke-width="1"/> <text x="576" y="216" font-size="10" font-weight="bold" fill="#0f172a">Intervenció CPU: MITJANA</text> <rect x="40" y="238" width="150" height="62" rx="8" fill="#f8fafc" stroke="#334155" stroke-width="2"/> <text x="115" y="264" text-anchor="middle" font-size="12" font-weight="bold" fill="#0f172a">Controlador</text> <text x="115" y="280" text-anchor="middle" font-size="12" font-weight="bold" fill="#0f172a">d'E/S</text> <rect x="360" y="238" width="105" height="62" rx="8" fill="#eff6ff" stroke="#334155" stroke-width="2"/> <text x="412" y="275" text-anchor="middle" font-size="14" font-weight="bold" fill="#0f172a">CPU</text> <rect x="615" y="238" width="145" height="62" rx="8" fill="#f8fafc" stroke="#334155" stroke-width="2"/> <text x="687" y="275" text-anchor="middle" font-size="13" font-weight="bold" fill="#0f172a">Memòria</text> <line x1="190" y1="254" x2="351" y2="254" stroke="#dc2626" stroke-width="1.8"/> <polygon points="360,254 351,250 351,258" fill="#dc2626"/> <text x="275" y="247" text-anchor="middle" font-size="10" font-weight="bold" fill="#dc2626">INT (llest)</text> <line x1="190" y1="280" x2="351" y2="280" stroke="#2563eb" stroke-width="1.8"/> <polygon points="360,280 351,276 351,284" fill="#2563eb"/> <text x="275" y="294" text-anchor="middle" font-size="10" fill="#334155">dada (paraula)</text> <line x1="465" y1="280" x2="606" y2="280" stroke="#2563eb" stroke-width="1.8"/> <polygon points="615,280 606,276 606,284" fill="#2563eb"/> <text x="540" y="294" text-anchor="middle" font-size="10" fill="#334155">paraula</text> <text x="40" y="325" font-size="10.5" font-style="italic" fill="#64748b">La CPU atén sota demanda, però intervé en cada transferència.</text> <line x1="30" y1="344" x2="750" y2="344" stroke="#e2e8f0" stroke-width="1"/> <text x="40" y="370" font-size="12" font-weight="bold" fill="#0f172a">3. Accés Directe a Memòria (DMA)</text> <rect x="524" y="356" width="236" height="20" rx="10" fill="#ecfdf5" stroke="#059669" stroke-width="1.2"/> <rect x="534" y="361" width="9" height="9" fill="#059669"/> <rect x="547" y="361" width="9" height="9" fill="#ffffff" stroke="#059669" stroke-width="1"/> <rect x="560" y="361" width="9" height="9" fill="#ffffff" stroke="#059669" stroke-width="1"/> <text x="576" y="370" font-size="10" font-weight="bold" fill="#0f172a">Intervenció CPU: MÍNIMA</text> <rect x="40" y="392" width="150" height="62" rx="8" fill="#ecfdf5" stroke="#059669" stroke-width="2"/> <text x="115" y="418" text-anchor="middle" font-size="12" font-weight="bold" fill="#0f172a">Controlador</text> <text x="115" y="434" text-anchor="middle" font-size="12" font-weight="bold" fill="#0f172a">DMA / E/S</text> <rect x="360" y="392" width="105" height="62" rx="8" fill="#f8fafc" stroke="#94a3b8" stroke-width="1.5" stroke-dasharray="4 3" opacity="0.5"/> <text x="412" y="428" text-anchor="middle" font-size="14" font-weight="bold" fill="#0f172a" opacity="0.5">CPU</text> <rect x="615" y="392" width="145" height="62" rx="8" fill="#f8fafc" stroke="#334155" stroke-width="2"/> <text x="687" y="428" text-anchor="middle" font-size="13" font-weight="bold" fill="#0f172a">Memòria</text> <line x1="360" y1="410" x2="199" y2="410" stroke="#64748b" stroke-width="1.5"/> <polygon points="190,410 199,406 199,414" fill="#64748b"/> <text x="275" y="403" text-anchor="middle" font-size="9.5" font-style="italic" fill="#64748b">configura la transferència</text> <line x1="190" y1="433" x2="351" y2="433" stroke="#dc2626" stroke-width="1.5"/> <polygon points="360,433 351,429 351,437" fill="#dc2626"/> <text x="275" y="450" text-anchor="middle" font-size="9.5" font-style="italic" fill="#dc2626">INT en acabar el bloc</text> <polyline points="115,464 115,480 687,480 687,464" fill="none" stroke="#059669" stroke-width="6"/> <polygon points="115,455 109,464 121,464" fill="#059669"/> <polygon points="687,455 681,464 693,464" fill="#059669"/> <text x="401" y="497" text-anchor="middle" font-size="10.5" font-weight="bold" fill="#059669">transferència directa de blocs (DMA)</text> <text x="40" y="514" font-size="10.5" font-style="italic" fill="#64748b">La CPU queda lliure; el DMA mou blocs sencers.</text> </svg>

Figura 9. Les tres tècniques de gestió de l'E/S: sondeig, interrupcions i DMA.

El DMA admite, a su vez, distintos modos d'operació segons cómo comparta el bus amb la CPU. En el modo por ráfagas (burst), el controlador de DMA toma el bus i transfiere el bloc entero d'una vez, maximizando el rendiment però bloqueando a la CPU durant eixe lapso. En el modo por robo de cicle (cycle stealing), intercala transferencias d'una palabra entre els accesos de la CPU, ralentizándola mínimamente. I en el modo transparente, només transfiere quan la CPU no necessita el bus, sense penalizarla en absoluto però a menor velocitat. Existe a més un fenómeno a vigilar: com el DMA escribe directamente en memòria, pot dejar la caché amb datos obsoletos, por lo que el sistema ha de garantizar la coherencia entre la memòria actualizada por DMA i les cachés, ja sea por hardware o invalidando explícitamente les líneas afectadas.

8.3. Mapeado de la I/S

Para que la CPU dialogue amb els controladores existen dos esquemes. En la I/S mapeada en memòria (memory-mapped I/O), els registres dels controladores ocupan posicions del mateix espai d'adreces que la memòria, de modo que s'accede a ellos amb les instruccions ordinàries de carga i emmagatzematge; és l'esquema de les arquitecturas ARM i RISC-V, i su gran ventaja és la uniformtat, pues no requereix instruccions especiales i permet aplicar als periféricos tot el repertorio d'operacions de memòria. En la I/S por puertos aislados (port-mapped I/O), els dispositius disponen d'un espai d'adreces propi, separado del de memòria, i s'accede a ellos amb instruccions específiques (IN i OUT en x86); su ventaja és no consumir espai d'adreces de memòria, relevante quan aquest era escaso.

Les interfaces físicas modernas més relevantes inclouen USB para periféricos d'uso general (amb veloctats que van des de 1,5 Mbit/s del USB de baixa velocitat fins als 40 Gbit/s d'USB4), PCI Express com interconexión interna d'expansió d'alta velocitat, SATA i NVMe para emmagatzematge, HDMI o DisplayPort para vídeo, i Thunderbolt com interfaz combinada de datos i vídeo. Un matiz relevante és que les operacions d'I/S, al ser potencialmente peligrosas, estan reservadas al modo privilegiado: un programa d'usuari que necessita acceder a un dispositiu ha d'hacerlo a través d'una llamada al sistema, lo que preserva l'aislament i la protecció.

9. El sistema d'interconexión: buses de datos, adreces i control

Els subsistemas descritos no operan aislados, sinó que intercambian informació a través del sistema d'interconexión, tradicionalmente concebido com un conjunto de buses. Un bus és un conjunto de líneas conductoras compartidas que transportan informació entre componentes segons un protocolo comú. La metáfora clásica del bus del sistema distingue tres buses segons la naturaleza de lo que transportan.

9.1. Els tres buses funcionales

  • Bus de datos: transporta la informació propiamente dicha —instruccions i datos— entre la CPU, la memòria i la I/S. És bidireccional. Su anchura (nombre de líneas, equivalente al tamaño de palabra: 8, 16, 32 o 64 bits) determina cuántos bits se transfieren simultáneamente i condiciona directamente el rendiment.
  • Bus d'adreces: transporta la adreça de la posició de memòria o del puerto d'I/S a la que se desea acceder. És unidireccional (de la CPU cap a memòria i I/S). Su anchura determina el espai de direccionament màxim: amb n líneas se poden direccionar 2^{n} posicions. Así, un bus d'adreces de 32 bits direcciona 4 gibibytes, mientras que un de 48 o 64 bits sustenta els enormes espais virtuales actuales.
  • Bus de control: transporta les señales de gobierno que coordinan les transferencias: señales de lectura i escritura, de reloj, de petició i reconociment de bus, d'interrupció, de petició de DMA, etc. Determina el sentit i el moment de cada operació.
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 740 420" font-family="ui-sans-serif, system-ui, Arial, sans-serif"> <text x="370" y="28" text-anchor="middle" font-size="17" font-weight="700" fill="#0f172a">El sistema de tres busos</text> <!-- Caixes superiors --> <rect x="200" y="46" width="150" height="48" rx="6" fill="#eff6ff" stroke="#334155" stroke-width="1.5"/> <text x="275" y="75" text-anchor="middle" font-size="14" font-weight="700" fill="#0f172a">CPU</text> <rect x="370" y="46" width="150" height="48" rx="6" fill="#eff6ff" stroke="#334155" stroke-width="1.5"/> <text x="445" y="75" text-anchor="middle" font-size="13" font-weight="700" fill="#0f172a">Memòria principal</text> <rect x="540" y="46" width="150" height="48" rx="6" fill="#eff6ff" stroke="#334155" stroke-width="1.5"/> <text x="615" y="71" text-anchor="middle" font-size="12.5" font-weight="700" fill="#0f172a">E/S</text> <text x="615" y="86" text-anchor="middle" font-size="11" fill="#64748b">(controladors)</text> <!-- Connexions verticals de cada caixa als tres busos --> <!-- CPU x=275 --> <line x1="275" y1="94" x2="275" y2="150" stroke="#334155" stroke-width="1"/> <line x1="275" y1="94" x2="275" y2="230" stroke="#334155" stroke-width="1"/> <line x1="275" y1="94" x2="275" y2="310" stroke="#334155" stroke-width="1"/> <!-- Memòria x=445 --> <line x1="445" y1="94" x2="445" y2="150" stroke="#334155" stroke-width="1"/> <line x1="445" y1="94" x2="445" y2="230" stroke="#334155" stroke-width="1"/> <line x1="445" y1="94" x2="445" y2="310" stroke="#334155" stroke-width="1"/> <!-- E/S x=615 --> <line x1="615" y1="94" x2="615" y2="150" stroke="#334155" stroke-width="1"/> <line x1="615" y1="94" x2="615" y2="230" stroke="#334155" stroke-width="1"/> <line x1="615" y1="94" x2="615" y2="310" stroke="#334155" stroke-width="1"/> <!-- Punts de connexió (petits quadrats en encreuaments) --> <rect x="271" y="146" width="8" height="8" fill="#2563eb"/> <rect x="441" y="146" width="8" height="8" fill="#2563eb"/> <rect x="611" y="146" width="8" height="8" fill="#2563eb"/> <rect x="271" y="226" width="8" height="8" fill="#334155"/> <rect x="441" y="226" width="8" height="8" fill="#334155"/> <rect x="611" y="226" width="8" height="8" fill="#334155"/> <rect x="271" y="306" width="8" height="8" fill="#334155"/> <rect x="441" y="306" width="8" height="8" fill="#334155"/> <rect x="611" y="306" width="8" height="8" fill="#334155"/> <!-- ===================== BUS DE DADES (y=150) bidireccional, gros, blau ===================== --> <text x="20" y="146" font-size="13" font-weight="700" fill="#2563eb">Bus de dades</text> <!-- línia principal entre fletxes --> <line x1="186" y1="150" x2="704" y2="150" stroke="#2563eb" stroke-width="3.5"/> <!-- fletxa esquerra --> <polygon points="170,150 188,142 188,158" fill="#2563eb"/> <!-- fletxa dreta --> <polygon points="720,150 702,142 702,158" fill="#2563eb"/> <text x="20" y="162" font-size="10" fill="#64748b">bidireccional</text> <!-- nota a la dreta --> <rect x="540" y="166" width="184" height="22" rx="4" fill="#f8fafc" stroke="#e2e8f0" stroke-width="1"/> <text x="548" y="181" font-size="10.5" fill="#0f172a">instruccions i dades (8/16/32/64 bits)</text> <!-- ===================== BUS D'ADRECES (y=230) unidireccional CPU -> ===================== --> <text x="20" y="226" font-size="13" font-weight="700" fill="#0f172a">Bus d'adreces</text> <!-- línia ix de CPU (x=275) cap a la dreta fins a E/S --> <line x1="275" y1="230" x2="702" y2="230" stroke="#334155" stroke-width="2"/> <!-- fletxa única al final (dreta) --> <polygon points="720,230 702,222 702,238" fill="#334155"/> <!-- petita fletxa intermèdia cap a memòria per indicar destí --> <polygon points="445,230 431,224 431,236" fill="#334155"/> <text x="20" y="242" font-size="10" fill="#64748b">unidireccional</text> <!-- nota --> <rect x="500" y="246" width="224" height="22" rx="4" fill="#f8fafc" stroke="#e2e8f0" stroke-width="1"/> <text x="508" y="261" font-size="10.5" fill="#0f172a">selecciona posició (2&#8319; posicions)</text> <!-- ===================== BUS DE CONTROL (y=310) ambdós sentits, fines ===================== --> <text x="20" y="306" font-size="13" font-weight="700" fill="#0f172a">Bus de control</text> <!-- línia principal fina --> <line x1="188" y1="310" x2="702" y2="310" stroke="#334155" stroke-width="1"/> <!-- fletxes fines en ambdós extrems --> <polygon points="172,310 188,304 188,316" fill="#334155"/> <polygon points="718,310 702,304 702,316" fill="#334155"/> <text x="20" y="322" font-size="10" fill="#64748b">ambdós sentits</text> <!-- nota --> <rect x="490" y="326" width="234" height="22" rx="4" fill="#f8fafc" stroke="#e2e8f0" stroke-width="1"/> <text x="498" y="341" font-size="10.5" fill="#0f172a">lectura/escriptura, rellotge, interrupcions</text> <!-- Llegenda inferior --> <line x1="20" y1="372" x2="720" y2="372" stroke="#e2e8f0" stroke-width="1"/> <text x="20" y="392" font-size="11" fill="#64748b">Els tres busos interconnecten la CPU, la memòria i els controladors d'E/S.</text> <text x="20" y="408" font-size="11" fill="#64748b">El de dades (blau, gros) és bidireccional; el d'adreces, unidireccional des de la CPU.</text> </svg>

Figura 10. El sistema de tres busos: dades (bidireccional), adreces (unidireccional) i control.

\text{Espacio direccionable} = 2^{n}\ \text{posiciones} \qquad (n=32 \Rightarrow 2^{32} = 4\ \text{GiB}).

9.2. Parámetros i temporització

El rendiment d'un bus depende de su anchura i de su frecuencia de funcionament; el producto d'ambdues da el ancho de banda (bytes por segundo transferibles). Per exemple, un bus de 64 bits (8 bytes) operando a 1.600 MHz proporciona un ancho de banda de 8 \times 1{,}6\times10^{9} = 12{,}8 GB/s. l'acceso al bus exige un protocolo de temporització, que pot ser síncrono (gobernado por un reloj comú, sencillo però limitado por el dispositiu més lento i por la longitud de les líneas) o asíncrono (basado en señales de petició i reconociment, handshaking, més flexible i tolerante a dispositius de veloctats dispares). Quan varis mestres (CPU, controladores de DMA) poden iniciar transferencias, se necessita un árbitro de bus que conceda l'acceso i evite conflictos, mitjançant esquemes de priortat fija, priortat rotatoria (round-robin) o encadenament en margarita (daisy chain).

9.3. dels buses compartidos a les interconexiones punto a punto

El modelo de bus compartido únic, vàlid para razonar conceptualmente, ha quedado superado en la práctica por sus limitacions: un medi compartido degrada su rendiment al crecer el nombre de dispositius i la frecuencia, por problemes de capacitancia parásita, de desfase entre líneas (skew) i de contenció por l'acceso. Les arquitecturas actuales han evolucionado cap a enllaços serie punto a punto d'alta velocitat i cap a topologías conmutadas. PCI Express, per exemple, no és un bus compartido sinó un conjunto d'enllaços serie diferenciales (lanes) conmutados; un dispositiu pot agrupar 1, 4, 8 o 16 lanes segons su necessitat d'ancho de banda. La evolució de sus generacions ilustra bien la tendencia, pues cada una duplica aproximadamente la tasa por lane:

Generació PCIe Tasa por lane Ancho de banda x16 (aprox., por sentit)
PCIe 3.0 8 GT/s ≈ 16 GB/s
PCIe 4.0 16 GT/s ≈ 32 GB/s
PCIe 5.0 32 GT/s ≈ 63 GB/s
PCIe 6.0 64 GT/s (PAM4) ≈ 121 GB/s

Les interconexiones entre núcleos i memòria en l'interior del propi chip emplean xarxes en anillo o en malla, i entre procesadores s'usan enllaços coherentes com els de les famílies de servidors. Conceptualmente, no obstant això, sigue siendo vàlid distinguir les tres funcions —transportar datos, adreces i control—, encara que físicamente viajen multiplexadas i serializadas sobre els mateixos enllaços diferenciales, amb la adreça i els datos empaquetados en tramas amb encabezado. l'esquema funcional clásico del bus tripartito conserva, por ello, tot su valor pedagógico com abstracció, encara que no describa ja la realitat eléctrica.

10. Generacions i evolució dels ordenadores digitales

La historia del ordenador digital s'ha organizado tradicionalmente en generacions, definidas por la tecnología dominante de sus componentes actius. Aquesta periodització, encara que simplificadora, resulta útil para comprender la evolució dels elementos funcionales.

  • Generació zero (electromecánica, fins als anys cuarenta): máquinas basadas en relés, com l'Harvard Mark I o el Z3 de Konrad Zuse (1941), considerado el primer ordenador programable controlado por programa. En aquest periodo se gestan les ideas, però les máquinas són lentas i de propósito limitado.
  • Primera generació (válvulas de vacío, 1945-1955): l'ENIAC (1946), de propósito general però programado por recableado, i l'EDVAC i l'EDSAC (1949), ja amb programa almacenado, materializan el modelo de von Neumann. Són máquinas voluminosas, costosas i poc fiables, programadas en llenguatge máquina.
  • Segunda generació (transistor, 1955-1965): la invenció del transistor en 1947 (Bardeen, Brattain i Shockley, en els Laboratorios Bell) sustituye a la válvula, reduciendo tamaño, consumo i fallades. Aparecen els primeros lenguatges d'alt nivell (FORTRAN, COBOL, LISP) i els sistemas operatius por lotes.
  • Tercera generació (circuito integrado, 1965-1971): la integració de múltiples transistores en un mateix chip (Jack Kilby i Robert Noyce) reduce drásticamente el coste i el tamaño. Surgen les famílies de computadores compatibles, com l'IBM System/360, que separa por primera vez arquitectura d'implementació, i la multiprogramació.
  • Cuarta generació (microprocesador, des de 1971): la integració a gran escala permet alojar tota la CPU en un només chip. l'Intel 4004 (1971), de 4 bits i uns 2.300 transistores, inaugura la era del microprocesador, que conduce al ordenador personal i a la informática ubicua. És la generació en la que seguimos, ampliada por els procesadores multinúcleo, la computació móvil i els sistemas en chip (SoC).
  • Més allá de la cuarta generació: suele hablarse d'una quinta generació asociada históricamente a la inteligencia artificial i al procesament paralelo masivo. Hoy les fronteras de la evolució se sitúan en els aceleradores especializados (GPU para cómputo masivamente paralelo, TPU i NPU para inteligencia artificial), la computació heterogénea, els sistemas en chip que integren CPU, GPU i aceleradores, i, en l'horizonte de la investigació, la computació cuántica i la neuromórfica, paradigmas que s'apartan del modelo de von Neumann i abren cuestiones teóricas sobre els límites de lo computable de forma eficiente.

10.1. Les lleis d'escalado i sus límites

El motor de tota aquesta evolució ha sido la llei de Moore, la observació de Gordon Moore (1965) de que el nombre de transistores por chip se duplicaba aproximadamente cada dos anys. Íntimamente ligado a ella operó durant décadas el escalado de Dennard, que establecía que al reducir el tamaño dels transistores su denstat de potencia se mantenía constante, de modo que cada nova generació ofrecía més transistores a major frecuencia sense aumentar el consumo por untat de área. La combinació d'ambdues lleis sostuvo el creixement exponencial del rendiment durant casi quatre décadas.

No obstant això, cap a mediados de la década de 2000 l'escalado de Dennard se rompió: a escalas nanométricas, les corrientes de fuga i la disipació térmica dejaron de ser despreciables, i la frecuencia de reloj s'estancó en torno als pocos gigahercios, incapaz de crecer sense fundir el chip. És el llamado muro de la potencia (power wall). La respuesta de la industria fue histórica: dejar de perseguir la frecuencia i volcarse en el paralelismo, multiplicando els núcleos en lloc d'acelerarlos. A ello se sumó el fenómeno del silicio oscuro (dark silicon), això és, la imposibiltat de mantener encendidos simultáneamente tots els transistores d'un chip por restriccions térmicas, que ha impulsado la especialització: en vez de núcleos genéricos sempre actius, s'integren blocs especializados (codificadores de vídeo, motores d'IA, criptografía) que s'encienden només quan se necessiten i fan su tasca amb enorme eficiencia energética.

La llei de Moore, aun ralentizada, no s'ha detenido del tot, però se sostiene amb noves tècniques: transistores tridimensionales (FinFET i, més recientemente, nanosheet o GAAFET), apilament vertical de circuitos (integració 3D) i, molt señaladamente, el disseny amb chiplets, que fragmenta un procesador en varis dados més pequeños fabricados por separado i unidos en un mateix encapsulado, mejorando el rendiment de fabricació i permitiendo mezclar tecnologías. En el panorama de 2026, aquesta tendencia se manifiesta en els sistemas en chip d'alt rendiment i sota consumo basados en ARM que dominan la computació móvil i ganan terreno en portátiles i servidors, en l'auge de RISC-V com alternativa oberta, i en la centraltat de les GPU i NPU para les cargas d'inteligencia artificial. Tot ello confirma que la mejora del rendiment se busca hoy menys en la frecuencia i més en el paralelismo, la eficiencia energética i la especialització del hardware, lo que a su vez pone sota tensió el modelo clásico: la computació centrada en datos, el procesament en memòria (in-memory computing) o els aceleradores desagregados són intentos de sortear el cuello de botella de von Neumann sense abandonar, salvo en paradigmas experimentales com el cuántico o el neuromórfico, el modelo conceptual heredado de von Neumann i Turing.

11. Aplicació didáctica i relació amb el currículum

Aquest tema és la puerta d'entrada a la parte més característica de Sistemas i Aplicacions Informáticas: l'hardware i su explotació. Abans de montar, configurar o diagnosticar un equip hi ha que saber qué fa cada bloc funcional i cómo cooperan.

Su encatge més directe està en el CFGM de Sistemas Microinformáticos i Xarxes (SMR), en «Montatge i manteniment d'equips» (0221), on el modelo de von Neumann deja de ser un esquema de libro para convertirse en les piezas que l'alumnat té sobre la mesa: procesador, memòria, buses en la placa, controladoras d'entrada/eixida. En Grado Superior, «Fundamentos d'hardware» (0371) lo retoma amb el rigor necessari para dimensionar servidors, i «Sistemas informáticos» (0483) lo usa com marco para entender la virtualització, on eixos mateixos blocs funcionales pasan a ser virtuales. En la FP Bàsica, «Montatge i manteniment de sistemas i componentes informáticos» trabaja una versió simplificada però igual de práctica: identificar, extraer i sustituir cada elemento.

La transposició didáctica més eficaz combina lo abstracto i lo físico en la mateixa sesió: presentar el cicle d'instrucció amb un simulador de máquina de von Neumann, on se ve avanzar el contador de programa, i a continuació abrir un equip real i señalar dónde vive cada bloc del esquema. Les preconcepcions més frecuentes són creer que la memòria RAM «guarda» els fitxers com el disco, i suponer que un procesador més rápido acelera cualquier tasca; ambdues se desmontan bien amb medicions sencillas: apagar l'equip i comprobar qué se pierde, o cronometrar una copia de fitxers limitada por el disco i no por la CPU.

En la avaluació conviene pedir explicacions causales —qué ocurre des de que se pulsa una tecla fins a que aparece el carácter en pantalla— abans que la reproducció del esquema. La atenció a la diversitat s'apoya amb material visual i manipulatiu: el diagrama de blocs i l'equip obert són dos representacions del mateix contingut, i ofrecer ambdues és disseny universal per a l'aprenentatge (DUA) aplicado amb naturaltat, no un añadido.

12. CONCLUSIÓ

A lo largo del tema hemos recorrido els elementos funcionales del ordenador digital partiendo de su fundamento teórico i descendiendo fins a su realització física. La máquina de Turing nos ha proporcionado el marco que defineix qué és computable, ha revelado que la inmensa mayoría de les funcions són incomputables i ha mostrado que l'ordenador moderno és, en esencia, una realització de la máquina universal: una máquina que lee la descripció d'altra i la ejecuta. La arquitectura de von Neumann, amb su principio de programa almacenado, ha traducido eixa idea en una organització concreta —CPU, memòria, I/S i buses— cuya vigencia se mantiene ochenta anys després, mientras la arquitectura Harvard i sus variantes modificadas demuestran cómo l'ingenio sortea les limitacions del modelo original —singularmente el cuello de botella de von Neumann— sense renunciar a su flexibilitat.

Hemos analizado la CPU i sus tres blocs —untat de control, ALU i registres—, amb sus dicotomías RISC/CISC i microarquitectura/ISA; el cicle d'instrucció com latido del sistema, cuantificado mitjançant la ecuació del rendiment i refinado amb segmentació i paralelismo sota el techo que impone la llei d'Amdahl; la jerarquía de memòria sustentada en el principio de localtat, cuya eficacia hemos medido amb el temps medi d'acceso; el subsistema d'I/S amb sus tècniques de sondeo, interrupcions i DMA; i el sistema de buses que articula el conjunto, ja evolucionado cap a interconexiones serie punto a punto. La perspectiva histórica de les generacions, i l'anàlisi de la llei de Moore, l'escalado de Dennard i sus límites, ha mostrado que, encara que la tecnología cambie de les válvulas als nanómetros, els elementos funcionales i su lógica de cooperació permanecen com invariantes conceptuales.

La idea de fondo que conviene retener, i transmitir al alumnat, és que l'ordenador no és una suma de piezas, sinó un sistema cuyo comportament emerge de la interacció coordinada d'untats simples gobernadas por un programa. Comprender aquesta arquitectura no només és requisit para administrar, programar o reparar equips, sinó que constituye la base intelectual de tota la disciplina informática i el punt de partida natural para abordar els temes posteriores del temari, des de la representació de la informació fins als sistemas operatius i les xarxes.

13. Bibliografia i referències

Referencias tècniques (manuales i estándares de referencia)

  • Stallings, W. (2021). Organització i arquitectura de computadores (11.ª ed.). Pearson.
  • Hennessy, J. L. i Patterson, D. A. (2019). Computer Architecture: A Quantitative Approach (6.ª ed.). Morgan Kaufmann.
  • Patterson, D. A. i Hennessy, J. L. (2021). Computer Organization and Design: The Hardware/Software Interface (RISC-V Edition, 2.ª ed.). Morgan Kaufmann.
  • Tanenbaum, A. S. i Austin, T. (2013). Organització de computadoras: estructura dels sistemas digitales (6.ª ed.). Pearson.
  • Hyde, R. (2010). The Art of Assembly Language (2.ª ed.). No Starch Press.
  • Turing, A. M. (1936). «On Computable Numbers, with an Application to the Entscheidungsproblem». Proceedings of the London Mathematical Society.
  • von Neumann, J. (1945). First Draft of a Report on the EDVAC. Moore School of Electrical Engineering, University of Pennsylvania.
  • Backus, J. (1978). «Can Programming Be Liberated from the von Neumann Style?». Communications of the ACM, 21(8).
  • Sipser, M. (2012). Introduction to the Theory of Computation (3.ª ed.). Cengage Learning.
  • Hopcroft, J. I., Motwani, R. i Ullman, J. D. (2007). Introduction to Automata Theory, Languages, and Computation (3.ª ed.). Pearson.
  • IEEE Standard for Floating-Point Arithmetic, IEEE 754-2019.
  • JEDEC Solid State Technology Association. DDR5 SDRAM Standard (JESD79-5).
  • PCI-SIG. PCI Express Base Specification (vigente).
  • Webgrafía: documentació tècnica d'arquitecturas en developer.arm.com, riscv.org i www.intel.com (consultadas en 2026).

Orientacions para l'estudio

  • Domina primero l'esquema dels quatre subsistemas i els tres buses; és l'andamiatge sobre el que cuelga tot lo demás i permet reconstruir el tema encara que s'olvide algún detalle.
  • Memoriza el cicle d'instrucció amb sus registres (PC, IR, MAR, MDR) i sé capaz de narrarlo pas a pas, incluso en notació RTL: és la pregunta estrella i demuestra comprensió profunda ante el tribunal.
  • Lleva preparado al menys un exemple numérico resuelto de cada bloc (l'AMAT amb dos nivells de caché, el desglose d'una adreça en etiqueta/ÍNDEX/desplazament, la ecuació del rendiment, la llei d'Amdahl); un cálculo bien ejecutado eleva la nota més que un párrafo teórico.
  • Practica la comparació von Neumann frente a Harvard amb un exemple concreto (un PC frente a un microcontrolador) i cuantifica l'ancho de banda; les comparacions bien argumentadas i amb nombres elevan la nota.
  • Ten claras les dicotomías que suelen preguntarse: RISC/CISC, acarreo/desbordament, ISA/microarquitectura, escritura directa/posescritura, sondeo/interrupcions/DMA. Distinguirlas amb precisió separa un 7 d'un 10.
  • Conecta cada concepto técnico amb su utiltat práctica i didáctica; el tribunal valora que un futuro docent sepa para qué sirve lo que explica i cómo lo enseñaría.
  • Dibuja sempre un esquema de la arquitectura al desarrollar el tema por escrito: ordena tu exposició, ahorra palabras i transmite clartat.
  • Actualiza els exemples a 2026 (DDR5, PCIe 5.0/6.0, NVMe, RISC-V, chiplets, GPU/NPU, fi del escalado de Dennard) para evidenciar rigor técnico vigente sense perder els fundamentos atemporales.

Genera tus temas como este

Crea temas desarrollados de tu especialidad y comunidad, con el tono y la longitud que prefieras, y conviértelos en esquemas y flashcards.