Cómo funciona un procesador
El procesador es la parte del ordenador que ejecuta los programas, o lo que es lo mismo, los programas le dicen qué tiene que hacer. Esto se hace mediante la ejecución de instrucciones cuya función puede ser desde sumar dos números hasta acceder a un dispositivo de hardware. Las operaciones aritmético-lógicas no son más que cuentas matemáticas que se encargan de calcular el resultado que pida algún programa. Los datos que recibe el procesador y los resultados que arroja son ilegibles para las personas, por lo que hacen falta dispositivos de entrada/salida que de alguna forma traduzcan esta información tanto desde la persona a la máquina como de la máquina a la persona. Este hardware que traduce la información también está controlado por el procesador. Todo lo que vemos en las pantallas de nuestro ordenador, escuchamos por los altavoces, etc, es “creado” directa o indirectamente por el procesador de nuestro ordenador. Por ejemplo, si estamos escuchando una canción en mp3, el procesador se encarga de decodificarla (descomprimirla principalmente) y acceder a la tarjeta de sonido para decirle qué tiene que hacer en cada momento. Si estamos jugando a algún juego es el procesador el que, en función de la tecla que estamos pulsando o del movimiento del ratón, mandará a la tarjeta gráfica lo que tiene que hacer para que esta pueda representar las imágenes en la pantalla. Y así ocurre con todo el hardware del ordenador. Un procesador no es más que un director de orquesta que se encarga de controlar qué hacen y qué dejan de hacer las distintas partes del ordenador en función de un conjunto de instrucciones que le dicen qué debe hacer (los programas).
Cómo están diseñados los procesadores
Un procesador está hecho básicamente de dos partes: una unidad aritmético lógica (ALU) que se encarga de hacer operaciones matemáticas (sumas, restas, etc) y lógicas (AND, OR…) y una unidad de control, que es la que ejecuta los programas y se encarga de decirle a la ALU qué operaciones tiene que hacer.
Como todos sabemos, los ordenadores son dispositivos electrónicos digitales que funcionan única y exclusivamente con ceros y unos. El pilar fundamental con el que se fabrican los sistemas digitales como los ordenadores es el álgebra de Boole. Estas matemáticas explican las operaciones fundamentales que se pueden realizar con el código binario.
Resulta que los procesadores están constituidos por unos elementos minúsculos llamados transistores (puertas lógicas). Cada puerta lógica es capaz de realizar una operación fundamental. Las puertas lógicas se pueden materializar de muchas formas: mecánicamente, con válvulas de vacío, con relés, con transistores, etc. Los procesadores actuales están construidos con centenares de millones de transistores. En definitiva, las puertas lógicas son los ladrillos con los que se construyen los procesadores y por si solas son capaces de realizar operaciones lógicas. Uniéndolas de diferentes formas se podrán realizar operaciones más complejas, como por ejemplo sumas de diferentes números. También se podrán construir elementos de memoria. Todo esto dependerá de la forma en que unamos las distintas puertas lógicas. Estos elementos básicos tienen desde una a varias entradas y una sola salida.
Código binario
Sus elementos son el 0 y el 1. Las operaciones se realizan como en el sistema decimal. El valor de los unos depende de su posición. En el sistema decimal también, y una posición más a la izquierda significa que el valor del número se multiplica por 10. Por ejemplo, el valor 20 es el 2 multiplicado por 10 porque está en la segunda posición. Si estuviera en la tercera (200) el 2 se multiplicaría por 100. En el código binario ocurre lo mismo pero multiplicando por 2 en vez de por 10. Por ejemplo el valor 10 en decimal significa 2, porque el uno está en la segunda posición. Si estuviera en la tercera (100) valdría 4 y así sucesivamente. Si hay varios unos pues se suman sus valores. Por ejemplo 1101 en decimal sería el 13 ya que (de derecha a izquierda) el primer uno vale la unidad, en la segunda posición cuyo valor es 2 hay un cero así que no vale nada, en la tercera hay un uno que por estar en la tercera vale 4 y en la cuarta hay otro uno que vale 8. Sumamos todos los valores y nos sale 13.
En resumen tan solo tenemos que ir multiplicando por 2 el valor de cada posición partiendo de la primera que vale la unidad.
Existen varias formas de traducir de decimal a binario y viceversa. También hay varias formas de representar los números enteros y reales (decimales) en función de la normalización usada. No voy a explicar nada de esto aquí. Solo por curiosidad, en la mayoría de los ordenadores los números reales se representan con la norma IEEE 754 y para los números enteros existen numerosas representaciones. Para la representación de texto antes se usaba mayoritariamente el código ASCII, pero desde que Windows NT se ha convertido en un SO de ámbito doméstico es el UNICODE el que predomina. Para representar sonidos e imágenes hay infinidad de formatos aunque es el PCM y el mapa de bits respectivamente los que más extendidos estaban antes de la extensión del MP3 y el JPEG.
Álgebra de conmutación
Hay diferentes operaciones lógicas y por lo tanto diferentes tipos de puertas lógicas. La función de estas es arrojar un resultado en función de la entrada. Las más importantes son las siguientes:
Operación AND: Se trata de la multiplicación de varios números binarios. Lo importante de esta operación es saber que para que la salida sea 1, todas las entradas tienen que ser 1. Si por ejemplo tenemos un transistor con tres entradas y una salida (todos tienen una sola salida) y en todas las entradas metemos el valor 1, la salida será uno. Si tan solo una o más de las entradas es cero, la salida será cero.
Puertas AND de 2, 3, 4 y 8 entradas
· Operación OR: En este caso con que una sola de las entradas sea 1, la salida valdrá 1, o lo que es lo mismo, para que la salida valga cero todas las entradas tienen que valer cero.
Puertas OR de 2, 3, 4 y 8 entradas
· Operación NOT: Solo tiene una entrada. Tan simple como que si la entrada vale 1 la salida vale 0 y viceversa.
Puerta NOT
· Operación NAND: Es igual a la operación AND con la única diferencia de que en la salida se produce la operación NOT. Esto quiere decir que si el resultado de la operación AND vale 1, la salida valdrá 0 y viceversa.
Puerta NAND de 2 entradas
Equivale a
· Operación NOR: Ocurre como en la NAND pero con la operación OR.
Puerta NOR de 2 entradas
· Operación EXCLUSIVOR: La salida valdrá 1 si el número de unos de la entrada es impar.
Puerta XOR de 2 entradas
· Operación EXCLUSIVENOR: La salida valdrá 1 si el número de unos de la entrada es par.
Puerta XNOR de 2 entradas
Con estas siete operaciones podremos hacer cualquier cosa, desde sumar dos números hasta representar los gráficos más avanzados del momento, pasando por ver fotografías, escuchar música o poder ver este texto en la pantalla de tu ordenador. Solo es necesario saber cómo unir estas operaciones para hacer unas más complejas.
Multiplexores/demultiplexores
Un multiplexor es un elemento con varias entradas y una salida. La entrada está dividida en dos tipos: el dato que queremos introducir y una dirección. La dirección indicará de qué entrada (de las múltiples que hay) se va a coger el dato y ese será el de la salida.
Imaginemos que tenemos un multiplexor con cuatro entradas de datos y por lo tanto dos entradas de dirección (para representar cuatro valores solo necesitamos dos bits). Entonces en la entrada tenemos 1000 y en la dirección tenemos 11, es decir, el valor 4. En este caso el cuarto valor de la entrada es el 0, por lo que la salida será cero. Si en la dirección hubieramos tenido el valor 00 entonces la salida habría sido 1.
Símbolo del multiplexor
Un demultiplexor hace lo mismo pero al revés. Tenemos una entrada y varias salidas controladas con una dirección. En este caso el valor de la única entrada irá a la salida que indique la dirección.
Por supuesto, estos elementos están construidos sólo con las operaciones lógicas básicas que he mostrado más arriba.
Esquema de un multiplexor
Circuitos combinacionales
Es un hecho que existe máquinas que realizan operaciones matemáticas en cuestión de milisegundos y que estas máquinas realizan estas operaciones sólo con unos pocos tipos de puertas lógicas.
Imaginemos que queremos sumar dos números, el 1 y el 2. Para representar ambos datos y el resultado vamos a necesitar tres bits. El primer dato (el 1) será en binario 01, el segundo dato (el 2) será 10 y el resultado (3) será 11. El resumen, queremos crear un circuito con el que introduciendo dos valores obtengamos un tercero de forma que este sea la suma de los dos primeros. Para ello podríamos juntar puertas lógicas de la siguiente forma.
Sumador de dos bits
A este tipo de circuitos se les llama combinacionales porque les introducimos unos valores y por la salida aparecen otros en función de la configuración de las puertas. Con los circuitos combinacionales podemos crear desde dispositivos que hagan operaciones aritméticas básicas (como el sumador que de arriba) hasta codificadores-decodificadores que traduzcan de un código a otro.
Para el diseño de un circuito combinacional existe distintos métodos que simplifican muchísimo el trabajo los cuales no voy a mencionar aquí. Solo es interesante saber que para diseñar un circuito combinacional es necesario saber cuales van a ser los resultados en función de las entradas con TODAS las combinaciones posibles.
De esta forma nos podemos hacer una idea de cómo podría funcionar la ALU de un procesador. Ésta tan solo recibe datos y el tipo de operación que tiene que hacer con estos datos y arroja un resultado en función de la entrada.
Elementos de memoria
En jerga informática a un elemento de memoria se le llama biestable. Un biestable es capaz de almacenar un solo bit de información. Uniendo varios biestables se consigue almacenar una cantidad mayor de información. Los biestables, como prometí un poco más arriba, se construyen también a base de puertas lógicas.
(Elementos de memoria hechos con puertas NOT y NAND. Podemos comprobar como gracias al bucle la información se mantendrá almacenada)
Existen distintos tipos de biestables cuyas características y fiabilidad cambian en función de cómo estén construidos (número y configuración de las puertas lógicas).
No existe un símbolo para representar un biestable, pero en función del tipo de biestable se suele usar el siguiente cambiando la denominación y número de patillas:
Biestable de tipo D
En resumen, se trata de un elemento capaz de almacenar un bit de información y del que podremos recuperar dicho bit cuando queramos.
Usando un gran número de elementos de memoria colocados en maya y unos cuantos de/multiplexores podemos hacernos una idea de cómo están construidas las memorias (RAM, Flash…).
Sistemas secuenciales
Ya hemos visto los circuitos secuenciales, en los cuales introduciendo un valor aparece otro diferente y siempre que introduzcamos la misma entrada nos aparecerá la misma salida. Pero también existe otro tipo de circuito con el que no siempre obtendremos la misma salida introduciendo la misma entrada. A estos sistemas se les llama secuenciales. A diferencia de los combinacionales, estos últimos además de tener en cuenta la entrada, tienen en cuenta los resultados anteriores, es decir, que recuerdan lo operaciones anteriores y en función de dichas operaciones y de la entrada aparecerá un nuevo resultado. Obviamente para que un circuito pueda recordar cosas necesita una memoria y es aquí donde hacen aparición los biestables.
Imaginemos que queremos diseñar un circuito cuya función sea la de sumar dos números, uno de ellos lo introducimos nosotros y el otro vale el resultado de la suma anterior anterior. Tan solo tenemos que coger el sumador que hemos diseñado más arriba y ponerle un biestable cuya entrada será la salida del sumador y su salida será la entrada del sumador. Con este circuito además de haber diseñado un sumador de estas características hemos conseguido un contador; un elemento importantísimo para el funcionamiento de un procesador.
Otros sistemas secuenciales muy importantes para el funcionamiento de un procesador son los:
· Bancos de registros: Son una agrupación de biestables capaces de escribir y leer información.
· Registros de desplazamiento: Son circuitos que se encargan de desplazar la información de un lado a otro. Por ejemplo si tenemos la cadena 11010000 y la introducimos en un registro “de desplazamiento a la izquierda” una sola vez el resultado será 10100001. Si lo volvemos a introducir el nuevo resultado será 01000011. Existen numerosos tipos de registro de desplazamiento.
· Contadores: Como el que he comentado más arriba. También se pueden usar registros de desplazamiento para construir contadores.
Con los circuitos secuenciales nos podemos hacer una idea de cómo funciona parte de la ALU y la unidad de control.
Hasta ahora hemos visto al procesador como sistema digital. Ahora vamos a ver cual es su trabajo.
Primero vamos a ver con algo más de detalle las partes de un procesador cualquiera. Como hemos dicho antes, un procesador está constituido por una unidad de control (UC) y una unidad aritmético-lógica (ALU). La UC se encarga de ejecutar las instrucciones y de enviar a la ALU las operaciones que necesite realizar. Pero también disponen de una memoria interna diferente a la caché mucho más rápida que esta y de menor tamaño que se divide en los llamados registros internos.
Registros internos
Su función es la de almacenar temporalmente información. Un procesador manipula esencialmente dos tipos de información: los datos y las direcciones de memoria. Para los datos se emplean registros de datos y para las direcciones se emplean registros de direcciones. Esto de separar esta información se produce porque existen varios métodos para tratar las direcciones de memoria. En los procesadores x86, los registros de direcciones se dividen a su vez en otros más especializados (memoria virtual, segmentación y virtualización). Además de estos, en cualquier procesador podemos encontrar los siguientes registros:
• Contador de programa, que no es más que un contador que le dice al procesador la dirección de memoria RAM donde se encuentra la siguiente instrucción a leer. Así pues se trata de un registro de direcciones.
• Registro de instrucción sirve para almacenar la instrucción que se está ejecutando en este momento.
• Puntero de pila: su función es almacenar la dirección del comienzo de la pila. La pila es una memoria en la que se van almacenando información y a la hora de recuperarla primero sale la última que ha entrado y por ultima sale la primera que ha entrado (como si hacemos un montón de cosas y luego vamos cogiendo las de más arriba hasta llegar a las de más abajo).
• Registro de estado: Indican el estado de la ALU, por ejemplo, si se ha producido desbordamiento (se ha realizado una operación con más cifras de las que puede realizar la máquina; en la casos de las calculadoras el desbordamiento parece como ERROR), si alguna operación ha dado como resultado cero, etc.
Direccionamiento de memoria
Cuando un procesador quiere obtener información de la memoria RAM, este debe saber en qué parte de la memoria se encuentra dicho dato. La memoria RAM de un ordenador x86 está dividida en fragmentos de un byte y a cada byte le corresponde una dirección de memoria. Cuanto mayor sea la dirección mayor será la cantidad de memoria direccionable y por lo tanto mayor será la cantidad de RAM que se pueda instalar. Para saber la cantidad de memoria que se puede instalar en un ordenador x86 tan solo tenemos que hace la operación 2 elevado al número de bits. Por ejemplo, un ordenador con un procesador de 16 bits podría direccionar 65.536 Bytes o lo que es lo mismo, 64 KBytes de RAM.
Como muchos hemos visto últimamente, a los ordenadores que operan con un procesador o un sistema operativo de 32 bits y tal y como sale como resultado de hacer 2 elevado a 32, la memoria máxima que detecta como es lógico es de ¿3 GBytes y pico?
Acceso a dispositivos
Algo tan necesario para un procesador como es acceder a la memoria RAM es tener acceso a los distintos dispositivos que hay conectados a nuestro ordenador (controladora de disco duro, tarjeta gráfica, buses USB, etc, etc, etc) ya que de ellos se capta información y también se envían resultados. La forma que tiene un ordenador x86 de acceder a los distintos dispositivos conectados es mediante direcciones de memoria. Por ello, cuando conectamos algún hardware, el sistema automáticamente reserva un rango de direcciones para el acceso a dicho dispositivo. Si por ejemplo el procesador quiere coger información del disco duro no tiene más que saber la dirección de la controladora (eso se lo dice la BIOS) y empezar a operar en el disco duro. Si los dispositivos tienen funciones más complejas que la BIOS no sabe (como la aceleración gráfica) harán falta controladores que le digan al procesador (el realidad al sistema operativo) como manejar dichas funciones. Y esta es la razón por la que en un sistema x86 de 32 bits, los cuales pueden direccional 4 gbytes tan solo funcionan más de 3 gbytes de RAM.
Código máquina
Todos los programas que ejecutamos en nuestro ordenador, desde la BIOS hasta el juego más novedoso, pasando por Windows y todas sus utilidades están compuesto por instrucciones máquina. Estas instrucciones son las operaciones que puede realizar un procesador. Un ejemplo puede ser la suma de dos números. Otro podría ser enviar tal información a tal dirección de memoria. Existen cuatro tipos de instrucciones máquina:
• De transferencia de datos: Su función es mover información de unos sitios a otros del ordenador. Dicha información permanece inalterada. Si por ejemplo queremos copiar un archivo del disco duro y un reproductor de MP3 tendremos que acceder a la controladora del disco duro, captar la información que queremos, moverla a RAM (en forma de caché para que la transferencia se agilice), acceder al dispositivo USB mediante su dirección de memoria correspondiente y depositar ahí la información que previamente hemos copiado en RAM.
• Procesamiento de datos: Básicamente son las operaciones aritmético-lógica, de incremento-decremento o de rotación, como las que se producen cuando por ejemplo movemos el cursor de ratón incrementando o decrementando la posición en los ejes XY.
• Control: Su función es realizar paradas en el procesador para ejecutar otras instrucciones. A esto se le llama interrupciones y en los sistemas x86 se produce una interrupción cada vez que pulsamos una tecla, movemos el ratón o cualquier dispositivo le pide atención al procesador. Realmente lo que se hace es parar todo lo que se está haciendo para atender la petición pero los procesadores son tan rápidos que dicha interrupción para desapercibida por nosotros.
• Ruptura de secuencias: Todo lo relacionado con saltos y condiciones. Más adelante pondré algún ejemplo.
Este apartado es realmente difícil de explicar de forma extendida para los profanos en programación, así que lo haré de la forma más simple posible.
La programación en código máquina es secuencial. Esto quiere decir que las instrucciones se van ejecutando por orden: primero la primero, después la segunda, etc. Para que un procesador en un sistema x86 pueda ejecutar un programa este tiene que estar en la memoria RAM. Una vez ahí y con ayuda del contador de programa irá ejecutando una instrucción detrás de otra. Supongamos que queremos hacer la suma de dos número que están en la dirección 1221 y 1222 de memoria, que el resultado lo queremos en la dirección 1223 y que además aparezca en la pantalla del ordenador, siendo la dirección de la tarjeta gráfica para texto la 7576. Para ello el procesador tendrá que ejecutar un código como el siguiente:
SUMA A,1221,1222 (hace la suma de los datos que hay en esas direcciones y lo envía al registro de datos “A”).
COPIA 1223,A (Hace una copia de lo que hay en el registro de datos “A” a la dirección de memoria 1223).
COPIA 7576, 1223 (Vuelve a hacer una copia de la dirección donde está el resultado a la dirección que enviará la información a la tarjeta gráfica como texto y esta aparecerá en la pantalla).
Fijaos que algo tan simple como hacer una suma y mostrar el resultado en la pantalla requiere tres operaciones para el procesador. ¿Os imagináis qué haría falta para hacer la copia de un diskette al disco duro? Gracias al sistema operativo, entre otras muchas cosas, nos ahorra nos solo tener que saber código máquina, sino también tener que hacer miles de operaciones para poder copiar un archivo de unos poco megas.
Otras veces durante la ejecución del programa es necesario dar un salto, es decir, saltarse unas cuantas instrucciones hasta llegar a la deseada. Para esto se usan las instrucciones de ruptura de secuencia. Imaginemos que estamos copiando una película en una lápiz USB. Entonces se van copiando fragmentos de archivo siguiendo un programa secuencial, pero de repente del pendrive se queda sin memoria y nos aparece un mensaje diciendo que el lápiz no tiene capacidad suficiente. En este caso se ha roto la continuidad del programa y en vez de seguir copiando se ha ido a la parte del código que envía el mensaje de error. Este es un ejemplo sencillo de la función de las instrucciones condicionales.
El sistema operativo
En principio para poder operar con un ordenador es necesario programarlo, es decir, decirle todo lo que tiene que hacer y con todo me refiero a absolutamente todo. Gracias a los sistemas operativos todo este tema de la programación del procesador se hace totalmente transparente para el usuario. Cuando queremos acceder al disco duro no tenemos más que hacer clic en el icono del disco duro y automáticamente nos aparecen todas las carpetas y archivos que hay dentro. Esto en realidad es un proceso muchísimo más complejo que el sistema operativo nos simplifica. Uno de los primeros sistemas operativos para x86 fue el MS-DOS, que significa Microsoft Disk Operating System. La razón de este nombre no es otra que la función de este sistema operativo era la administración de los medios de almacenamiento. Para los que hemos tenido la oportunidad de vivir el momento en el que todo se manejaba con comandos sabemos que MS-DOS tenía utilidades de todo tipo, pero el tipo más abundante eran las de administración de discos duros y diskettes. Aunque pueda parecer raro, MS-DOS era una simplificación enorme para el manejo de la información de un ordenador, aunque hubiera que escribir varios comando para hacer algo que hoy se hace con un clic.
Además de hacernos la vida más fácil a la hora de manipular información en dispositivos de almacenamiento masivo los sistemas operativos se encargan de gestionar la memoria RAM disponible y la que usa cada programa, da la posibilidad de ejecutar numerosos programas en un solo procesador, administra los dispositivos de forma que solo nos tengamos que preocupar de instalar unos controladores, etc, etc, etc.
Eficiencia en la ejecución de instrucciones
Para finalizar voy a hablar sobré algo que desde los Athlon XP está “de moda” y es una de las razones por la que un procesador a una frecuencia inferior a otro opera más rápido que el segundo.
Cada vez que un procesador ejecuta una instrucción esta consume unos ciclos determinados. Por ejemplo en un 8086, la suma de dos números puede consumir hasta 7 ciclos de reloj. Si conseguimos diseñar un procesador en el que esa misma operación gaste tan solo 3 ciclos, a la mitad de frecuencia que el 8086 dicho procesador hará la suma más rápido que este primero. Así ocurre con todo el repertorio de instrucciones. Desde las nativas del x86 a las SSE3 (MMX4), cada vez se necesitan menos ciclos para hacer lo mismo y por eso últimamente aunque los procesadores no han aumentado su frecuencia significativamente si lo ha hecho su rendimiento. Por eso un Athlon XP a 1.6 GHz va igual de rápido que un Pentium 4 a 2 GHz y un solo núcleo de un Conroe a 1.6 GHz va el doble de rápido que el mismo Athlon XP a 1.6 GHz.
En resumen cada instrucción consume su número de ciclos y con el tiempo se van sacando nuevos repertorios cada vez más especializados y se van puliendo los anteriores.
Tuitear 5.841 Veces leído 0 comentarios |
6 agosto 2012 en Electronica | tags: Electronica |