Tema 1
REPRESENTACIÓN Y COMUNICACIÓN DE LA INFORMACIÓN. 1.1. Sistemas de numeración y codificación. Unidades y magnitudes informáticas. 1.2. Arquitectura de un sistema microinformático. Principios funcionales. 1.3. Análisis de bloques funcionales sobre arquitecturas vigentes.
© C E D E – www.cede.es
Profesores de Enseñanza Secundaria INFORMÁTICA
Tema 1.2
GUION - ÍNDICE INTRODUCCIÓN 1.1.
SISTEMAS DE NUMERACIÓN Y CODIFICACIÓN. UNIDADES Y MAGNITUDES INFORMÁTICAS 1.1.1. 1.1.2.
1.1.3.
1.1.4.
1.1.5.
Introducción Sistemas de Numeración 1.1.2.1. Sistema de Numeración decimal 1.1.2.2. Sistema de Numeración binario 1.1.2.2.1. Conversión entre números decimales y binarios 1.1.2.2.2. Operaciones aritméticas en el sistema binario 1.1.2.3. Sistema de Numeración octal 1.1.2.4. Sistema de Numeración hexadecimal 1.1.2.5. Conversiones entre sistemas de numeración Sistemas de codificación numérica 1.1.3.1. Números Naturales 1.1.3.2. Números Enteros 1.1.3.2.1. Signo y Magnitud 1.1.3.2.2. Complemento a 1 1.1.3.2.3. Complemento a 2 1.1.3.2.4. Codificación en Exceso 1.1.3.3. Números Reales 1.1.3.3.1. Coma Fija 1.1.3.3.2. Coma Flotante 1.1.3.4. Otros Códigos 1.1.3.4.1. BCD 1.1.3.4.2. Siete Segmentos 1.1.3.4.3. Codigo Gray Codificación de caracteres 1.1.4.1. ASCII 1.1.4.2. ASCII Extendido 1.1.4.3. Unicode 1.1.4.4. ISO 8859-1 Codificación de formatos multimedia 1.1.5.1. Conversión Analógica-Digital
© C E D E – www.cede.es
CEDE - C/ Cartagena, 129 - 28002 Madrid Tel.: 91 564 42 94
Profesores de Enseñanza Secundaria INFORMÁTICA
Tema 1.3
1.1.5.2.
1.1.6.
1.2.
Codificación de Imágenes 1.1.5.2.1. Formato JPEG 1.1.5.2.2. Formato GIF 1.1.5.2.3. Formato PNG 1.1.5.2.4. Formato BMP 1.1.5.3. Codificación de Audio 1.1.5.4. Codificación de Vídeo Unidades y Magnitudes Informáticas 1.1.6.1. Medidas de Información 1.1.6.2. Medidas de Frecuencia
ARQUITECTURA DE UN SISTEMA MICROINFORMÁTICO. PRINCIPIOS FUNCIONALES 1.1.2.1. Arquitectura Básica. Introducción 1.1.2.2. Unidad Central de Proceso (UCP) 1.2.2.1. Unidad de Control 1.2.2.2. Sistemas RISC 1.2.2.3. Sistemas CISC 1.2.2.4. Reloj de Sistema 1.2.2.5. Unidad Aritmético-Lógica (ALU) 1.2.2.6. Registros 1.2.3. Memoria 1.2.4. Buses 1.2.4.1. Bus de datos 1.2.4.2. Bus de direcciones 1.2.4.3. Bus de control 1.2.5. Unidad de Entrada-Salida 1.2.6. Set de Instrucciones 1.2.7. Modos de direccionamiento 1.2.8. Ejecución de una Instrucción 1.2.8.1. Ejecución de una aplicación paso a paso
1.3.
ANÁLISIS DE BLOQUES FUNCIONALES SOBRE ARQUITECTURAS VIGENTES 1.3.1. 1.3.2.
Clasificación de Arquitecturas. Taxonomía de Flynn Arquitecturas Actuales 1.3.2.1. Arquitectura x86 1.3.2.2. Arquitectura x86-64
CEDE - C/ Cartagena, 129 - 28002 Madrid Tel.: 91 564 42 94
© C E D E – www.cede.es
Tema 1.4
Profesores de Enseñanza Secundaria INFORMÁTICA
1.3.3.
Mejoras en las Arquitecturas Actuales 1.3.3.1. Instrucciones Multimedia 1.3.3.2. FPU 1.3.3.3. Segmentación a nivel de instrucción 1.3.3.4. Caché 1.3.3.5. DMA. Acceso Directo a Memoria 1.3.3.6. Procesadores Superescalares 1.3.3.7. GPUs 1.3.3.8. Buses de Alta velocidad 1.3.3.9. Virtualización 1.3.3.10. Overclocking dinámico
RESUMEN BIBLIOGRAFÍA COMENTADA
© C E D E – www.cede.es
CEDE - C/ Cartagena, 129 - 28002 Madrid Tel.: 91 564 42 94
Profesores de Enseñanza Secundaria INFORMÁTICA
Tema 1.5
INTRODUCCIÓN Los sistemas informáticos están construidos con sistemas digitales, es decir, sólo reconocen dos posibles valores, el 0 y el 1 (bit), y con dichos valores, han de ser capaces de representar toda la información que manipulan. Se necesita pues, un sistema de codificación que, utilizando únicamente dichos valores, se pueda almacenar, tratar y enviar todo tipo de contenidos: números, caracteres, imágenes, sonidos, vídeos, etc. En este apartado, se hará un repaso a los sistemas de numeración, y las distintas formas de codificar los números naturales, enteros y reales, se verá someramente el proceso de conversión de una señal analógica a digital, y la forma en que se codifican los contenidos multimedia.
1.1. 1.1.1.
SISTEMAS DE NUMERACIÓN Y CODIFICACIÓN. UNIDADES Y MAGNITUDES INFORMÁTICAS
INTRODUCCIÓN
Un sistema de numeración es un sistema de codificación destinado a representar números. Se dice que un sistema de numeración es no redundante cuando cada vector de dígitos, sólo representa un único número. Los sistemas de numeración que utilizamos, son sistemas posicionales, esto indica que cada dígito del vector que representa el valor, tiene mayor o menor valor, dependiendo de la posición que ocupe. El dígito con menor peso asociado se denomina el dígito menos significativo y suele encontrarse en la posición más a la derecha y en el lado contrario, se encuentra el dígito con mayor peso asociado, el dígito más significativo. En cualquier sistema de numeración posicional, una secuencia de dígitos se puede representar, formalmente, de la siguiente manera: Nb = ap−1 ap−2 ... a1 a0, a−1 a−2 ... a−q + 1a−q En el sistema de numeración posicional, se conoce la base como el conjunto de números permitidos de tal manera que si un sistema de numeración posicional es de base 2, disponemos de dos símbolos (0,1) para representar cualquier número. Este sistema de numeración, es el sistema binario. En el caso del sistema de numeración decimal, que es el que solemos usar las personas, disponemos de 10 símbolos, del 0 al 9. Para evitar confusiones y saber en qué base está un número, se indica su base mediante un subíndice. Si no existe dicho subíndice, como norma general, se considera que está en base 10, que es la que normalmente utilizamos las personas. Según esto, el número 10110012 está codificado en binario, y no debe confundirse con 10110018 que está en el sistema octal o 1011001 que es un número decimal.
CEDE - C/ Cartagena, 129 - 28002 Madrid Tel.: 91 564 42 94
© C E D E – www.cede.es
Tema 1.6
Profesores de Enseñanza Secundaria INFORMÁTICA
Existen otros sistemas ampliamente utilizados en informática, en especial, el sistema octal, en el que disponemos de 8 símbolos, del 0 al 7, y el sistema hexadecimal, que al disponer de 16 símblos posibles, también utiliza letras , en concreto, de la A a la F, para representar un número. El esquema de este apartado, es el siguiente:
1.1.2.
SISTEMA DE NUMERACIÓN
A continuación se van a estudiar los sistemas de numeración más importantes dentro de la informática. 1.1.2.1. Sistema de Numeración Decimal El sistema decimal tendría su origen en los diez dedos que tenemos en las manos, y que nos han servido de apoyo para contar, por tanto, en este sistema, disponemos del 10 símbolos, del 0 al 9. Estos símbolos se denominan números árabes y son de origen hindú. El sistema decimal, es un sistema posicional, es decir, las cifras de la izquierda, tienen más peso, y puede descomponerse en una suma de productos. Por ejemplo: 2475 = 2*1000 + 4*100 + 7*10 + 5*1 o lo que es lo mismo: 2475 = 2*103 + 4*102 + 7*101 + 5*100 que básicamente es la suma de las distintas cifras multiplicado por la base en que se encuentra, elevado a la posición que ocupa. De una forma más genérica, se puede escribir p −1
Nb = ¦ a i ∗ bi i =− q
siendo b la base en que se encuentra en número,
© C E D E – www.cede.es
CEDE - C/ Cartagena, 129 - 28002 Madrid Tel.: 91 564 42 94
Profesores de Enseñanza Secundaria INFORMÁTICA
Tema 1.7
i la posición del dígito con respecto a la coma, siendo q el número de dígitos que hay a la derecha de la coma, p el número de elementos a la izquierda de la coma. a es el dígito de cada uno de los símbolos que componen el número N. El sumatorio anterior, desarrollada, quedaría como sigue: Nb = ap−1·bp−1 + ap−2·bp−2 + ... + a1·b1 + a0·b0 + a−1·b−1 + a−2·b−2 + ... + a−q+1·b−q+1 + a−q·b−q
Éste es el denominado Teorema fundamental de la Numeración y nos va a permitir pasar cualquier número en base N, a base 10. 1.1.2.2. Sistema de Numeración binario
En el sistema de numeración binario, sólo se dispone de dos símbolos (0,1) para representar todos los números. El el sistema utilizado por los ordenadores que sólo son capaces de discriminar entre estos valores, ya que están construidos con circuitos digitales. Utilizando el teorema fundamental de la numeración, sabemos que el número binario 11012, se corresponde con el siguiente número decimal: 11012 = 1*23 + 1*22 + 0*21 + 1*20 8 + 4 + 0 + 1 = 13 y para expresar que ambas cifras son la misma cantidad, indicamos que 10112 = 1310 1.1.2.2.1. Conversión entre números decimales y binarios Convertir un número decimal al sistema binario es muy sencillo: basta con realizar divisiones sucesivas por 2 y escribir los restos obtenidos en cada división en orden inverso al que han sido obtenidos. El algoritmo que se sigue, es el siguiente: 1. Sea el entero i = 0. 2. Se divide el número M entre 2. 3. La división del punto 2 genera un resto que llamaremos ai y un cociente Ci. 4. Si el cociente Ci es distinto de cero, se hace M = Ci, se incrementa i y se repite desde el punto 2. 5. Si el cociente Ci es igual a cero, el proceso finaliza. El número en base 8 esta formado por el conjunto de los digitos ai donde el subíndice i indica la posición que ocupa cada digito en el número octal, esto es, el primer resto que se obtuvo (para i = 0, a0) es el digito menos significativo y, el último, el más significativo.
CEDE - C/ Cartagena, 129 - 28002 Madrid Tel.: 91 564 42 94
© C E D E – www.cede.es
Tema 1.8
Profesores de Enseñanza Secundaria INFORMÁTICA
Por ejemplo, para convertir el número 4410 en base 10, a binario, haremos una serie de divisiones sucesivas entre 2 (ya que queremos convertirlo a sistema binario). Los restos que aparecen al realizar las diferentes divisiones, son los que compondrán el número en binario. 44 : 2 = 22 22 : 2 = 11 11 : 2 = 5 5:2=2 2:2=1 1:2=0
Resto: 0 Resto: 0 Resto: 1 Resto: 1 Resto: 0 Resto: 1
tomando los restos anteriores en orden inverso al obtenido, tenemos que 44, en base 10, se correponde con la siguiente cifra binaria: 4410 = 1011002 Se puede observar que la cantidad de dígitos necesarios para representar un número en el sistema binario es mayor que en el sistema decimal. En el ejemplo del párrafo anterior, para representar el número 44, que en el sistema decimal está compuesto tan sólo por dos dígitos, han hecho falta seis dígitos en binario. Como norma general, para represntar la misma cantidad, se necesitarán más dígitos en los sistemas de numeración con una base menor. El sistema binario, es la menor base posible, por tanto, para representar cantidades relativamente pequeñas, se necesitan números con gran cantidad de dígitos. La cantidad de valores posibles representados con n dígitos binarios, es 2n − 1, por tanto, con 8 bits, podremos representar como máximo 28 − 1 = 256 − 1 = 255 valores diferentes. Hemos convertido un número decimal en binario, ahora haremos la operación inversa, es decir, convertir un número binario a decimal. Aplicaremos el teorema fundamental de la numeración, tal y como se ha indicado anteriormente con el siguiente ejemplo: 10112 = ¿? 10112 = 1*23 + 1*22 + 0*21 + 1*20 8 + 4 + 0 + 1 = 13 10112 = 1310 Por tanto, el valor 1310, representa la misma cantidad que 10112.
© C E D E – www.cede.es
CEDE - C/ Cartagena, 129 - 28002 Madrid Tel.: 91 564 42 94
Profesores de Enseñanza Secundaria INFORMÁTICA
Tema 1.9
1.1.2.2.2. Operaciones aritméticas en el sistema binario Suma Binaria
En el sistema binario, la operación de suma, se realizac igual que en el sistema decimal, pero hay que tener en cuenta de que ahora, sólo se dispone de dos símbolos, el 0 y el 1, por lo tanto, cuando sumamos 12 + 12, el resultado, también debe expresarse con esos dos símbolos. De hecho es 12 + 12 = 102. Hemos de recordar que 102 = 210. En esta tabla, se resume el resultado de las operaciones de suma binaria: Operación
Resultado
0+0
0
0+1
1
1+0
1
1+1
0 (con acarreo de 1)
Para mostrar con claridad la operación de suma, hagamos la suma binaria de dos números, por ejemplo 23 y 67. Lo primero que tenemos que hacer, es pasar dichos números a binario. Según se ha expuesto anteriormente, mediante divisiones sucesivas entre 2 y cogiendo los restos resultantes de la operación en orden inverso, obtenemos el valor en binario puro de 2310 y 6710: 2310 = 101112 6710 = 10000112 tenemos que tener en cuenta que cuando sumanos 12 + 12, el resultado es 0 y tenemos un acarreo de 1. Acarreo +
1 1 0 1 0 0 0 1 0 1 1
1 1 0 0
1 1 1 1 1 1 0
Por tanto 2310 + 6710 = 101112 + 10000112 = 10110102 Resta binaria
En el sistema binario, la operación de resta, también se hace como en el sistema decimal, aunque hay que tener en cuenta que no existe la operación 02 − 12. En la siguiente tabla, se muestra el resultado de las operaciones de resta binaria:
CEDE - C/ Cartagena, 129 - 28002 Madrid Tel.: 91 564 42 94
© C E D E – www.cede.es
Tema 1.10
Profesores de Enseñanza Secundaria INFORMÁTICA Operación
Resultado
0-0
0
0-1
No cabe
1-0
1
111
0
Como ejemplo, hagamos la resta binaria binaria de los números 67-23. En el ejemplo anterior, ya hemos hecho la conversión a binario de los números 67 y 23. Hemos obtenido que: 6710 = 10000112 2310 = 101112 Hemos de tener en cuenta que 02 − 12 no cabe, por lo que tenemos que hacer 102 − 12 y llevarnos un acarreo a la siguiente cifra del sustraendo: 1 0 0 0 0 1 1 − 01 01 11 01 1 1 1 0 1 0 1 1 0 0
Por tanto 6710 − 2310 = 10000112 − 101112 = 01011002 Las operaciones de resta, siempre se pueden realizar como una suma, en la que uno de los sumandos, sea un número negativo, pero para ello, debemos de saber representar los números negativos en binario. Multiplicación y División binaria
En cuanto a la multiplicación y a la división en el el sistema binario, también decir que se sigue el mismo procedimiento que en el sistema decimal. En la siguiente tabla, se muestra el resultado de la multiplicación en binario. Operación
Resultado
0*0
0
0*1
0
1*0
0
1*1
1
Como ejemplo, se va a realizar una multiplicación binaria de los dos números que estamos utilizando en los ejemplos: 67 y 23.
© C E D E – www.cede.es
CEDE - C/ Cartagena, 129 - 28002 Madrid Tel.: 91 564 42 94
Profesores de Enseñanza Secundaria INFORMÁTICA
*
+
1 0 0 1 0 0 1 1 0
1 0 0 0 0
1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0
0 0 0 0 1 0
0 1 0 1 1
Tema 1.11
1 1 1 1 1 1 1
0 1 0 1
Por tanto: 6710 * 2310 = 10000112 * 101112 = 110000001012 En lo referente a la división, sólo hay que hacer multiplicaciones y restas sucesivas, el proceso es metódico y sencillo, pero hay que reconocer, que , nosotros, al no estar acostumbrado a operar en binario, nos resulta un proceso largo y complicado. 1.1.2.3. Sistema de Numeración octal
El sistema de numeración en base 8, se llama octal, y utiliza los símbolos del 0 al 7, por lo tanto, no existen los símbolos 8 y 9. De acuerdo con lo anterior, no existen el número 258798, ya que ni el 8 ni el 9 son son símbolos permitidos. Convertir un número decimal al sistema octal es muy sencillo, ya que se siguen el mismo algoritmo que en la conversión de decimal a binarios, pero ahora, en lugar de dividir entre 2, hemos de dividir entre 8. Los restos obtenidos en las divisiones sucesivas, se cogen en orden inverso al que han sido obtenidos, y así obtenemos el número equivalente en octal. El algoritmo a seguir es el siguiente: 1. Sea el entero i = 0. 2. Se divide el número M entre 8. 3. La división del punto 2 genera un resto que llamaremos ai y un cociente Ci. 4. Si el cociente Ci es distinto de cero, se hace M = Ci, se incrementa i y se repite desde el punto 2. 5. Si el cociente Ci es igual a cero, el proceso finaliza. El número en base 8 esta formado por el conjunto de los digitos ai donde el subíndice i indica la posición que ocupa cada digito en el número octal, esto es, el primer resto que se obtuvo (para i = 0, a0) es el digito menos significativo y, el último, el más significativo. Por ejemplo, para convertir al sistema octal el número natural 74910, a octal, haremos una serie de divisiones indicadas en el procedimiento anterior, que arrojarán los restos siguientes: 74910 = ¿?8
CEDE - C/ Cartagena, 129 - 28002 Madrid Tel.: 91 564 42 94
© C E D E – www.cede.es
Tema 1.12
Profesores de Enseñanza Secundaria INFORMÁTICA
749 : 8 = 93 93 : 8 = 11 11 : 8 = 1 2:8=0
Resto: 5 Resto: 5 Resto: 2 Resto: 1
74910 = 12558 Para convertir un número en octal a decimal, se sigue el teorema fundamental de la numeración, por ejemplo, convirtamos el número 7158 a decimal. Aplicando el teorema fundamental de la numeración, tenemos que: 7158 = ¿?10 7*82 + 1*81 + 5*80 448 + 8 + 5 = 461 7158 = 46110 Hemos obtenido la cantidad equivalente al número 7158 ahora representado en el sistema decimal: 46110. El sistema octal tiene una propiedad importante, por el hecho de ser 8 potencia de 2 (8 = 23). Esta propiedad permita la conversión entre números binarios y octales de forma directa. Se puede convertir un valor en octal a binario con sólo calcular el valor binarios de cada uno de los dígitos de la cifra en octal. Veámoslo con un ejemplo: 7158 = ¿?2 vamos a coger por separado las diferentes cifras del número octal, y las pasamos a binario: cogemos la cifra más significativa y tenemos que 78 = 1112 como la segunda cifra: 18 = 0012 y por último, la cifra menos significativa: 58 = 1012 situamos los valores binario obtenidos en el proceso anterior, en la posición de la cifra en octal de la que procede, y así tenemos la conversión hecha. En el ejemplo anterior, tenemos que: 7158 = 1110011012 Hemos obtenido la cantidad equivalente al número 7158 en binario 1110011012 de una forma directa.
© C E D E – www.cede.es
CEDE - C/ Cartagena, 129 - 28002 Madrid Tel.: 91 564 42 94
Profesores de Enseñanza Secundaria INFORMÁTICA
Tema 1.13
1.1.2.4. Sistema de Numeración hexadecimal
En el sistema de numeración hexadecimal, existen 16 símbolos diferentes, por lo que no tenemos suficiente con los dígitos decimales, que son sólo 10 símbolos. Para representar los símbolos que faltan, se utilizan las 6 primeras letras del abecedario (de la A la F) en mayúscula, por tanto, los símbolos hexadecimales A, B, C, D, E y F equivalen, respectivamente, a los números 10, 11, 12, 13, 14 y 15. Valor hexadecimal
Valor decimal
Valor binario
A
10
1010
B
11
1011
C
12
1100
D
13
1101
E
14
1110
F
15
1111
El procedimiento para convertir un número decimal a hexadecimal, es el mismo expuesto anteriormente para la base 2 y la base 8, pero ahora, hay que dividir entre 16. En la conversión del número 64577210, a hexadecimal, haremos una divisiones sucesivas por 16 y cogeremos los restos en orden inverso al obtenido. Esto es: 645772 : 16 = 40360 40360 : 16 = 2522 2522 : 16 = 157 157 : 16 = 9 9 : 16 = 0
Resto: 12 (se corresponde con la letra C) Resto: 8 Resto: 10 (se corresponde con la letra A) Resto: 13 (se corresponde con la letra D) Resto: 9 64577210 = 9DA8C16 = x9DA8C
Como puede observarse en el resultado anterior, para indicar que un número está codificado en hexadecimal, se pueden seguir el método general de poner el subíndice 16 al final del número, o bien incluir un “x” delante del número. El proceso inverso, de convertir un número en hexadecimal a decimal, es sólo aplicar, de nuevo, el teorema fundamental de la numeración. Convirtamos el número 2AD416 a decimal. Hay que recordar la equivalencia entre las letras y sus valores en base 10, así que, aplicando el teorema fundamental de la numeración, tenemos que: X2AD4 = ¿?10 X2AD4 = 2*163 + 10*162 + 13*161 + 4*160 8192 + 2560 + 208 + 4 = 10964 X2AD4 = 1096410
CEDE - C/ Cartagena, 129 - 28002 Madrid Tel.: 91 564 42 94
© C E D E – www.cede.es
Tema 1.14
Profesores de Enseñanza Secundaria INFORMÁTICA
Al igual que ocurría con el sistema octal, por el hecho de ser 16 potencia de 2 (16 = 24). La conversión entre números binarios y hexadecimales, es directa. Cada dígito en hexadecimal, se corresponde con cuatro bits en binario, de tal manera que podemos hacer una conversión inmediata: X2AD4 = 00101010110101002 ya que x2 = 00102 xA = 10102 xD = 11012 x4 = 01002 El sistema octal y, especialmente el sistema hexadecimal, se utilizan ampliamente en el sector informático, ya que permiten representar números binarios largos con un número mucho menor de símbolos. El hecho que los valores expresados sean más cortos, evitan confusiones en la escritura de los valores numéricos binarios. 1.1.2.5. Conversiones entre sistemas de numeración Conversiones hacia/desde el sistema de numeración decimal
Hasta ahora se ha expuesto las conversiones de los sistemas binario, octal y hexadecimal a base 10, por ser éstos, los sistemas de numeración más importantes para los sistemas informáticos, pero el teorema fundamental de la numeración se puede aplicar a cualquier base N, por tanto, el procedimiento de convertir un número a decimal, es el mismo, independientemente de la base en que éste se encuentre originalmente. Conversiones entre sistemas de numeración cuya base es potencia de dos
También se ha expuesto que el paso de base octal y hexadecimal, es inmediato, por ser 8 y 16 potencia de dos. Podemos aprovechar esta propiedad para convertir números entre las bases octal y hexadecimal. Para ello, se hace la conversión de la base origen a binario y de binario a la base destino. Ejemplo
Convertir el número 75318 a hexadecimal. Como sabemos que 8 es potencia de 2, esto es, 8 = 2³ tenemos que por cada símbolo del sistema octal, se corresponden tres dígitos binarios, asi que sólo tenemos que codificar cada una de las cifras del número en octal con tres bits, y obtendremos en número en binario de forma directa. Tenemos que
© C E D E – www.cede.es
CEDE - C/ Cartagena, 129 - 28002 Madrid Tel.: 91 564 42 94
Profesores de Enseñanza Secundaria INFORMÁTICA
Tema 1.15
78 = 1112 58 = 1012 38 = 0112 18 = 0012 Por tanto 74318 = 1111010110012 una vez que tenemos el número en binario, si queremos pasarlo a hexadecimal, como 16 = 24, sólo tenemos que agrupar los valor dado en grupos de cuatro bits, empezando desde la derecha y rellenando con 0 si fuere necesario. 1111010110012 = xF59 hemos pasado de base octal a base hexadecimal sin realizar ningún cálculo matemático. 74318 = xF59 Conversiones entre otros sistemas de numeración
Cuando no tenemos ninguno de los casos anteriores, es decir, no están implicados en el proceso de conversión las bases binaria, octal, hexadecimal ó decimal, el cambio de base de número se lleva a cabo realizando un primer cambio de la base de origen a la base 10 (utilizando el teorema fundamental de la numeración), y posteriormente, otro cambio de base 10, a la base de destino mediante divisiones sucesivas. 1.1.3.
SISTEMAS DE CODIFICACIÓN NUMÉRICA
En este apartado, se mostrarán la forma de representación de los números naturales, enteros y reales y cómo operar con ellos. También se abordará otros sistemas de representación numéricos usados en la actualidad.
CEDE - C/ Cartagena, 129 - 28002 Madrid Tel.: 91 564 42 94
© C E D E – www.cede.es
Tema 1.16
Profesores de Enseñanza Secundaria INFORMÁTICA
1.1.3.1. Codificación de números naturales
La codificación de los números naturales en binario, se suele realizar en binario puro, es decir, basta representar el número en binario. El resultado, se suelen codificar en bloques de 8 bits (que se correponde con un byte), o en múltiple de éstos, ya que son los bloques en los que los sistemas informáticos suelen guardar la información. Son habituales los registros ó bloques de 8, 16, 32 y 64 bits. En el caso de el número obtenido sea menor que el tamaño del registro, se rellenan con 0s las cifras más significativas hasta completar el tamaño del registro. Con un número determinado “n” de bits, se pueden representar 2n números diferentes, así tenemos que los números representables están en el siguiente rango: 0 ≤ X ≤ (2n − 1) Con 8 bits, podemos representar 256 números diferentes, desde el 0 al 255. 0 ≤ X ≤ (27 − 1) es decir, 0 ≤ X ≤ 255 Con 16 bits, podemos representar 65536 números diferentes, desde el 0 al 65535. 0 ≤ X ≤ (216 − 1) es decir, 0 ≤ X ≤ 65535 Si quisieramos representar un número mayor de 65535, necesitaríamos aumentar el número de bits del registro, ya que de otra manera, tendríamos un “overflow”. Para determinar el número mínimo de bits “b” necesarios para representar un número X en formato binario puro, se utiliza la siguiente fórmula: b = log2 X Si queremos representar 50 números diferentes utilizando una codificación binaria, necesitamos un mínimo de
© C E D E – www.cede.es
CEDE - C/ Cartagena, 129 - 28002 Madrid Tel.: 91 564 42 94
Profesores de Enseñanza Secundaria INFORMÁTICA
Tema 1.17
b = log2 50 = 5,64 bits o sea, 6 bits 1.1.3.2. Codificación de números enteros
En la codificación de los números naturales, es suficiente con la representación del número en binario, pero en los números enteros, tenemos que discriminar entre valores positivos y valores negativos, por lo que se invierte uno de los bits disponibles en señalar el signo, positivo o negativo, del número codificado. 1.1.3.2.1. Signo y Magnitud Es la más “humana” de las representaciones de números con signo, puesto que, al conjunto de los bits que representa la magnitud del número se antepone (en la posición más significativa) un bit, denominado bit de signo, que toma el valor 0 para números positivos y el 1, para los negativos. Un registro de 8 bits que almacene un número codificado en signo y magnitud, tendrá el siguiente formato: S
Magnitud (7 bits)
En general, si se utilizan n bits para representar un número con notación signo y magnitud, el rango de valores representables son − (2(n−1) − 1) ≤ X ≤ (2(n−1) − 1)
Por tanto, un registro de 8 bits, tiene el siguiente rango de representación: (−27 + 1) ≤ X ≤ (27 − 1) o lo que es lo mismo −127 ≤ X ≤ 127 Como puede observarse, se pueden representar la misma cantidad de números positivos que negativos, es decir, tiene un rango de representación simétrico, sin embargo, uno de los inconvenientes que tiene es que el valor “0” tiene dos representaciones, que se corresponderían con el +0 el -0 respectivamente. Ejemplo: Representación del número 69, −52 y 129 en signo y magnitud utilizando 8 bits. Como se dispone de un total de 8 bits y uno de ellos, lo hemos de destinar al signo, debemos de pasar la magnitud de los números dados a binario puro utilizando sólo 7 bits. Tenemos que: 6910 = 10001012 Se puede representar con 7 bits o menos.
CEDE - C/ Cartagena, 129 - 28002 Madrid Tel.: 91 564 42 94
© C E D E – www.cede.es
Tema 1.18
Profesores de Enseñanza Secundaria INFORMÁTICA
5210 = 1101002 Se puede representar con 7 bits o menos. 12910 = 100000012 No se puede representar con 7 bits o menos. Como puede observarse, el número 69 y 52, pueden representarse con sólo 7 bits, pero el número 129, necesita un mínimo de 8 bits para poder representado en binario puro. Por esta razón el número 129, no puede ser representado en formato Signo y Magnitud con 8 bits. Como el número 69 es positivo, tenemos que el primer bit (el bit de signo) es 0, por lo tanto, la representación del 69 en formato signo y magnitud es: 6910 = 010001012 Como puede observarse, esta codificación coincide con la codificación en binario puro utilizando 8 bits. En el caso del número −52, es un número negativo, por lo tanto el bit de signo (el más significativo), es 1. Su representación en formato signo y magnitud es: 5210 = 101101002 El primer bit, es 1 porque es un número negativo. El resto de bits, representa la magnitud, o sea, 52 en binario. 1.1.3.2.2. Complemento a 1 En este sistema de representación, también existe un bit de signo que es el más significativo, siendo su valor 0 cuando en número es positivo y 1 cuando es negativo. La forma de obtener el complemento a 1 (C1) de un número decimal, es obtener su valor absoluto en binario puro con el número de bits total que se indique y posteriormente, si a) El número es positivo, no se realiza ningún cambio, el número ya está codificado en C1. b) Si el número es negativo, se invierten todos los bits, cambiando los 0s por 1s y a la inversa. Si se desea convertir el número 35 y −49 en C1 utilizando 8 bits, debemos realizar las siguientes operaciones: Convertir a binario puro el valor absoluto de ambos números utilizando 8 bits. 3510 = 001000112 4910 = 001100012
© C E D E – www.cede.es
CEDE - C/ Cartagena, 129 - 28002 Madrid Tel.: 91 564 42 94
Profesores de Enseñanza Secundaria INFORMÁTICA
Tema 1.19
Como el número 35, es positivo, no hay que realizar ninguna operación, ya lo tenemos convertido a C1. Sin embargo, el número −49 es negativo, por lo que tenemos que invertir los bits, cambiando los 0 por 1 y a la inversa. C1 (3510) = 001000112 C1 (−4910) = 110011102 Como puede observarse, la codificación en Signo y Magnitud y en C1 para los números positivos, es exactamente la misma. El rango de representación de un número es el siguiente: − (2(n−1) − 1) ≤ X ≤ (2(n−1) − 1)
Por tanto, un registro de 8 bits, tiene el siguiente rango de representación: (−27 + 1) ≤ X ≤ (27 − 1) es decir, −127 ≤ X ≤ 127 Como puede observarse, el rango de representación de números, es simétrico, y el 0, tambien tiene dos representaciones, el +0 y el −0, al igual que ocurría con la representación en signo y magnitud. Ahora ya podemos representar números negativos, por lo que podemos realizar las restas como sumas en las que un sumando sea negativo. Suma en complemento a 1 (C1)
En la aritmética a C1, dos número se suman exactamente igual que en binario puro, con la única salvedad de que si apareciera acarreo en la suma parcial de los bits más significativos, dicho acarreo, se suma al resultado. Como se ha indicado anteriormente, la resta se puede realizar como una suma de un número negativo. Ejemplo. Realizar la suma 23+12 en C1 utilizando 8 bits.
2310 = 000101112 Como es positivo C1(23) = 000101112 1210 = 000011002 Como es positivo C1(12) = 000011002 Por lo tanto, 0 0 0 1 0 1 1 1 + 0 0 0 0 1 1 0 0 0 0 1 0 0 0 1 1
La suma de 2310 = 000101112 y 1210 = 000011002 es 3510 = 001000112.
CEDE - C/ Cartagena, 129 - 28002 Madrid Tel.: 91 564 42 94
© C E D E – www.cede.es
Tema 1.20
Profesores de Enseñanza Secundaria INFORMÁTICA
Ejemplo. Realizar la resta 103-14 en C1 utilizando 8 bits.
10310 = 011001112 Como es positivo C1(103) = 011001112 1410 = 000011102 Como es negativo C1(−14) = 111100012 Por lo tanto,
+ 1 (Acarreo)
0 1 1 0 0 1 1 1 1 1 1 1 0 0 0 1 0 1 0 1 1 0 0 0
Como puede observarse, esta operación tiene acarreo, por lo tanto, al resultado, se le ha de sumar dicho acarreo. 0 0 1 0 0 0 1 1 + 1 0 0 1 0 0 1 0 0
La resta de 10310 = 011001112 y 1410 = 000011102 se ha convertido en una suma haciendo el C1 de −14. El resultado obtenido es 8910 = 010110012. 1.3.2.3. Complemento a 2 En este sistema de representación, al igual que en Signo y Magnitud y C1, también existe un bit de signo que indica si el número es positivo (0) o negativo (1). La forma de obtener el complemento a 2 (C2) de un número decimal, es obtener su valor absoluto en binario puro con el número de bits total que se indique y posteriormente, si a) El número es positivo, no se realiza ningún cambio, el número ya está codificado en C2. b) Si el número es negativo, se realizan dos pasos: b1) Invierten todos los bits, cambiando los 0s por 1s y a la inversa. b2) Al resultado, se le suma 1. Si se desea convertir el número −72 en C2 utilizando 8 bits, debemos realizar las siguientes operaciones: Convertir a binario puro el valor absoluto del número utilizando 8 bits. 7210 = 010010002 como es negativo, invertimos los bits, o lo que es lo mismo, calculamos el complemento a 1 (C1) de −72. C1 (−7210) = 101101112
© C E D E – www.cede.es
CEDE - C/ Cartagena, 129 - 28002 Madrid Tel.: 91 564 42 94
Profesores de Enseñanza Secundaria INFORMÁTICA
Tema 1.21
y a continuación, le sumamos 1 unidad para convertirlo a C2. 1 0 1 1 0 1 1 1 + 1 1 0 1 1 1 0 0 0
Por lo tanto C2 (−7210) = 101110002 El rango de representación de un número en C2, es el siguiente: − (2(n−1) − 1) ≤ X ≤ (2(n−1) − 1)
Ahora, el rango de números que se pueden representar, ya no es simétrico, y el 0, tiene una única representación. Por tanto, un registro de 8 bits, tiene el siguiente rango de representación: (−27) ≤ X ≤ (27 − 1) es decir, −128 ≤ X ≤ 127 Este complemento es ampliamente utilizado en los sistemas actuales. Sumas y Restas en complemento a 2 (C2)
En la aritmética a C2, dos número se suman exactamente igual que en C1, con la única salvedad de que si apareciera acarreo en la suma parcial de los bits más significativos, dicho acarreo, se desprecia. Como se ha indicado anteriormente, la resta se puede realizar como una suma de un número negativo. Ejemplo. Realizar la resta 111-9 en C1 utilizando 8 bits.
11110 = 011011112 Como es positivo C2 (111) = 011011112 910 = 0000100102 Como es negativo C2 (−9) = C1 +1 = 111101112 Por lo tanto,
+ 1 (Acarreo)
0 1 1 0 1 1 1 1 1 1 1 1 0 1 1 1 0 1 1 0 0 1 1 0
Como puede observarse, esta operación tiene acarreo, pero como estamos operando en complemento a 2, dicho acarreo se desprecia.
CEDE - C/ Cartagena, 129 - 28002 Madrid Tel.: 91 564 42 94
© C E D E – www.cede.es
Tema 1.22
Profesores de Enseñanza Secundaria INFORMÁTICA
La resta de 11110 = 011011112 y 910 = 000010012 se ha convertido en una suma haciendo el C2 de 9. El resultado obtenido es 10210 = 011001102. 1.1.3.2.4. Codificación en Exceso a 2n−1 Este método, no utiliza un bit de signo como tal, es decir todos los bits representan el módulo o valor. La forma de obtenerlo, es sumando al número codificado en binario puro, una cantidad fija determinada por el valor 2n−1, siendo n el número total de bits asignados. Por ejemplo, para representar con 8 bits el número 27 en exceso a 2n−1, se han de realizar las siguientes operaciones. En primer lugar, calculo el exceso, es decir 28−1 = 27 = 128. A continuación sumo al número el exceso, es decir 27 + 128 =155 y codifico el valor obtenido en binario puro: 15510 = 100110112 Por lo tanto, el valor en Exceso a 2n−1 de 27 es 100110112. El rango de representación de un número Exceso a 2n−1, es el siguiente: − (2(n−1) ≤ X ≤ (2(n−1) − 1)
Ahora, el rango de números que se pueden representar, ya no es simétrico, y el 0, tiene una única representación. Por tanto, un registro de 8 bits, tiene el siguiente rango de representación: (−27) ≤ X ≤ (27 − 1) es decir, −128 ≤ X ≤ 127 Este forma de codificación se utiliza entre otros casos, para codificar los números reales, como se verá posteriormente. 1.1.3.3. Codificación de números reales
1.1.3.3.1. Codificación en coma fija Hasta ahora, vemos visto cómo representar los números naturales y enteros, pero también debemos de ser capaces de representar números reales y poder operar con ellos. Como sabemos, los números reales pueden tener un número de decimales infinitos, y se deben almacenar dichos números
© C E D E – www.cede.es
CEDE - C/ Cartagena, 129 - 28002 Madrid Tel.: 91 564 42 94
Profesores de Enseñanza Secundaria INFORMÁTICA
Tema 1.23
en registros que tienen un número de bits finito. Teniendo en cuenta que los números binarios necesitan muchos dígitos para representar cantidades relativamente pequeñas, el problema no es trivial. La forma más fácil de representación de números reales, es la representación en coma fija que, básicamente, consiste en codificar en binario puro tanto la parte entera como la parte decimal. Para almacenar números reales en un registro, una porción del registro se debe destinar para representar la parte entera, y el resto, para la parte fraccionaria. Si dedicamos, por ejemplo, tres bits para la parte fraccionaria, sólo unos pocos números reales pueden ser almacenados con exactitud, lo que genera errores de precisión ya sean porque se han de truncar los números o porque es necesario un redondeo. • El truncado de un número elimina, de este, aquellos bits de la parte fraccionaria que no se pueden almacenar en el registro. • El redondeo de un número A, tiende a almacenar dicho número como si fuera otro número B, lo más cercano posible a A, que si sea representable con exactitud en el registro. Ejemplo: Convirtamos el número 24,78125 coma fija. En primer lugar, convirtamos la parte entera a binario puro
24 : 2 = 12 12 : 2 = 6 6:2=3 3:2=1 1:2=0
Resto: 0 Resto: 0 Resto: 0 Resto: 1 Resto: 1
Por tanto, 2410 = 110002. Ahora se convierte la parte decimal, es decir 0,78125 0,78125 * 2 = 1,5625 0,5625 * 2 = 1,125 0,125 * 2 = 0,25 0,25 * 2 = 0,5 0,5 * 2 = 1
Parte entera: 1 (se desprecia la parte entera para la siguiente operación) Parte entera: 1 Parte entera: 0 Parte entera: 0 Parte entera: 1
Por tanto, 0,7812510 = 0,110012. Por tanto uniendo la parte entera y la decimal, tenemos que, en coma fija: 24,7812510 = 11000,110012 Este tipo de codificación, es sencilla, pero, incluso con registros de 64 o 128 bits, nos permite representar un rango de número relativamente bajo. Por otro lado, el hecho de que la coma pueda estar
CEDE - C/ Cartagena, 129 - 28002 Madrid Tel.: 91 564 42 94
© C E D E – www.cede.es
Tema 1.24
Profesores de Enseñanza Secundaria INFORMÁTICA
en cualquier lugar, nos obliga a indicar, de alguna manera, la posición de la coma, o dejar una porción fija del registro a la parte real y otra a la parte decimal, algo que no soluciona el problema, pues nos provoca truncamientos de los números ó nos obligaría a redondear la cantidad que deseamos expresar. Está claro que esta forma de representación no cumple las necesidades de representar número extraordinariamente grandes ó pequeños, es por ello por lo que se desarrolla la representación en coma flotante que se apoya en la representación en notación científica de los números. 1.1.3.3.2. Representación en coma flotante La notación en coma fija, es apropiada para números con un orden de magnitud acotado, pero cuando se pretende aumentar el rango de números representables, hemos de acudir a la denominada notación en coma flotante. Esta representación busca el almacenamiento del número real en forma de exponencial. Estos números se representan mediante la mantisa y el exponente. Cualquier número real en base b puede ser expresado en la forma siguiente: X = m * be donde
m es la mantisa. b es la raíz o base. e es el exponente.
Por ejemplo, el número 54,287, se puede representar como 5,4287 * 101, como 0,54287 * 102 o bien, entre otros, como 5428,7 * 10−2. Como puede verse, un mismo número, puede tener distintas representaciones debido a que el punto decimal que separa la parte entera de la parte fraccionaria, se puede colocar en distinto lugar si el exponente se ajusta convenientemente. Debido a que la representación no es única, se debe definir lo que se denomina una mantisa normalizada, es decir, hay que determinar siempre en qué lugar se ajusta el punto decimal separador de la parte entera y la parte fraccionaria. Se podría definir, por ejemplo, una normalización por mantisa entera ó normalización por mantisa fraccionaria. Actualmente, está ampliamente extendido el estándar definido por el IEEE, que es el IEEE754, por lo que será el que desarrollemos en esta sección. Estándar IEEE 754
Este estándar se utilizó ampliamente por los fabricantes de hardware, implementado en gran cantidad de aplicaciones y adoptado por el IEEE en 1985, siendo revisado en el año 2008. El coprocesador aritmético Intel 8087, lanzado en el año 1980, fue el primer componente que implementó esta forma de representación de números reales.
© C E D E – www.cede.es
CEDE - C/ Cartagena, 129 - 28002 Madrid Tel.: 91 564 42 94
Profesores de Enseñanza Secundaria INFORMÁTICA
Tema 1.25
En este estándar, se utiliza el bit más significativo para indicar el signo, de tal manera que si el bit de signo es 0, el número es positivo y en caso contrario, negativo. El resto de bits se distribuye entre la mantisa, que está representada en binario puro, y el exponente, que se representa mediante notación por exceso. El número a representar se ha de normalizar al formato 1,xxxxx2, es decir, estarían normalizados los números 1,00100102, 1,01112 o 1,112 * 2−3, pero no 11,01012 o 0,1010002. Veamos como normalizar los dos valores anteriores que no están normalizados. 11,01012 = 1,10101 * 22 0,1010002 = 1,010002 * 2−1 de esta manera, se da por hecho que la parte entera del número normalizado es siempre 1, esta manera no es necesario guardarlo, de modo que se guardan sólo los bits de la forma fraccionaria. De esta forma, al ahorrarnos el guardar la parte entera, que es siempre 1, según se especifica en la norma, se consigue aumentar el rango de número representables ya que disponemos de un bit más para aumentar la precisión de la mantisa. A este bit se le denomina bit oculto, y a pesar de que no se guarde, siempre se ha de tener en cuenta. La norma indica que una vez normalizado el número, se represente la mantisa (obviando 1 de la parte entera) en binario puro, y el exponente, se represente en por exceso a N, donde N depende del número de bits totales que tengamos para representar el número, siguiendo la siguiente fórmula: N = 2(q−1) − 1, donde q son el número de bits que se utilizan para representar el exponente. El estándar define un formato sencillo, en el que los números se representan con un total de 32 bits, 1 de ellos para el signo, los 23 bits siguientes para la mantisa y los 8 bits restantes para el exponente. En este caso, al haber un total 32 bits, el exponente se representa como N = 2(8−1) − 1 es decir, N = 2(7) − 1 = 127. Formato sencillo: S
Mantisa (23 bits)
Exp (8 bits)
En el formato largo, se destinan 64 bits en total para representar el número real, de los cuales, 1 de ellos es para indicar el signo, 52 de ellos representa la mantisa y los 11 bits restantes, se utilizan para el exponente. Por tanto, al asignar 11 bits al exponente, estará representado en exceso a 1023, ya que N = 2(11−1) − 1 = 1023. Formato largo (64 bits): S
CEDE - C/ Cartagena, 129 - 28002 Madrid Tel.: 91 564 42 94
Mantisa (52 bits)
Exp (11 bits)
© C E D E – www.cede.es
Tema 1.26
Profesores de Enseñanza Secundaria INFORMÁTICA
Ejemplo: Representemos el número 17,3125 en formato IEEE 754.
En primer lugar convertimos la parte entera: 17 : 2 = 8 8:2=4 4:2=2 2:2=1 1:2=0
Resto: 1 Resto: 0 Resto: 0 Resto: 0 Resto: 1
Por tanto, 1710 = 100012. Ahora se convierte la parte decimal, es decir 0,3125 0,3125 * 2 = 0,625 0,625 * 2 = 1,25 0,25 * 2 = 0,5 0,5 * 2 = 1
Parte entera: 0 Parte entera: 1 (se desprecia la parte entera para la siguiente operación) Parte entera: 0 Parte entera: 1
Cogiendo las partes enteras que hemos obtenido en el proceso anterior en el mismo orden en el que los hemos obtenido, tenemos que 0,312510 = 0,01012. Por tanto uniendo la parte entera y la decimal, tenemos que 17,312510 = 10001,01012 Vamos a normalizar el número 10001,0102, de tal manera que nos quede como parte entera un único 1, por tanto, hemos de correr la coma 4 posiciones, es decir, 10001,01012 = 1,000101012 * 24 ya tenemos la información necesaria para poder codificar el signo (positivo = 0), la mantisa (00010101) y el exponente, que tiene un valor de 4 y ha de representarse en exceso a 127 (según se comentó anteriormente). Calculamos el exceso a 127 de 4 (exponente): 127 + 4 = 131 = 100000112 Por tanto: Signo (1 bit) = 0
© C E D E – www.cede.es
CEDE - C/ Cartagena, 129 - 28002 Madrid Tel.: 91 564 42 94
Profesores de Enseñanza Secundaria INFORMÁTICA
Tema 1.27
Mantisa (23 bits) = 000101012 = 000000000000000000101012 Exponente (8 bits) = 100000112 Por tanto 17,312510 = 1 − 00000000000000000010101 − 10000011 se han incluido guiones para separar el bit de signo, la mantisa y el exponente. Ejemplo 2: Representemos el número −54,4375 en formato IEEE 754 en formato largo.
En primer lugar convertimos la parte entera: 54 : 2 = 27 27 : 2 = 13 13 : 2 = 6 6:2=3 3:2=1 1:2=0
Resto: 0 Resto: 1 Resto: 1 Resto: 0 Resto: 1 Resto: 1
Por tanto, 5410 = 1101102. Ahora se convierte la parte decimal, es decir 0,4375 0,4375 * 2 = 0,875 0,875 * 2 = 1,75 0,75 * 2 = 1,5 0,5 * 2 = 1
Parte entera: 0 Parte entera: 1 (se desprecia la parte entera para la siguiente operación) Parte entera: 1 Parte entera: 1
Cogiendo las partes enteras que hemos obtenido en el proceso anterior en el mismo orden en el que los hemos obtenido, tenemos que 0,437510 = 0,01112. Por tanto uniendo la parte entera y la decimal, tenemos que 54,437510 = 110110,01112 Vamos a normalizar el número 110110,01112,de tal manera que nos quede como parte entera un único 1, por tanto, hemos de correr la coma 5 posiciones, es decir, 110110,01112 = 1,1011001112 * 25 ya tenemos la información necesaria para poder codificar el signo (positivo = 0), la mantisa (101100111) y el exponente, que tiene un valor de 5 y ha de representarse en exceso a 127 (según se comentó anteriormente).
CEDE - C/ Cartagena, 129 - 28002 Madrid Tel.: 91 564 42 94
© C E D E – www.cede.es
Tema 1.28
Profesores de Enseñanza Secundaria INFORMÁTICA
Calculamos el exceso a 1023 de 5 (exponente): 1023 + 5 = 1028 = 100000001002 Por tanto: Signo (1 bit) = 1 (por ser negativo) Mantisa (52 bits): 000101012 = 0000000000000000000000000000000000000000000000101012 Exponente (11 bits) = 100000001002 Por tanto: −54,437510 = 1 − 000000000000000000000000000000000000000000000010101 − 10000000100
En este estándar se definen una serie de valores especiales que son los que se indican a continuación: − Un número normalizado se ha de representar con un código de exponente mayor que 0 y menor que 255, es decir, 0 < exponente < 255, ya que los valores de 0 y 255, tienen un significado especial. − Si el exponente = 0, y la mantisa es distinto de 0,representa un número desnormalizado, es decir un número tan pequeño que no puede ser representado de modo normalizado. − Si es exponente es 255 y la mantisa es 0, se utiliza para representar el infinito, positivo o negativo en función del bit de signo. − Si es exponente es 255 y la mantisa es distinta de 0, se utiliza para representar los caracteres NaN (Not a Number), que son códigos especiales y no representa un número, si no que se utilizan para proporcionar información sobre lo ocurrido en una operación en concreto, por ejemplo, se utilizaría para indicar que ha habido una división por 0. − Si es exponente es 255 y la mantisa es 0, representa el número infinito. − El número 0, se representa con un valor de 0 tanto en el exponente y la mantisa. El valor de signo puede ser 0 o 1, por lo tanto tiene dos representaciones: +0 y −0. Operaciones en coma flotante
La aritmética en coma flotante se han de considerar tanto la mantisa como el exponente, pudiendo ocurrir que el resultado de la operación, no esté normalizado, por lo que sería necesario su normalización para volver a representarlo en formato IEEE754. En la aritmética de coma flotante, hay dos fuentes de errores posibles. Por un lado, debido a que la representación de algunos números no es
© C E D E – www.cede.es
CEDE - C/ Cartagena, 129 - 28002 Madrid Tel.: 91 564 42 94
Profesores de Enseñanza Secundaria INFORMÁTICA
Tema 1.29
exacta, y por otro, por la pérdida de dígitos significativos al realizar la operación. Todo ello se debe a que el número de bits para representar los números reales, que es infinito, es limitado y por ello, se comete un error de precisión. Sumas y restas
Para realizar sumas o restas, es necesario que los exponentes de ambos números sean iguales. Para conseguirlo, es necesario desplazar la mantisa del número que tenga mayor exponente, tantas veces como sea necesario para conseguir un mismo exponente en ambos números. Veámoslo en con un número en decimal: Si queremos sumar los números 2*103 y 5*102, hemos de conseguir tener el mismo exponente (el menor de ellos ) en ambos números, por tanto, tenemos que vamos a desplazar la mantisa con mayor exponente, hasta conseguir el mismo exponente que tiene el otro número implicado en la operación, en este caso, tenemos que 2*103 = 20*102. Así, ya hemos conseguido que los dos valores tengan el mismo exponente, y por tanto, podemos sumar el valor de la mantisa: 20*102 + 5*102 = 25*102 como se ha indicado anteriormente, puede ser necesario realizar una normalización del resultado obtenido. Multiplicación y división
Para realizar una multiplicación, hay que multiplicar las mantisas y sumar los exponentes, y luego normalizar el resultado. En el caso de la división, hay que dividir las mantisas y restar los exponentes. Después, al igual que ocurre con la multiplicación, hay que normalizar el resultado. 1.1.3.4. Otros códigos binarios para representar dígitos decimales
Existen otros códigos sirven para representar los símbolos numéricos, asociando a cada número, un código. Dentro de este grupo de códigos, nos encontramos con el código BCD, el código Gray ó el código de siete segmentos. Veamos que valores tienen asociado los dígitos numéricos en cada uno de estos códigos. Estos códigos, debido a sus limitaciones se utilizan sólo en aplicaciones muy específicas. 1.1.3.4.1. Código BCD El Código BCD (Binary Code for Decimal digits), es código de 4 bits con la siguiente correspondencia:
CEDE - C/ Cartagena, 129 - 28002 Madrid Tel.: 91 564 42 94
© C E D E – www.cede.es
Tema 1.30
Profesores de Enseñanza Secundaria INFORMÁTICA Numero Decimal
Código BCD
0
0000
1
0001
2
0010
3
0011
4
0100
5
0101
6
0110
7
0111
8
1000
9
1001
Con este código, tendríamos la siguientes equivalencias: 25410 = 001001010100BCD Como puede observarse, es una traducción cifra a cifra del valor en base 10. 1.1.3.4.2. Código de siete segmentos El Código de siete segmentos, es un código de 7 bits, utilizado para la representación de los números en los displays o pantallas de siete segmentos. Indica mediante el valor codificado, qué segmentos del display debe encenderse para representar la cifra digital. Es por un sistema no posicional, ya que los dígitos no tienen menor o mayor valor en función de su posición.
Por ejemplo, el valor 0, se representa encendiendo los segmentos “a”, “b”, “c”, “d”, “e” y “f”, por lo tanto, tienen valor 1 y el segmento “g” debe permanecer apagado, por tanto, a valor 0. Según esto, el valor 0, en siete segmentos se corresponde con 1111110. De la misma manera, el valor 1, se corresponde con 0110000, ya que sólo se encienden los segmentos “b” y “c”. 1.1.3.4.3. Código de Gray Es un código que tiene la propiedad de que sólo existe un bit diferente entre dos elementos consecutivos del código. El código Gray fue diseñado originalmente para prevenir señales espurias de
© C E D E – www.cede.es
CEDE - C/ Cartagena, 129 - 28002 Madrid Tel.: 91 564 42 94
Profesores de Enseñanza Secundaria INFORMÁTICA
Tema 1.31
los switches electromecánicos. Actualmente es usado para facilitar la corrección de errores en los sistemas de comunicaciones. El código Gray para tres bits, se corresponde con los siguientes valores: Decimal
Gray
Binario
0
000
000
1
001
001
2
011
010
3
010
011
4
110
100
5
111
101
6
101
110
7
100
111
Como puede observarse, tampoco es un sistema posicional. Los códigos BCD, de siete segementos y de Gray, son sólo algunos ejemplos de codificación numérica existentes. 1.1.4.
CODIFICACIÓN DE CARACTERES
Hasta ahora, sólo hemos representado números, con mayor o menor complejidad, pero hemos recordar que no son sólo números lo que se debe almacenar en un sistema informático. Existen las letras, signos de puntuación y signos especiales como los que pueden representar una moneda. Por lo tanto, necesitamos códigos más amplios que incluyan estos símbolos. En este caso, se asignan un código diferente a cada uno símbolos que queremos representar. El conjunto de caracteres que un sistema acepta, se denomina juego de caracteres y los más importantes son los que se explican a continuación.
1.1.4.1. Código ASCII
ASCII significa Código Estándar Americano para el Intercambio de Información (American Standard Code for Information Interchange). Este código utiliza 7 u 8 bits para codificar los diferentes símbolos, y se denominan código ASCII o código ASCII extendido (8 bits). Con 7 bits, se pueden representar 128 caracteres diferentes, utilizando el octavo bit como bit de paridad para detectar problemas en la transmisión de la información. Podemos dividir la tabla ASCII en grupos de símbolos:
CEDE - C/ Cartagena, 129 - 28002 Madrid Tel.: 91 564 42 94
© C E D E – www.cede.es
Tema 1.32
Profesores de Enseñanza Secundaria INFORMÁTICA
− Códigos transparentes: que no se corresponden con ningún carácter alfanumérico y sirven para transmitir caracteres de control (o instrucciones), como por ejemplo: salto de línea o retorno de carro. − Números y símbolos: ocupan las posiciones desde el 32 a la 64 de la tabla ASCII. − Letras: Ocupa las posiciones de la tabla ASCII comprendidas entre la 65 y la 127. Están las letras del abecedario inglés en mayúsculas, minúsculas y símbolos de puntuación.
El problema del código ASCII es que no es capaz de representar las letras acentuadas, ni otros caracteres, fundamentales para otros idiomas como el signo de apertura de interrogación ó la ñ. A continuación, se muestra la tabla ASCII:
1.1.4.2. ASCII extendido
Debido a las limitaciones del ASCII se definieron varios códigos de caracteres de 8 bits, entre ellos el ASCII extendido. Sin embargo, el añadir un bit más a la codificación de símbolos, supone poder representar tan sólo 256 símbolos diferentes, algo que es claramente insuficiente para poder codificar mensajes en lenguas como el griego, el chino o el árabe.
© C E D E – www.cede.es
CEDE - C/ Cartagena, 129 - 28002 Madrid Tel.: 91 564 42 94
Profesores de Enseñanza Secundaria INFORMÁTICA
Tema 1.33
1.1.4.3. Unicode (ISO 10646)
Como solución a estos problemas, desde 1991 se ha acordado internacionalmente utilizar la norma Unicode, que es una gran tabla, que en la actualidad asigna un código a cada uno de los más de cincuenta mil símbolos, los cuales abarcan todos los alfabetos europeos, ideogramas chinos, japoneses, coreanos, muchas otras formas de escritura, y más de un millar de símbolos especiales. 1.1.4.4. ISO 8859-1
La ISO 8859 es un conjunto de normas, para la codificación de caracteres con tan sólo 8 bits. Como con 8 bits no se pueden incluir todos los caracteres de todos los idiomas, por lo que esta norma se divide en versiones. La versión 1, es decir, la norma ISO 8859-1, incluye los caracteres específicos de las lenguas de Europa occidental, mientras que, por ejemplo, la versión ISO8859-7, incluye los caracteres griegos. El rango inicial de caracteres de este conjunto de normas, es el código ASCII (128 caracteres), y son los siguientes 128 caracteres los que difieren de una versión a otra. Los caracteres de ISO-8859-1 son además los primeros 256 caracteres del estándar ISO 10646 (Unicode). La norma ISO 8859-15 consistió en una revisión de la ISO 8859-1, incorporando el símbolo del Euro y algunos caracteres necesarios para dar soporte completo al francés, finés y estonio. 1.1.5. CODIFICACIÓN DE FORMATOS MULTIMEDIA
Hoy en día, los sistemas informáticos están muy extendidos, en parte, por la capacidad de manejar información multimedia: imágenes, sonidos, vídeos, etc. Las imágenes, sonido y vídeo, son señales analógicas, o sea, están compuestas por magnitudes continuas y que por tanto, están situadas en un rango infinito de valores posibles. Por ejemplo, entre el color azul y el color amarillo, hay un número infinito de tonalidades ó colores intermedios, sin embargo, algunos formatos de imágenes, solo admiten 256 colores diferentes.
1.1.5.1. Conversión analógica-digital
Para poder almacenar y transmitir la información contenida en las imágenes, el sonido ó el vídeo, se codifican en un formato digital, o dicho de otra manera, hay que transformarla en números, con-
CEDE - C/ Cartagena, 129 - 28002 Madrid Tel.: 91 564 42 94
© C E D E – www.cede.es
Tema 1.34
Profesores de Enseñanza Secundaria INFORMÁTICA
cretamente en 0s y 1s, que son lo que entienden los sistemas digitales. El proceso básico que se sigue para convertir una señal analógica en digital, es el que se muestra a continuación:
En un primer paso, se filtra la señal, para quedarnos únicamente con las frecuencias que nos interesan. Posteriormente se toman muestras cada cierto tiempo de los valores de la señal analógica, a este proceso, se denomina muestreo. Debemos tomar suficientes muestras para poder reconstruir posteriormente la señal. Según el teorema de Nyquist, se puede reconstruir una señal analógica, a partir de sus muestras, si se toman con una tasa de muestreo apropiada. Por ejemplo, la tasa de muestreo de una señal de Audio-CD, es de aproximadamente 44 kHz, lo que significa que en un segundo, se toman 44.000 muestras de la señal de audio, en una señal de voz telefónica, se toman muchas menos muestras, unas 8000. Esa es una de las razones por lo que la calidad del sonido transmitido a través de la línea telefónica es inferior que la que podemos escuchar de un CD de música.
Muestreo de una señal
Una vez que tenemos muestras de la señal analógica que queremos codificar, las muestras de voz, por ejemplo, hemos de cuantificarlas. Esto significa que cada una de las muestras, que tienen un valor dentro de un rango infinito de valores, va a pasar a tener un valore dentro de un conjunto de valores posibles limitados ó discretos. Por ejemplo, a cada muestra de señal telefónica, se le asocia un valor entre 256 valores posibles, ya que se codifica cada muestra con 8 bits (28 = 256). A una muestra de señal de video, se le da un valor entre 65536 valores posibles, pues cada muestra se codifica con 16 bits (216 = 65536).
© C E D E – www.cede.es
CEDE - C/ Cartagena, 129 - 28002 Madrid Tel.: 91 564 42 94
Profesores de Enseñanza Secundaria INFORMÁTICA
Tema 1.35
Cuantificación de una señal
El resultado es una señal digital con un determinado “bit rate” o tasa de transferencia, en una señal telefónica, como se toman 8000 muestras por segundo y cada una de ellas se codifica con 8 bits, se obtienen 64000 bits/segundo (64 kbps), para el audioCD, tenemos un bit rate de 1411kbps (22 veces superior al audio transmitido por la linea telefónica). Con los dos procesos descritos anteriormente, hemos convertido una señal analógica, que se componen de infinitos valores, a una señal digital binaria, que se compone tan sólo de 0 y 1. Para volver a reconstruir la señal analógica original, se sigue el proceso inverso: se obtienen el valor de las muestras a partir de su codificación y éstas se interpolan para obtener la señal analógica original (o al menos, una señal muy parecida a la original). En realidad, siempre hay una distorsión de la señal, conocida como “ruido de cuantificación” debido al redondeo que se hace en el proceso de cuantificación. Si se dan intervalos de cuantificación suficientes, se puede minimizar este ruido de cuantificación en gran medida. El código especifico que se utiliza en la codificación/decodificación de la señal, se denomina codec. Existen varios codec de audio, vídeo y formatos de imágenes disponibles y se clasifican atendiendo a distintos parámetros. Dichos paráemtros pueden estar referidos a si la señal obtenida tiene pérdida de información, o no, y si ofrecen compresión de los datos. Códec con/sin perdidas
Si obviamos las pérdidas producidas por el error de cuantificación, que en la mayoría de los casos son inapreciables, los sistemas de codificación, pueden aprovechar las limitaciones de los sentidos humanos, para reducir la cantidad de información. No debemos olvidar que, por ejemplo, para el oído humano, hay frecuencias de sonido que no es capaz de percibir, y es interesante eliminarlas para ahorrar la cantidad de información resultante de la codificación. Compresión
Al margen de que se hayan codificado o no con pérdidas, se puede aplicar a los datos un algoritmo de compresión con el objetivo de reducir la cantidad de información resultante. A continuación se muestran los formatos de codificación más importantes y sus características:
CEDE - C/ Cartagena, 129 - 28002 Madrid Tel.: 91 564 42 94
© C E D E – www.cede.es
Tema 1.36
Profesores de Enseñanza Secundaria INFORMÁTICA
1.1.5.2. Codificación de imágenes
En la actualidad, existen muchos formatos de imágenes diferentes, aquí se van a dar algunos detalles de los más conocidos. 1.1.5.2.1. Formato JPEG Es uno de los formatos más difundidos en la web. En este formato tiene pérdidas y compresión. La información que se desecha (pérdidas) de la imagen original, es imperceptible por el ojo humano. Soporta más de 16 millones de colores diferentes y es apropiado para fotografías y gráficos complejos, aunque no para imágenes vectoriales o imágenes pequeñas, ya que se necesita suficiente cantidad de información para que el proceso de compresión sea eficaz. 1.1.5.2.2. Formato GIF A diferencia del formato JPEG, es un formato sin pérdidas, aunque si tiene compresión. Uno de los inconvenientes principales es que soporta solo 256 colores diferentes. Este formato puede obtener mejores resultados que el JPEG para imágenes con pocos colores, imágenes vectoriales, en blanco y negro, pero no son aptos para imágenes de calidad. Este formato admite también transparencias y animaciones. Se necesita licencia para poder utilizar este algoritmo de codificación/decodificación. 1.1.5.2.3. Formato PNG El algoritmo de este formato, es libre, por lo que se puede utilizar sin tener que pagar por utilizarlo. Mejora en muchos casos los resultados obtenidos por el algoritmo del formato GIF. No tiene pérdidas tampoco, pero el algoritmo de compresión está más optimizado que el del GIF. Como inconveniente, no soporta animaciones, pero sí transparencias. 1.1.5.2.4. Formato BMP Es un formato típico de entornos Windows. Este formato guarda las imágenes en un mapa de bits. Es apto para imágenes de alta calidad, pero el tamaño de los archivos resultantes, aunque se le puede aplicar un algoritmo de compresión, es muy grande, por lo que, poco a poco, se va utilizando menos. 1.1.5.3. Codificación del audio
El sonido se digitaliza siguiendo el esquema de filtrado, muestreo, cuantificación y codificación. En cuanto a los codecs de audio, aquí mostraremos las características más importantes de los que más se utilizan: formato AAC, FLAC, MP3, Ogg y WMA.
© C E D E – www.cede.es
CEDE - C/ Cartagena, 129 - 28002 Madrid Tel.: 91 564 42 94
Profesores de Enseñanza Secundaria INFORMÁTICA
Compresión
Frecuencia de muestreo
Tasa de bits
Tema 1.37
Muticanal
AAC
Si, con pérdidas.
8 kHz a 192 kHz
8-529 Kbps (estéreo)
Hasta 28 canales
FLAC
Sin pérdidas
1 Khz a 1 Mhz
Variable
Hasta 8 canales
MPEG3
Con pérdidas
8, 11.025, 12, 16, 22.05, 24, 32, 44.1, 48kHz
No 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320 Kbps
Ogg
Con pérdidas
1 Hz a 200 kHz
Variable
WMA
Con pérdidas, sin pérdidas
8, 11.025, 12, 16, 22.05, 32, 44.1, 48, 96 kHz
4-768 kbps/variable hasta 8 canales (WMA Professional) (sin pérdidas) / hasta 6 canales (WMA sin pérdidas)
Hasta 255 canales
1.1.5.4. Codificación de vídeo
En cuanto al vídeo, también existen muchos formatos de codificación, el MPEG, es un grupo amplio de estándares de codificación de audio y video. El más utilizado es el MPEG-4, y se basa en las características del MPG1 y MPEG2, y de otros estándares, como el formato MP3, para el audio. El formato DIVX, se basa en el formato MPEG4 . El Xdiv, es un formato libre bajo licencia GNU/GPL, como alternativa al DIVX. 1.1.6.
UNIDADES Y MAGNITUDES INFORMÁTICAS
Se verá en este apartado las medidas más utilizadas de información y frecuencia.
1.1.6.1. Medidas de Información
Bit, es el acrónimo de Binary Digit, y es la mínima unidad de información. Con un bit, se puede discriminar sólo entre dos estados, que se suelen representar como 0 y 1, o falso y verdadero. La lógica y aritmética que utilizan bits, se denomina binaria. El álgebra de Boole, utiliza únicamente bits y es ampliamente utilizada en informática. El bit es una unidad de información muy pequeña, por ello, se utilizan múltiplos de esta unidad: − Nibble o cuarteto: − Byte u octeto: − Kilobyte (KB): − Megabyte (MB): − Gigabyte (GB): − Terabyte (TB): − Petabyte (PB): − Exabyte (EB):
4 bits 8 bits 1024 Bytes (en Sistema Internacional: 10³ bits = 1000 bits) 1024 Kbytes (en Sistema Internacional: 10³ Kbytes = 1000 Kbytes) 1024 Bytes (en Sistema Internacional: 10³ Mbytes = 1000 Mbytes) 1024 Gbytes (en Sistema Internacional: 10³ Gbytes = 1000 Gbytes) 1024 TB (en Sistema Internacional: 10³ = 1000 bits) 1024 PB (en Sistema Internacional: 10³ bits = 1000 bits)
CEDE - C/ Cartagena, 129 - 28002 Madrid Tel.: 91 564 42 94
© C E D E – www.cede.es
Tema 1.38
Profesores de Enseñanza Secundaria INFORMÁTICA
− Zettabyte (ZB): − Yottabyte (YB):
1024 EB (en Sistema Internacional: 10³ bits = 1000 bits) 1024 ZB (en Sistema Internacional: 10³ bits = 1000 bits)
Como puede apreciarse, hay una discrepancia entre lo que propone el Sistema Internacional y el sistema binario, ya que el sistema internacional considera un Kbyte como 10³ bytes, mientras que el sistema binario, lo considera como 210 = 1024, lo que puede dar lugar a confusiones. Por ello, están también los denominados prefijos binarios, que en lugar de indicar KB, lo indica como kibibyte (KiB) = 1024 bytes. Asi, se utilizan los siguientes valores: Mebibyte (MiB) Gibibyte (GiB) Tebibyte (TiB) Pebibyte (PiB) Exbibyte (EiB) Zebibyte (ZiB) Yobibyte (YiB)
220 bytes 230 bytes 240 bytes 250 bytes 260 bytes 270 bytes 280 bytes
1.1.6.2. Medidas de frecuencia
Frecuencia es una magnitud que mide el número de repeticiones por unidad de tiempo de cualquier fenómeno o suceso periódico. En los sistemas informáticos, se utiliza una señal periódica cuadrada con determinada frecuencia, como señal de reloj. Esta señal sirve para coordinar todos los componentes. Una señal periódica de 1 Hz, se repite una vez por segundo.
Los sistemas informáticos, trabajan a velocidades muy altas, por que la señal cuadrada de reloj, se repite muchas veces por segundo. Son normales las señales de reloj a varios Ghz, lo que se significa que cada segundo, ofrecen miles de millones de impulsos cuadrados. La siguiente tabla muestra la relación entre los Hz, y sus múltiplos más comunes:
© C E D E – www.cede.es
CEDE - C/ Cartagena, 129 - 28002 Madrid Tel.: 91 564 42 94
Profesores de Enseñanza Secundaria INFORMÁTICA
1.2.
1 Hz
Un impulso cuadrado por segundo
1 Khz
1000 Hz (mil impulsos por segundo)
1 Mhz
1000 Khz = 1000000 Hz
1 Ghz
1000 Mhz
Tema 1.39
ARQUITECTURA DE UN SISTEMA MICROINFORMÁTICO. PRINCIPIOS FUNCIONALES
A continuación, se muestra un esquema de lo que se verá en este apartado.
1.2.1.
ARQUITECTURA BÁSICA. INTRODUCCIÓN
Los primeros sistemas informáticos sólo podían ejecutar una sóla aplicación, y por lo general, ésta solía ser relativamente sencilla y en un memoria no volátil. Hoy en día, todavía existen sistemas de este tipo, como por ejemplo, las calculadoras, que están limitadas a realizar operaciones matemáticas, siendo por tanto, sistemas diseñados para un propósito específico. Se puede considerar que en estos sistemas, más que programar la aplicación, la aplicaciones han sido diseñadas junto con el sistema en el que se van a ejecutar. Debido a la poca flexibilidad que tienen estos tipos de sistemas, se fue evolucionando a otros que almacenan, tanto el código de la aplicación como los datos, en un tipo de memoria denominada RAM. En dicha memoria RAM, se podría cargar distintos tipos de aplicaciones y ser ejecutadas. Estos sistemas, al poder ejecutar distintas aplicaciones, son mucho más versátiles. Fue Von Neumann el que describió en su famoso artículo “First Draft of a Report on the EDVAC” propuso un sistema de estas características. Propuso una arquitectura básica del diseño de un sistema digital, cuyos bloques funcionales más significativos eran una unidad de control , una unidad aritmética y una memoria de acceso aleatorio donde se almacenarían, no sólo los datos que maneja la aplicación, sino la propia aplicación en sí. También dispondría de mecanismos de entrada/salida para
CEDE - C/ Cartagena, 129 - 28002 Madrid Tel.: 91 564 42 94
© C E D E – www.cede.es
Tema 1.40
Profesores de Enseñanza Secundaria INFORMÁTICA
poder interactuar con el exterior. Una aproximación a la máquina de Von Neumann, puede ser la siguiente: La idea de almacenar tanto los datos como las instrucciones a ejecutar en la memoria principal, suponía que no se podrían buscar datos e instrucciones al mismo tiempo, ya que, al estar almacenadas en el mismo sitio, compartían el mismo bus, concretamente el bus de datos. Esta situación, reduce el rendimiento del sistema, y conoce como el cuello de botella de VonNeumann. Aparte del cuello de botella de Von Neumann, había otros puntos en contra de dicha arquitectura, puesto que si las instrucciones se almacenan como si fueran un dato más, estas instrucciones se podrían modificar. Estamos hablando de la auto-modificación de código, que al principio, era una idea que gustaba, puesto que los sistemas se podrían autorreprogamar y evitar la tediosa tarea de cargar nuevos programas en memoria. Sin embargo, esta idea pronto se desechó, ya que las técnicas de automodificación de código eran muy difíciles de comprender, de depurar y mantener. El problema de la modificación del código por los propios programas, se hizo mayor cuando aparecieron los sistemas multiprogramados, ya que una aplicación, no sólo podría modificarse a sí misma, sino que también podría modificar el código de otra aplicación, incluso la del sistema operativo. Hoy en día, los sistemas operativos, han incluido mecanismos de protección y otras formas de control de acceso para evitar las situaciones descritas anteriormente.
El hecho de que las instrucciones fueran consideradas como datos, dio también pie a pensar que se podrían crear aplicaciones cuyo propósito fuera el de crear otras aplicaciones de una forma más fácil, rápida y segura. Fue de esta manera como aparecieron los ensambladores, los compiladores y las herramientas para el desarrollo de aplicaciones.
© C E D E – www.cede.es
CEDE - C/ Cartagena, 129 - 28002 Madrid Tel.: 91 564 42 94
Profesores de Enseñanza Secundaria INFORMÁTICA
Tema 1.41
Pero empecemos por definir lo que es una arquitectura en informática. Arquitectura de un sistema se define como la combinación de la microarquitectura, que es la forma que el conjunto de instrucciones es se implementa en el procesador y el conjunto de instrucciones en sí. El conjunto de instrucciones de un procesador son las instrucciones que es capaz de ejecutar. El conjunto de instrucciones condiciona el diseño de la arquitectura del sistema en general, aunque también es cierto que diferentes arquitecturas pueden ser compatibles entre sí y poder ejecutar el mismo conjunto de instrucciones. La arquitectura de un sistema se describe como un conjunto de bloques, cada uno con una función definida e interconectados entre sí, ya que todos ellos deben interactuar entre sí. A continuación, vamos a analizar una arquitectura basada en el modelo propuesto por Von Neumann. Dicho sistema está compuesto por los siguientes elementos: − Unidad Central de Proceso (UCP), que es la encargada de ejecutar las instrucciones. Este componente es bastante complejo y a su vez, se divide en otros bloques más elementales. − Memoria Principal es la que almacena tanto los datos, como las instrucciones. − Unidad de Entrada-Salida, que gestiona los periféricos. − Buses, que permiten la interconexión de los distintos elementos.
Vamos a ver cada uno de estos elementos, con mayor detalle: 1.2.2.
UNIDAD CENTRAL DE PROCESO (UCP)
La Unidad Central de Proceso, como se ha comentado, es la encargada de ejecutar las instrucciones que componen una aplicación. Está compuesta por otros elementos que se reparte distintas funciones. Dichos elementos son: − Unidad de Control. − Unidad Aritmético-Lógica. (A.L.U.). − Registros.
CEDE - C/ Cartagena, 129 - 28002 Madrid Tel.: 91 564 42 94
© C E D E – www.cede.es
Tema 1.42
Profesores de Enseñanza Secundaria INFORMÁTICA
1.2.2.1. Unidad de control
La unidad de control, es el elemento más complejo de todos, por ello, está compuesto, a su vez, por el decodificador y el secuenciador. El decodificador, como su nombre indica, decodifica las instrucciones que le van llegando desde la memoria principal. El decodificador identifica la instrucción en ejecución de entre el conjunto de instrucciones que pueden ejecutar. Esta identificación se realiza a través del código de operación, que es único para cada instrucción. Para llevar a cabo esta acción, se necesita que la operación esté almacenada en un registro denominado Registro de Instrucción (RI), por tanto, este registro se utiliza para almacenar la instrucción que se está ejecutando en ese momento.
Una vez identificada la instrucción, el otro componente relevante de la UC, el secuenciador, activa las señales de control (por el bus de control) necesarias, en orden y en tiempos adecuados para que el resto de los componentes trabajen de forma coordinada y se pueda llevar a cabo el cometido de la instrucción. Podemos decir que el secuenciador gobierna al resto de componentes mediante señales de control. El secuenciador tiene asociadas un conjunto de señales de control a cada una de las instrucciones posibles. Este conjunto de señales de control pueden estar definidas en un microprograma, que
© C E D E – www.cede.es
CEDE - C/ Cartagena, 129 - 28002 Madrid Tel.: 91 564 42 94
Profesores de Enseñanza Secundaria INFORMÁTICA
Tema 1.43
es lo que se denomina unidad de control microprogramada, o bien estar implementadas en un circuito digital, en cuyo caso sería una unidad de control cableada. El diseño cableado permite una ejecución rápida de las instrucciones, sin embargo, es difícil su diseño, ya que para cada instrucción, hay un circuito electrónico que habilita y deshabilita las señales de control. Este diseño es poco flexible, y difícil de depurar, por lo que las instrucciones que ejecutan este tipo de unidad de control, suelen ser sencillas. Este tipo de unidad de control es que se suelen utilizar en los microprocesadores de tipo RISC, de los que hablaremos posteriormente. El diseño microprogramado, asocia un microprograma a cada instrucción. El microprograma establece el secuenciamiento de estados y ejecución de operaciones en cada estado, que básicamente, consiste en habilitar y deshabilitar señales de control. Este diseño simplifica el diseño de la unidad de control, siendo un diseño más barato, menos propenso a errores y más flexible. También ofrece la posibilidad de emular diferentes conjuntos de instrucciones. Como contrapartida a todas estas ventajas, la ejecución de la instrucción es más lenta que para el caso de los sistemas cableados. Este tipo de implementaciones, se utilizan el los sistemas CISC. 1.2.2.
SISTEMAS RISC Y CISC
En función del número de instrucciones y de la complejidad de las mismas, una CPU se puede clasificar en RISC o CISC. 1.2.2.1. Sistemas CISC
Las CPU que son consideradas CISC (Complex Instruction Set Computer) o lo que es lo mismo sistemas con un conjunto complejo de instrucciones. Poseen un amplio y detallado conjunto de instrucciones, y cada una de ellas, puede realizar taras muy complejas. Como normal general, debido a su complejidad, se basan en la microprogramación, y el tiempo de ejecución de algunas instrucciones, es muy largo. Las ventajas que ofrecen las CPU de tipo CISC es que simplifican los compiladores, ya que el propio procesador incluyen instrucciones que realizan tareas complejas, y por tanto,los compiladores no han de descomponerlas en tareas más sencillas. Al haber instrucciones complejas, el número de instrucciones que componen la aplicación, se reduce considerablemente, lo que no indica que sea más rápido, pues no debemos olvidar que son instrucciones que necesitan mucho tiempo para ejecutarse. Los sistemas CISC son los más extendidos, lo que hace que sean más baratos y que haya más aplicaciones disponibles para estas arquitecturas. 1.2.2.2. Sistemas RISC
Los diseños RISC, minimizan el número de instrucciones disponibles y su complejidad. Las instrucciones, por tanto, son más uniformes, lo que facilita su obtención, decodificación y ejecución, que
CEDE - C/ Cartagena, 129 - 28002 Madrid Tel.: 91 564 42 94
© C E D E – www.cede.es
Tema 1.44
Profesores de Enseñanza Secundaria INFORMÁTICA
suele ser extremadamente rápida. Para realizar las operaciones complejas que ofrecían las instrucciones de las CPU CISC, ahora se necesitan varias instrucciones más sencillas, pero que se ejecutan a mayor velocidad. Las ventajas de los RISC, suelen ser los inconvenientes de los CISC y a la inversa. Las CPU de tipo RISC, al tener pocas instrucciones y sencillas, dejan mucho espacio en el interior de la CPU que suele aprovecharse para incluir una gran banco de registros de trabajo de uso general. El uso intensivo de estos registros de trabajo, hace que se ahorren muchos ciclos de memoria y por tanto, suba el rendimiento, ya que dichos registros están dentro de la CPU. Los sistema RISC están asociados los equipos de alta gama. 1.2.2.3. Reloj de Sistema
Para que todos los elementos estén coordinados, las señales de control se han de enviar en el orden y en tiempo adecuados, es por ello que se necesita una señal de reloj externa que llegue a todos los elementos y que permita la sincronización entre todos ellos. La señal de reloj no es más que una sucesión de impulsos eléctricos a intervalos constantes. Los primero sistemas utilizaban una señal de reloj con frecuencias relativamente bajas, normalmente Khz. Esto significa que tan sólo se generaban unos cientos de impulsos cuadrados por segundo. Las señales de reloj de los sistemas actuales, trabajan en el orden de magnitud de los Ghz, es decir, se generan miles de millones de ciclos de reloj por segundo. A partir de estas frecuencias tan elevadas, la construcción de los circuitos se complica enormemente, ya que los conductores internos se comportan más que como conductores eléctricos, como guías de onda. Con el aumento de frecuencia también aumenta el problema de disipación de energía en los componentes, ya que ahora se genera más calor, que puede comprometer la estabilidad del circuito.Es por esta razón por la que las frecuencias de trabajo se los sistemas actuales, llevan tiempo sin aumentar, al menos de forma destacable, como se hacía hasta hace relativamente poco tiempo. Ahora, para aumentar el rendimiento del sistema, se prefieren otras soluciones antes que aumentar la frecuencia de trabajo del mismo. El secuenciador, conoce cuantos ciclos de reloj se necesitan para llevar a cabo las acciones que les encomienda al resto de componentes, por lo que consigue que todos trabajen de forma coordinada. Es importante reseñar que el único elemento que es consciente de que el sistema está ejecutando una instrucción es el secuenciador, el resto de elementos, sólo realizan las operaciones asignadas y cuando el secuenciador se las ordena. Por ello, podríamos considerarlo como el “cerebro” del sistema. 1.2.2.4. Unidad Aritmético-Lógica (ALU)
La unidad aritmético-lógica tiene implementadas en sus circuitos las operaciones aritmético y lógicas basadas en el álgebra de Boole, y las realiza sobre los operandos que previamente se les ha depositado en sus registros (a instancia del secuenciador, quien activa la señal de control adecuada). El resultado, lo ofrece en un registro que se suele denominar Acumulador. Internamente está formada por circuitos sumadores, multiplicadores, registros de desplazamiento, etc.
© C E D E – www.cede.es
CEDE - C/ Cartagena, 129 - 28002 Madrid Tel.: 91 564 42 94
Profesores de Enseñanza Secundaria INFORMÁTICA
Tema 1.45
La ALU, dispone de un registro de estado en el que muestra información sobre condiciones y estados de la última operación. En este registro podría mostrar, por ejemplo,si se ha intentado hacer una operación ilegal como la de dividir por 0.
Unidad Aritmético-Lógica
La ALU que vamos a incluir en la arquitectura que vamos a mostrar, es muy sencilla, por eso, siempre realiza las operaciones matemáticas sobre el registro acumulador. Si queremos hacer una suma, se asume que uno de los sumandos, es siempre el acumulador. Por tanto, para hacer una operación de suma, primero se tendrá que cargar el primer sumando en el acumulador, y después pedirle que lo sume a otro número. El resultado siempre aparece en el acumulador. La ALU, como normal general, realiza sólo operaciones sencillas, por lo que en los sistemas actuales, que requieren operaciones matemáticas más complejas, se hace uso de un procesador especializado en realizar este tipo de operaciones, es el denominado coprocesador matemático. 1.2.2.5. Registros
Los registros proporcionan un espacio de almacenamiento reducido pero de gran velocidad, ya que están situado dentro de la propia CPU. Los registros son imprescindibles para el buen funcionamiento del sistema El tamaño de los registros, como se indicaba, es pequeño y suelen contener una capacidad que es potencia de 2. Son normales los registros de 8, 16, 32, 64 y 128 bits. Existen dos tipos de registros, los que que son visibles y por tanto utilizables por las aplicaciones de usuario, y los registros de control, que se utilizan permitir el correcto funcionamiento del sistema. Los registros, se pueden clasificar de la siguiente manera: − Registros generales de datos, que sirven para que las aplicaciones almacenen datos y resultados temporales y poder tener un acceso rápido a ellos. − Registros de direcciones, que contienen direcciones de memoria ó valores relacionados con las construcción de direcciones de memoria.
CEDE - C/ Cartagena, 129 - 28002 Madrid Tel.: 91 564 42 94
© C E D E – www.cede.es
Tema 1.46
Profesores de Enseñanza Secundaria INFORMÁTICA
− Registro de estado y control. Nos muestran el estado en el que se encuentra los distintos elementos del sistema, desde la ALU, a los periféricos. Nos permiten conocer el estado en que se encuentra el sistema y en función de ello, tomar acciones.
Por otro lado, también pueden clasificarse como registros visibles por el usuario, y por tanto utilizables por las aplicaciones de usuario, y los registros de control, que se utilizan permitir el correcto funcionamiento del sistema.
Veamos los registros más importantes del sistema, aunque a algunos de estos registros ya se ha hecho referencia cuando se han desarrollado las funciones de otros elementos del sistema informático. Registros visibles por el usuario: Registro de estado. Nos permiten conocer el estado en que se encuentran el resto de dispositivos, como la ALU o los periféricos. Pueden ser los registros de estado de algunos componentes, no sean visibles al usuario. Registro Acumulador. Este registro, es el más importante de la ALU, ya que es el lugar donde ofrece el resultado de las operaciones lógico-aritméticas que realiza. También puede ser utilizado como operando en estas mismas operaciones. Banco de registros de propósito general. Es un conjunto de registros que las aplicaciones de usuario pueden utilizar para almacenar resultados parciales o datos temporales en general y que estos puedan estar disponibles sin tener que ir hasta la memoria principal a por ellos, con lo que suponen un ahorro de tiempo considerable que hace subir el rendimiento general del sistema.
© C E D E – www.cede.es
CEDE - C/ Cartagena, 129 - 28002 Madrid Tel.: 91 564 42 94
Profesores de Enseñanza Secundaria INFORMÁTICA
Tema 1.47
Registros de control. Son fundamentales y en los que se apoya el sistema para su funcionamiento y a continuación vamos a describir algunos de ellos. Contador de Programa (CP)
El contador de programa (CP), contiene la dirección de la siguiente instrucción a ejecutar. Durante la ejecución de una instrucción, se autoincrementa para apuntar a la siguiente instrucción, de esta manera, se consigue una ejecución secuencial del programa. Existen unas instrucciones de salto, que modifican este registro para así variar el flujo secuencial de ejecución del programa. Registro de Instrucción (RI)
En este registro está almacenada, de forma temporal, la instrucción que está ejecutando el sistema en este momento. Sobre este registro actúa el decodificador y una vez que determina de qué instrucción se trata, el secuenciador tomará las acciones necesarias para ejecutarla. Las instrucciones, además del código de operación, puede contener otra información como datos ó direcciones. Si tenemos la instrucción almacenada en el RI, esta información está fácilmente accesible. Registro de Direcciones de Memoria (RDM)
En este registro, indicamos la dirección de memoria implicada en un ciclo de lectura/escritura de memoria, es decir, de qué dirección de memoria vamos a leer o escribir. Registro de Intercambio de memoria (RIM)
En este registro, la memoria ofrece la información leída en un ciclo de lectura. En el caso de un ciclo de escritura, es de este registro de donde se recoge la información a almacenar en la dirección que se indique en el RDM. 1.2.3.
MEMORIA
La memoria es un dispositivo de almacenamiento de la información. En las arquitecturas basadas en el propuesta por Von Neumann, tanto las aplicaciones como los datos que se manejan, se almacenan en la misma memoria, en contraposición a lo que propone la arquitectura Hardvard. Las memorias están compuestas internamente por circuitos biestables que son capaces de almacenar información formando lo que se denominan celdas. Las celdas pueden almacenar información binaria, es decir, ó un 1 ó un 0. Internamente, las celdas se organizan en palabras, por lo tanto en una palabra se pueden almacenar varios bits. Al conjunto de los bits que forma una palabra, se le denomina longitud de palabra. Cada una de estas palabras están asociada a una dirección de memoria que las identifica de forma unívoca. La longitud de palabra y el número de palabras que posee la memoria, determinan la capacidad total de la memoria.
CEDE - C/ Cartagena, 129 - 28002 Madrid Tel.: 91 564 42 94
© C E D E – www.cede.es
Tema 1.48
Profesores de Enseñanza Secundaria INFORMÁTICA
La memoria siempre ha sido un recurso escaso, por lo que la optimización del uso de la memoria ha sido siempre una prioridad. Actualmente, gracias al avance en la tecnología de integración de circuitos, aunque sigue siendo un recurso muy apreciado, suele haber una mayor disponibilidad de memoria.
Memoria Principal
Sobre la memoria, se pueden realiza operaciones de lectura y escritura. En las operaciones de escritura, se almacena la información (una palabra) en una posición de memoria dada y en las operaciones de lectura, se lee una palabra de la memoria principal. Sobre el funcionamiento de la memoria, hemos de responder a algunas preguntas: ¿cómo le indicamos a la memoria la dirección de memoria desde la que queremos leer o donde queremos escribir? ¿De donde coge la memoria principal los datos que queremos escribir en memoria? ¿Donde nos ofrece la memoria principal los datos que estamos leyendo? Para resolver las cuestiones planteadas, necesitamos el uso de registros auxiliares, el RDM y el RIM. El RDM -Registro de direcciones de memoria, es el registro donde le indicamos la posición de memoria con la que queremos realizar la operación, ya sea de lectura o de escritura. El registro RIM, o registro de intercambio de memoria, sirve para depositar los datos que queremos que la memoria almacene, ó recoger la información que la memoria ha leído de la dirección indicada en el registro RDM. El selector de memoria, es el elemento que transforma la dirección del registro de dirección (que es un dato numérico) en una dirección efectiva, activando y desactivando las correspondientes líneas de los circuitos internos para acceder al lugar físico donde se almacena la información. La memoria principal, es un tipo de memoria denominada RAM, o memoria de acceso aleatorio, esto quiere decir que el tiempo de acceso a cada una de las palabras de memoria, es prácticamente el mismo. A diferencia de otros dispositivos de almacenamiento, tiene la ventaja de trabajar a velocidades comparables con la CPU, por lo tanto, es factible el poder pedir a la memoria las instrucciones, una a una, conforme van siendo ejecutadas. La arquitectura que veremos de ejemplo, funcionará de esta
© C E D E – www.cede.es
CEDE - C/ Cartagena, 129 - 28002 Madrid Tel.: 91 564 42 94
Profesores de Enseñanza Secundaria INFORMÁTICA
Tema 1.49
manera, aunque las arquitecturas actuales disponen de mecanismos para mejorar el proceso de adquisición de instrucciones a ejecutar. Uno de los inconvenientes de la memoria, es que es volátil, es decir, que se necesita estar continuamente suministrando energía eléctrica para que no se pierdan los datos que almacena. Si el sistema se apaga, se pierde todo el contenido de la memoria principal. Las aplicaciones, por tanto, se han de almacenar en algún periférico que permita el almacenamiento masivo y permanente de la información. Este tipo de periféricos, como puede ser el disco duro, a pesar de permitir almacenar gran cantidad de información de forma permanente, no deja de ser un periférico, y por tanto, su velocidad de trabajo, en comparación con la CPU, es muy reducida. Por ello, los sistemas necesitan cargar las aplicaciones desde los periféricos de almacenamiento masivo a la memoria principal, antes de poder ejecutarlas, puesto que la memoria principal si tiene una velocidad de trabajo mucho mayor. 1.2.4.
BUSES
Los buses son líneas eléctricas u ópticas a través de las cuales, se comunican las distintas unidades del sistema. Se define el ancho del bus como el número de líneas paralelas que posee el bus, y por lo tanto, la cantidad de bits que puede transmitir de forma simultánea. Existen tres tipos de buses, el bus de datos, de direcciones y el de control. 1.2.4.1. Bus de datos
Por el bus de datos se establece el intercambio de datos entre la CPU y el resto de unidades. La transmisión de la información por los buses de hace forma paralela. El ancho del bus de datos determina el tamaño de los bloques de información con los que el sistema trabaja. Suelen variar desde los 8 bits de los sistemas antiguos, a los 64 bits de la mayoría de los sistemas actuales. Es importante destacar que como en la Arquitectura de Von Neumann la instrucciones y los datos se almacenan en la memoria, por el bus de datos viajan no sólo los datos como tales, sino también las instrucciones que van a ser ejecutadas en la CPU. 1.2.4.2. Bus de direcciones
Transmite las direcciones con las que debe trabajar la memoria. Trabaja de forma coordinada con el bus de datos gracias a las señales de reloj. Del ancho del bus de direcciones depende el volumen de memoria directamente direccionable por la CPU, aunque los sistemas actuales, utilizan registros auxiliares para poder direccionar una mayor cantidad de memoria. 1.2.4.3. Bus de control
Este es un bus especial por el cual el secuenciador, envía las señales de memoria al resto de los componentes del sistema Si tuviéramos que hacer una analogía con el cuerpo humano, el bus de control sería el sistema nervioso que envía órdenes a todas las partes del cuerpo.
CEDE - C/ Cartagena, 129 - 28002 Madrid Tel.: 91 564 42 94
© C E D E – www.cede.es
Tema 1.50
Profesores de Enseñanza Secundaria INFORMÁTICA
1.2.5.
UNIDAD DE ENTRADA/SALIDA
El objetivo de la interfaz de Entrada/Salida, es comunica la CPU con el exterior a través de los periféricos. Muchos de los periféricos, están adaptados para poder presentar o adquirir la información en un formato en el que a las personas, les resulte familiar, como pueden ser el teclado o la pantalla. Los periféricos plantan varios problemas al sistema, uno de ellos, es que suelen ser dispositivos muy lentos, entre otras cosas, porque muchos de ellos, aún funcionan con dispositivos mecánicos. Por otro lado, otro inconveniente que presentan es que son dispositivos muy heterogéneos, es decir, entre ellos mismos, son muy diferentes. Pensemos por ejemplo en el modo de funcionamiento de una webcam, un teclado ó una impresora. Por ello, es necesario disponer de un controlador, que haga de interfaz entre el sistema y el periférico propiamente dicho. De esta manera, el controlador ofrece a la CPU una interfaz común a todos los periféricos, sean del tipo que sean. Un controlador puede controlar uno o varios periféricos, y en la arquitectura de ejemplo que vamos a presentar, se muestra como la Unidad de Entrada/Salida.
Unidad Entrada/Salida y periféricos
El controlador ofrece a la CPU los siguientes registros: − Registros de datos, que permiten intercambiar información con el periférico. − Registros de control, para enviar órdenes al periférico. − Registros de estado, muestra el estado en que se encuentra el periférico.
En el Registro de Datos, se deposita la información que intercambia la CPU con el periférico. En el registro de control, la CPU escribe las operaciones que desea que realice el periférico, como puede ser leer un dato del teclado ó escribir un carácter en pantalla. A través del registro de estado, el periférico informa a la CPU de la situación en que se encuentra, por ejemplo, si está disponible para imprimir un nuevo carácter ó está aún ocupado y no acepta más información. En algunos casos, los registros que se utilizan para gestionar la memoria, están mapeados en memoria, es decir, que el sistema trata a estos registros como si fueran una dirección de memoria más. Al estar asociados a una dirección de memoria, el escribir o leer en ellos, se realiza de la misma manera que escribir o leer en una dirección de memoria, por tanto, no diferencia entre el acceso a memoria y el
© C E D E – www.cede.es
CEDE - C/ Cartagena, 129 - 28002 Madrid Tel.: 91 564 42 94
Profesores de Enseñanza Secundaria INFORMÁTICA
Tema 1.51
acceso a los registros de E/S. Este esquema tiene el inconveniente de que se pierden direcciones de memoria, que ahora están asociadas a los periféricos, y que las aplicaciones de usuario, tienen dificultadas para acceder a esos registros de E/S. Si los registros de E/S no están mapeados en memoria, se solucionan los problemas anteriores, pero se necesitan añadir instrucciones de E/S para poder acceder a dichos registros, normalmente instrucciones del tipo IN y OUT. La interacción entre la CPU y los periféricos de E/S, se puede realizar por medio de dos métodos: − Encuesta − Interrupción.
En la E/S por encuesta, la CPU es la responsable de consultar con cierta frecuencia, el registro de estado del cada uno de los periféricos, para conocer el estado en que se encuentran. Esta consulta se hace de forma periódica. Cuando tenemos un esquema por interrupciones, es el dispositivo el que habilita una señal para informar a la CPU de que algún suceso extraordinario ha ocurrido y que requiere su atención. En un esquema por interrupciones, la CPU no ha de perder tiempo consultando los distintos dispositivos y puede dedicarse a realizar otras tareas, lo que supone una mejora del rendimiento global importante. El inconveniente de este esquema es que se complica el hardware, ya que la CPU, ha de dejar lo que estaba haciendo, salvar el estado en que se encuentra, para así poder atender al periférico. Una vez atendido el periférico mediante la rutina de atención a la interrupción, ha de recuperar el estado en el que se encontraba antes de producirse la interrupción, para continuar en el mismo punto en que dejó la aplicación interrumpida. El atender a la interrupción, no es la única complicación, ya que se puede dar la situación en que interrumpan varios dispositivos de forma simultánea y, primeramente, se tendrá que distinguir qué periféricos han interrumpido y posteriormente, establecer una prioridad en el tratamiento de las interrupciones. También puede darse la situación en la que cuando se esté atendiendo la interrupción de un dispositivo, interrumpa otro periférico que puede ser considerado de mayor prioridad. Todo lo anterior hace que este modo de gestión de los periféricos sea más complicado que el método por encuesta, aún así, el método por encuesta hace perder tanto tiempo a la CPU, que son inaceptables. Incluso los sistemas de gestión por E/S por interrupción son esquemas que hacen perder mucho tiempo a la CPU cuando las cantidad de información a intercambiar es importante, así que hoy en día, existen otros esquemas mucho más avanzadas como el DMA o acceso directo a memoria que liberan de esta sobrecarga de trabajo a la CPU. 1.2.6.
SET O CONJUNTO DE INSTRUCCIONES
Ante el diseño de un sistema informático, hay que plantearse qué instrucciones vamos a incluir, es decir, qué conjunto de instrucciones va a ser capaz el sistema de ejecutar.
CEDE - C/ Cartagena, 129 - 28002 Madrid Tel.: 91 564 42 94
© C E D E – www.cede.es
Tema 1.52
Profesores de Enseñanza Secundaria INFORMÁTICA
Para ello, han de tenerse en cuenta las siguientes consideraciones: − El conjunto de instrucciones, ha de ser completo, es decir, que se puedan construir con ellas aplicaciones que resuelvan algoritmos reales. − El juego de instrucciones, han de ser eficientes, las funciones más comunes, deben de poder ser fácilmente realizadas con pocas instrucciones. − El conjunto de instrucciones debe ser simétrico, por ejemplo, si existen una función de desplazamiento a la derecha, debe haber también una función de desplazamiento a la izquierda, y además, deben ser ortogonales, es decir, que puedan combinarse, en la medida de lo posible, todas las operaciones con todos los tipos de datos y modos de direccionamiento. − En ocasiones, se pide que guardar compatibilidad con un conjunto de instrucciones anterior.
Un formato de instrucción común, tiene el siguiente formato: Código Operacion (CO)
Código de Dirección (CD)
Tipos de Instrucciones
Un sistema, puede funcionar con un conjunto reducido de instrucciones, de hecho, la máquina de Turing sólo tiene 4 instrucciones, y la arquitectura de ejemplo que se muestra aquí, sólo 8. Un conjunto de instrucciones típico, incluye al menos los siguientes tipos de instrucciones:
Instrucciones de transferencia de datos
Este tipo de operaciones, nos permiten mover datos e instrucciones de un lugar a otro del sistema y son fundamentales para que el sistema funcione correctamente. A este tipo de instrucciones, necesitan que se le indique el origen y el destino de los datos a mover. A veces, el origen ó el destino de los datos, puede ser implícito. Instrucciones aritmético-lógicas
La inmensa mayoría de las aplicaciones de cierta complejidad, necesitan realizar operaciones aritméticas y/o lógicas, por lo que la necesidad de incluir este tipo de instrucciones está mas que justificada. Este tipo de instrucciones incluyen las operaciones de suma, resta, multiplicación ó división, aunque con la operación de suma, se pueden implementar otras operaciones, ya que la resta es una suma de un número negativo, la multiplicación es una sucesión de sumas y la operación de división se puede
© C E D E – www.cede.es
CEDE - C/ Cartagena, 129 - 28002 Madrid Tel.: 91 564 42 94
Profesores de Enseñanza Secundaria INFORMÁTICA
Tema 1.53
implementar mediante multiplicaciones y restas. En lo que se refiere a las operaciones lógicas, también son de importancia las operaciones básicas del álgebra de Boole, como la operación AND, OR, NOT y XOR. Instrucciones de control de flujo
Las instrucciones se ejecutan, como normal general, de forma secuencial, es decir, en el mismo orden en el que aparecen en la aplicación. Por esta razón, el contador de programa (CP), se va autoincrementando en una unidad en cada ciclo de instrucción, sin embargo, en algunas ocasiones, se necesita modificar el flujo, sobre todo después de la evaluación de un suceso. En función de dicha evaluación, se puede requerir que se ejecuten unas instrucciones u otras, y para ello se utilizan las instrucciones de control de flujo. Para este tipo de instrucciones, son fundamentales los bits de estado que ofrecen la ALU o los dispositivos. Instrucciones de Entrada-Salida
Las instrucciones de Entrada-Salida, son necesarias para permitir la comunicación entre la CPU y los periféricos, en el caso en el que los periféricos no hayan sido mapeados a memoria. 1.2.7.
MODOS DE DIRECCIONAMIENTO
La mayoría de las instrucciones, realizan operaciones sobre uno o varios operandos, por lo tanto, se debe incluir en la propia instrucción alguna forma de localizar el operando sobre el que se desea realizar la operación en cuestión, por tanto, el modo de direccionamiento, permite conocer la ubicación de un dato o instrucción. Los objetivos que se persiguen al utilizar el direccionamiento, son los siguientes: − Dar versatilidad de programación al usuario proporcionando distintas formas de acceder a los datos. − Reducir el espacio ocupado en memoria por las instrucciones.
Los modos de direccionamiento pueden parecer en principio complicados de entender y manejar, sin embargo, aportan una gran flexibilidad a la hora de escribir aplicaciones mas eficientes en cuanto al número de instrucciones y tiempo de ejecución. La dirección que obtenemos al aplicar un modo de direccionamiento, la denominamos dirección efectiva. A continuación se muestra un esquema con los modos de direccionamiento.
CEDE - C/ Cartagena, 129 - 28002 Madrid Tel.: 91 564 42 94
© C E D E – www.cede.es
Tema 1.54
Profesores de Enseñanza Secundaria INFORMÁTICA
A continuación, se explicarán brevemente cada uno de ellos. Direccionamiento implícito
A este modo de direccionamiento, también se le llama inherente, ya que el operando se especifica en la misma definición de la instrucción. Un ejemplo lo podemos encontrar con las instrucciones que trabajan con la pila (instrucciones PUSH y POP), en los que se sabe, de forma implícita, con qué elementos se trabaja. Direccionamiento Inmediato
En este tipo de direccionamiento, la propia instrucción contiene el operando sobre el que se ha de operar, sin realizar ningún tipo de transformación. El formato que tiene la instrucción, por tanto, es el siguiente: El tamaño del operando viene determinado por el espacio reservado para él en el formato de la instrucción. Direccionamiento directo (o absoluto)
En el modo de direccionamiento directo ó absoluto, la instrucción contiene la dirección de memoria exacta donde se encuentra el operando, por tanto, el operando se encuentra en memoria y hay que realizar un ciclo de memoria más para obtenerlo. El rango del código de dirección (CD), debe ser capaz de direccionar toda la memoria, por lo que puede hacer que el tamaño de la instrucción sea muy elevado, además, dificulta la relocalización de los programas, es decir, que el código de los programas, no dependa de su ubicación física. Direccionamiento directo por registro
En este caso, el operando, se haya contenido en un registro. La ventaja de este tipo de direccionamiento, es que es muy rápido, ya que el acceso al registro es inmediato y se ahorra un ciclo de memoria. Un dato típico que se almacena utilizando este tipo de direccionamiento es el índice de los bucles.
© C E D E – www.cede.es
CEDE - C/ Cartagena, 129 - 28002 Madrid Tel.: 91 564 42 94
Profesores de Enseñanza Secundaria INFORMÁTICA
Tema 1.55
El número de bits para especificar el registro, es mucho menor que el que se utiliza en el modo directo (absoluto), ya que el número de registros es mucho menor que el número de posiciones de memoria existentes. Direccionamiento directo relativo a registro
Este modo de direccionamiento hace uso de la propiedad muy generalizada de las aplicaciones que es la localidad de referencia, y que consiste en que las direcciones de memoria referenciadas en los programas, no suelen alejarse mucho unas de otras, por lo tanto, están concentradas en una zona de memoria relativamente pequeña. Aprovechando esta circunstancia, se toma como referencia un punto de la memoria y en la instrucción se incluye la diferencia entre ese punto de referencia y la dirección efectiva del operando. La dirección que se toma como referencia, suele residir en un registro de la CPU, y por tanto, si sumamos el contenido de ese registro con el campo de dirección contenido en la instrucción, obtenemos la dirección efectiva. Este modo de direccionamiento es usado con frecuencia en programas cuyo código deba ser independiente de la ubicación física del programa en memoria. También es muy útil en las instrucciones de bifurcación. Otros direccionamientos como por base y desplazamiento, indexado, los auto y postincrementales, son versiones de este tipo de direccionamiento. Direccionamiento indirecto
En este caso, se añade un eslabón más a la cadena que nos permite localizar la dirección efectiva. El operando se encuentra en memoria y la instrucción contiene una dirección cuyo contenido, es la verdadera dirección de memoria del objeto buscado. En general, todos los modos de direccionamiento tienen su versión inmediata. Por ejemplo, existe un direccionamiento indirecto por registro, en el que, el registro especificado en la instrucción, contiene la verdadera dirección de memoria del objeto buscado. Se han incluido los modos de direccionamiento básico más comunes, pero en las arquitecturas reales, con frecuencia, existen combinaciones de estos modos de direccionamiento. 1.2.8.
EJECUCIÓN DE UNA INSTRUCCIÓN
No debemos olvidar que la función última de la CPU, es la ejecución de instrucciones que forman una aplicación y que se hayan almacenadas en Memoria Principal. El juego de instrucciones que un sistema es capaz de ejecutar, condiciona en gran medida el resto de la arquitectura. Una instrucción está formada por un código de operación, y en la mayoría de los casos, también incluye uno o varios operandos que especifican sobre qué datos debe aplicarse la instrucción asociada a ese código de operación.
CEDE - C/ Cartagena, 129 - 28002 Madrid Tel.: 91 564 42 94
© C E D E – www.cede.es
Tema 1.56
Profesores de Enseñanza Secundaria INFORMÁTICA
1.2.8.1. Ejecución de una aplicación paso a paso
Recordemos la Arquitectura de Von Neumann.
Se van a ver los pasos que se dan el sistema en la ejecución de un programa sencillo. Lo que hace este programa es cargar el contenido de la dirección de memoria 5, en el acumulador. Sumarle al acumulador el contenido de la dirección de memoria 6, y e resultado, almacenarlo en la dirección de memoria número 7. El programa, es el siguiente: LD /5 ADD /6 ST /7 Instrucción LD /4
El cometido de esta instrucción es cargar el acumulador el contenido de la dirección de memoria 5 en el Acumulador. Fase 1. Fase de Búsqueda de la instrucción LD /4
Al iniciarse la ejecución del programa, el contador de programa está establecido a 0. En principio, sólo sabemos que vamos a ejecutar la instrucción que haya en la posición 0, pero no se sabrá que instrucción es hasta que no la decodifique el decodificador. Pues lo que se tendrá que hacer es llevar el
© C E D E – www.cede.es
CEDE - C/ Cartagena, 129 - 28002 Madrid Tel.: 91 564 42 94
Profesores de Enseñanza Secundaria INFORMÁTICA
Tema 1.57
contenido de la posición de memoria 0 a la Unidad de Control, para que pueda ser decodificada y ejecutada. Para ello, se pasa el contenido del Contador de Programa (CP), que en principio vale 0, al Registro de Direcciones de Memoria (RDM), y se activa la señal de control de Lectura LEC de la memoria. De esta manera, se leerá el contenido de la posición de memoria 0, y se depositará en el Registro de Intercambio de Memoria. A través del bus de datos, la instrucción viajará desde el Registro de Intercambio de Memoria hasta el Registro de Instrucción, situado en la Unidad de Control. En la siguiente figura se muestran los elementos implicados.
Fase 2. Fase de Ejecución de la instrucción LD /4
Estando la primera instrucción en el Registro de Instrucción (RI), ya se puede decodificar las instrucción, algo que lleva a cabo el Decodificador. Una vez que se ha decodificado la instrucción, el Secuenciador sabe qué señales de control debe activar, a qué elemento y en que orden para que la instrucción se ejecute. Esta información, puede estar codificada en un microprograma, o bien puede haber una lógica cableada que active las señales de forma apropiada. En este caso en particular, se ha decodificado una instrucción de carga de información desde la memoria al acumulador. (LD /4), por lo tanto el Secuenciador deberá movilizar a todos los elementos necesarios para que la información contenida en la dirección de memoria 4, pase al acumulador, para ello, inicia un nuevo ciclo de memoria, pasando la dirección de memora /4 desde el Registro de intercambio, al registro de direcciones de Memoria (RDM). Se muestran los elementos implicados.
CEDE - C/ Cartagena, 129 - 28002 Madrid Tel.: 91 564 42 94
© C E D E – www.cede.es
Tema 1.58
Profesores de Enseñanza Secundaria INFORMÁTICA
A continuación, se lanza otro ciclo de lectura de memoria para leer el dato que habrá de llevarse al acumulador. Para ello, se activa la señal de control de lectura de la memoria y se deposita el dato leído (en este caso DATA 12), en el Registro de Intercambio de memoria (RIM), y de aquí, al acumulador. En este caso, la ALU es muy sencilla y tiene como restricción que uno de los operandos ha de ser siempre el valor del acumulador. Es por ello que establece en el registro de Oper1, el mismo valor que hay en el acumulador. De forma paralela, se envía señal de control INCR al contador de programa (CP), para que incremente su valor en uno y así para apuntar a la siguiente instrucción a ejecutar.
© C E D E – www.cede.es
CEDE - C/ Cartagena, 129 - 28002 Madrid Tel.: 91 564 42 94
Profesores de Enseñanza Secundaria INFORMÁTICA
Tema 1.59
Una vez que el dato que hay en la posición de memoria 4, ha pasado al acumulador, se ha completado ejecución la instrucción LD /4 y el sistema está preparado para ejecutar la siguiente instrucción, esto es ADD /5. La instrucción ADD /5, lo que hace es sumar el contenido de la dirección de memoria /5 al valor que haya en ese momento en el acumulador (ACUM). Instrucción ADD /5 Fase 1. Fase de Búsqueda de la instrucción ADD /5
En la ejecución de la primera instrucción, el contador de programa se ha incrementado en una unidad a instancia del Secuenciador que le ha enviado la señal de control INCR, por lo tanto, ahora el contenido del contador de programa es 1. Para continuar con la ejecución del programa, se pasa el contenido del Contador de Programa (CP), que ya vale 1, al Registro de Direcciones de Memoria (RDM), y se activa la señal de control de Lectura LEC de la memoria. De esta manera, se leerá el contenido de la posición de memoria 1, y se depositará en el Registro de Intercambio de Memoria. A través del bus de datos, la instrucción viajará desde el Registro de Intercambio de Memoria hasta el Registro de Instrucción, situado en la Unidad de Control. En la siguiente figura se muestran los elementos implicados.
Fase 2. Fase de Ejecución de la instrucción ADD /5
Una vez que la instrucción está en el Registro de Instrucción (RI), se decodifica las instrucciones y el secuenciador al ser informado de que es una instrucción ADD, sabe qué señales de control debe activar.
CEDE - C/ Cartagena, 129 - 28002 Madrid Tel.: 91 564 42 94
© C E D E – www.cede.es
Tema 1.60
Profesores de Enseñanza Secundaria INFORMÁTICA
En este caso, el Secuenciador habilita las señales de control para que la dirección del dato a sumar pase del Registro de Instrucción al Registro de Direcciones de memoria (RDM). Se muestran los elementos implicados.
A continuación, se lanza otro ciclo de lectura de memoria para leer el dato que habrá de ser sumado al contenido del acumulador.. Para ello, se activa la señal de control de lectura de la memoria y se deposita el dato leído (en este caso DATA 7), en el Registro de Intercambio de memoria (RIM), y de aquí a uno de los registros que la ALU tiene para almacenar los operandos. Paralelamente, se envía señal de control INCR al contador de programa (CP), para que incremente su valor en uno y así para apuntar a la siguiente instrucción a ejecutar.
© C E D E – www.cede.es
CEDE - C/ Cartagena, 129 - 28002 Madrid Tel.: 91 564 42 94
Profesores de Enseñanza Secundaria INFORMÁTICA
Tema 1.61
Una vez que el dato se encuentra en la ALU, ya tenemos lo dos sumandos con los que realizar la operación, por lo que el Secuenciador envía una orden de control a la ALU, para que realice la operación. El resultado aparece en el Acumulador. Instrucción ST /6
El cometido de esta instrucción es almacenar la información contenida en el acumulador, en la memoria, concretamente en la dirección de memoria 6. Fase 1. Fase de Búsqueda de la instrucción ST /6
En la anterior instrucción, el contador de programa se ha incrementado en una unidad, pasando su valor de 1 a 2. Para continuar con la ejecución del programa, se pasa el contenido del Contador de Programa (CP) al Registro de Direcciones de Memoria (RDM), y se activa la señal de control de Lectura LEC de la memoria. De esta manera, se leerá el contenido de la posición de memoria 2, y se depositará en el Registro de Intercambio de Memoria. A través del bus de datos, la instrucción viajará desde el Registro de Intercambio de Memoria hasta el Registro de Instrucción, situado en la Unidad de Control. En la siguiente figura se muestran los elementos implicados.
Fase 2. Fase de Ejecución de la instrucción ST /6
Una vez que la instrucción está en el Registro de Instrucción (RI), se decodifica las instrucciones y el secuenciador al ser informado de que es una instrucción ST , sabe qué señales de control debe activar.
CEDE - C/ Cartagena, 129 - 28002 Madrid Tel.: 91 564 42 94
© C E D E – www.cede.es
Tema 1.62
Profesores de Enseñanza Secundaria INFORMÁTICA
En este caso, el Secuenciador habilita las señales de control para que la dirección del dato a almacenar pase del Registro de Instrucción al Registro de Direcciones de memoria (RDM). Se muestran los elementos implicados.
A continuación, se lanza un ciclo de escritura de memoria para enviar el dato desde al acumulador, a la memoria principal. Paralelamente, se envía señal de control INCR al contador de programa (CP), para que incremente su valor en uno y así para apuntar a la siguiente instrucción a ejecutar.
© C E D E – www.cede.es
CEDE - C/ Cartagena, 129 - 28002 Madrid Tel.: 91 564 42 94
Profesores de Enseñanza Secundaria INFORMÁTICA
Tema 1.63
Una vez que el dato resultado de la suma (y contenido en el acumulador) ha pasado a la dirección de memoria /6, se ha completado ejecución la instrucción ST /6.
1.3.
ANÁLISIS DE BLOQUES FUNCIONALES SOBRE ARQUITECTURAS VIGENTES
En este apartado, se estudiarán las arquitecturas actuales en los sistemas microinformáticos y se verán qué mejoras se han ido introduciendo para mejorar el rendimiento de los sistemas.
1.3.1.
CLASIFICACIÓN DE ARQUITECTURAS. TAXONOMÍA DE FLYNN
Hasta ahora, se han visto arquitecturas en las que las instrucciones se ejecutan, de forma secuencial sobre un determinado dato, pero actualmente, los sistemas han evolucionando, y casi todos los procesadores modernos incorporan algún tipo de paralelismo. Es por ello que se hicieron nuevas clasificaciones que recogiera esta nueva variedad de arquitecturas. La más conocida es la definida por Flynn, que se basa en el número de instrucciones que se ejecutan concurrentemente y en los flujos de datos sobre los que operan dichas instrucciones. SISD (Single Instruction, Single Data, o Una instrucción, un dato)
Se ejecuta una sóla instrucción sobre un sólo dato. No explota el paralelismo en las instrucciones ni en flujos de datos. Este es el concepto de arquitectura de Von Neumann y a menudo se les llama también computadores serie escalares. Ninguno de los procesadores actuales estaría en esta categoría por incorporar algún tipo de paralelismo.
CEDE - C/ Cartagena, 129 - 28002 Madrid Tel.: 91 564 42 94
© C E D E – www.cede.es
Tema 1.64
Profesores de Enseñanza Secundaria INFORMÁTICA
MISD (Multiple instruction, Single Data o Múltiples instrucciones, un dato)
Esta arquitectura no se ha desarrollado debido a que normalmente, cuando se ejecutan muchas instrucciones, se suele hacer sobre múltiples datos, pero se pueden utilizar para sistemas redundantes. SIMD (Single Instruction, Multiple Data, o Una instrucción, múltiples datos)
En este caso, una misma instrucción se ejecuta sobre un conjunto de datos. Se pueden aprovechar para determinadas aplicaciones, como las multimedia, donde se realiza la misma operación para grandes volúmenes de datos. También se les llama procesadores matriciales. MIMD (Multiple Instructions, Multiple Data o Múltiples instrucciones, múltiples datos)
Varios procesadores autónomos que ejecutan simultáneamente instrucciones diferentes sobre datos diferentes. Los sistemas distribuidos, son ejemplo de este tipo de arquitectura, aunque cualquier sistema que tenga varios procesadores independientes ejecutando varios procesos, estarían dentro de esta categoría. 1.3.2.
ARQUITECTURA ACTUALES
1.3.2.1. La arquitectura x86
La arquitectura x86, es una denominación genérica de una serie de procesadores compatibles entre sí. Este tipo de arquitectura contempla desde el procesador que le dio el nombre, el 8086, hasta procesadores muchos más avanzados, como pueden ser los primeros Pentiums. Esta arquitectura fue lanzada por Intel, y tuvo grán éxito ya que tenían suficiente potencia para poder ejecutar aplicaciones de propósito general y por tanto, de ser comercializado para el gran público. IBM lanzó una línea de ordenadores basada en el 8080, precursor del 8086, y el éxito fue importante. Poco a poco, fueron evolucionando los procesadores de la serie, todos compatibles con los antecesores. Uno de los grandes avances que se incluyeron fue la posibilidad de ejecutar varias aplicaciones de forma simultánea, al incluir el modo de ejecución protegido. El 8086 era un procesador de 16 bits, pero el 30386, era de 32 bits, lo que supuso un avance importante en rendimiento. Fue este procesador el que dio lugar a la denominación de arquitectura i386 ó IA32. Conforme fueron evolucionando, se fueron añadiendo mejoras, como la inclusión de caché en el procesador, las instrucciones multimedia o el coprocesador matemático (FPU). Intel tuvo el liderazgo en este tipo de arquitectura y el resto de fabricantes, tuvieron que ofrecer compatibilidad con la misma, sin embargo, AMD, que siempre fue a la saga de Intel, lanzó una nueva arquitectura, que estaba basada en la x86, pero ahora con 64 bits, compatible con sistemas operativos y aplicaciones de 32 bits. Esta arquitectura, se denominó, en principio x86-64, para posteriormente pasarse a llamar AMD64.
© C E D E – www.cede.es
CEDE - C/ Cartagena, 129 - 28002 Madrid Tel.: 91 564 42 94
Profesores de Enseñanza Secundaria INFORMÁTICA
Tema 1.65
1.3.2.2. Arquitectura x86-64
La arquitectura de 64 bits, fue, como se ha comentado, lanzada por AMD y en este caso, fue Intel el que se vió obligado a sacar sus procesadores compatibles con la nueva arquitectura (salvo alguna excepción). Los primeros procesadores de este tipo, fueron los K8, que incluían a los Athlon, de gama media, Sempron, de gama baja y los Phenom, de gama alta. Ahora se ofrece varios modos de funcionamiento, el modo largo, donde se pueden ejecutar sistemas operativos y aplicaciones de 64bits, aunque las aplicaciones pueden ser de 32 bits(en modo largo-compatiblidad). Por otro lado, el modo herencia, permite ejecutar sistemas operativos de 32 bits y aplicaones de 32 o 16 bits. Obviamente, para sacar todo el potencial al sistema, se debe trabajar con sistemas operativos y aplicaciones de 64 bits. La línea de Intel de 64 bits, se denomina Intel 64 y está disponible desde los últimos Pentiums, a los procesadores actuales. Por otro lado, Intel, también diseñó una arquitectura propia de 64 bits, pero que en este caso, estaba destinada a los equipos servidores, la denominada IA-64. 1.3.3.
MEJORAS EN LAS ARQUITECTURAS ACTUALES
1.3.3.1. Instrucciones multimedia
La importancia que han adquirido las aplicaciones multimedia en la sociedad actual, ha propiciado que los fabricantes hayan incluido un conjunto de instrucciones para mejorar el rendimiento en la ejecución de estas aplicaciones. Las primeras instrucciones de este tipo, fueron las instrucciones MMX, en los procesadores Pentium. La inclusión de estas instrucciones, supuso la aparición de nuevos registros internos, que en realidad no eran tales, sino un renombrado de los registros de la Unidad en coma flotante (FPU), de tal manera que no pueden ejecutar con la FPU y las instrucciones MMX de forma simultánea. Otra característica en contra de las instrucciones MMX es que sólo soportan trabajar con enteros. A pesar de todos los inconvenientes señalados, se obtenía mejor rendimiento en las aplicaciones que manejan contenido multimedia, y AMD se vio obligada a sacar compatibilidad con MMX, a las que añadió un juego de instrucciones para operar en coma flotante, las conocidas como 3DNow! Los problemas de las instrucciones MMX, fueron solventados con la llegada de las instruciones SSE, con soporte en coma flotante y un sistema de registros independientes de la FPU. SSE evolución a SSE2 y despues a SSE3, todas las cuales, incluyen a las anteriores.
CEDE - C/ Cartagena, 129 - 28002 Madrid Tel.: 91 564 42 94
© C E D E – www.cede.es
Tema 1.66
Profesores de Enseñanza Secundaria INFORMÁTICA
1.3.3.2. FPU
Otras de las mejoras añadidas, fue la inclusión de la unidad en coma flotante ó FPU. La FPU es un componente especializado en el cálculo de operaciones complejas, como pueden ser operaciones en coma flotante, cálculos trigonométricos ó exponenciales. La FPU, viene pues a aliviar a la ALU de estas operaciones que le supondrían una sobrecarga. 1.3.3.3. Segmentación a nivel de instrucciones
Esta técnica que es muy utilizada por los microprocesadores, microcontroladores y DSPs, lo que persigue, no es que se ejecuten las instrucciones más rápido, sino que ejecución de las instrucciones se haga en paralelo. El funcionamiento es similar a las cadenas de montaje, en la que varios operarios realiza parte del proceso total en paralelo. La segmentación se aprovecha de las diferentes fases por las que pasa una instrucción, desde que se localiza, hasta que se termina de ejecutar. Un ejemplo muy sencillo de segmentación, mientras que una instrucción se busca, otra se puede decodificar, otra puede realizar operaciones con la ALU, otra puede buscar un operando, etc. Cada una de esta etapas usa, en exclusiva, un hardware determinado del procesador y en principio, son fases independientes unas de las otras. En los procesadores RISC, la segmentación es más fácil de implementar, ya que al ser todas las instrucciones muy sencillas y homogéneas, la división de fases está mucho mas clara que en las instrucciones propias de los procesadores RISC, esta es una de las razones por la que los procesadores RISC han tenido tradicionalmente más rendimiento que los procesadores CISC. Los procesadores CISC, para aprovechar la segmentación a nivel de instrucción, traducen cada instrucción a microopereciones de tipo RISC. La arquitectura Hardvard, es más propicia a la segmentación de instrucciones al tener las instrucciones y los datos de las aplicaciones en memorias separadas. En el caso del procesador DLX, podemos encontrar las siguientes etapas de ejecución: IF: Búsqueda. ID: Identificación. EX: Ejecución de la Unidad Aritmético-Lógica. MEM: Memoria. WB: Escritura de resultados. En los procesadores actuales, son comunes más de 20 etapas de ejecución. Está claro que la segmentación, mejora considerablemente el rendimiento del sistema, pero también plantea problemas, por ejemplo, si se está ejecutando una instrucción de salto, puede ser que las siguientes instrucciones, que ya han empezado a ejecutarse, tengan que ser descartadas. Para evitar esta circunstancia, se intenta predecir los saltos que se van a realizar, es lo que se se denomina, Brach Predictor, o predicción de saltos. La predicción de saltos, se basa en la información obtenida en la misma instrucción condicional, para intentar averiguara si se producirá el salto o no.
© C E D E – www.cede.es
CEDE - C/ Cartagena, 129 - 28002 Madrid Tel.: 91 564 42 94
Profesores de Enseñanza Secundaria INFORMÁTICA
Tema 1.67
También puede ocurrir que una instrucción modifique el dato de una instrucción posterior, y que esa instrucción, ya haya cogido el valor desactualizado del dato. Por ejemplo, las siguientes instrucciones, si se ejecutan en paralelo, puede dar un resultado erróneo, ya que puede ser que el valor de la variable c, no se haya actualizado cuando ya se está ejecutando la segunda instrucción: Instrucción 1 Instrucción 2
c=a+b d=c+f
La segmentación de instrucciones, complica el hardware del procesador, sin embargo, el aumento de rendimiento que proporciona, lo hace indispensable. 1.3.3.4. Caché
La caché se utiliza para reducir el tiempo medio de espera que se necesita en el acceso a la memoria. La caché tiene un tamaño relativamente reducido en comparación con la memoria principal, pero tiene la ventaja de que es mucho más rápida que ésta, al estar incluida en el propio procesador. La caché almacena una copia de parte de la memoria principal. La localización de la memoria caché dentro de la pirámide de jerarquía de memoria, es la siguiente:
Los sistemas que tienen memoria caché, también tienen una mejora de rendimiento importante, ya que la memoria caché aprovecha el principio de localidad de referencia. Este principio, indica que si una posición de memoria ha sido referenciada en un instante dado, probablemente las posiciones contiguas, serán referenciadas en los instantes posteriores (localidad espacial), y se debe a que la ejecución de un programa, a no ser que aparezca una instrucción de salto, es secuencial. Por otro lado, también aprovecha el principio de localidad temporal, que indica que si una posición de memoria ha sido referenciada, es muy posible que se referencia próximamente. La localidad temporal, se apoya en que las aplicaciones, tienen bucles, que repiten varias veces la ejecución de un conjunto de instrucciones.
CEDE - C/ Cartagena, 129 - 28002 Madrid Tel.: 91 564 42 94
© C E D E – www.cede.es
Tema 1.68
Profesores de Enseñanza Secundaria INFORMÁTICA
Cuando los datos buscados por el procesador están en la memoria caché, se dice que ha habido un acierto de la caché, y nos permite ahorrar un ciclo de memoria. Sin embargo, cuando el dato buscado no se encuentra en la caché, se dice que ha habido un fallo de caché, y se ha de actualizar la memoria caché. En este caso, se traen de la memoria principal el contenido de las direcciones de memoria que se han referenciado y la de la direcciones contiguas, que probablemente sean referenciadas próximamentente (localidad espacial). Estos datos se traen en bloque, normalmente páginas de memoria. El hecho de tener que traer el contenido de una página de memoria a la memoria caché, obliga a tener que desalojar datos de la memoria caché, que es una sobrecarga importante, pero de esto, se encarga el sistema operativo. El uso de la caché, también plantea problemas como la inconsistencia de datos entre la memoria principal y la memoria caché, que recordemos, tiene una copia de una parte de la memoria principal. Esta situación es algo que se agrava en los sistemas con varios procesadores. Los primeros procesadores que incluyeron memoria caché, fueron los procesadores RISC, que incluían unos cuantos Kbytes de memoria caché. Hoy en día, es normal la inclusión de 6, 8 y 12 Mbytes de memoria caché. La caché suele dividirse en distintos niveles de caché. Así, tenemos caché de nivel 1, de nivel 2 e incluso de nivel 3. En los antiguos procesadores, la caché de nivel más alto, estaba fuera del encapsulado del procesador, pero hoy en día, todos la incluyen dentro del mismo. En los sistemas multicore, la caché de nivel 3, suele estar compartida entre los distintos cores. La caché de niveles inferiores, es más rápida que la de niveles superiores, pero de un tamaño más reducido (ver jerarquía de memoria). ¿Cómo puede ocurrir esto, si todas ellas están dentro del propio procesador? Ocurre porque simplemente la caché de niveles inferiores, al tener menor cantidad de datos, son más fácilmente localizables y accesibles. Por hacer una analogía, es más fácil encontrar a una persona dentro de una habitación, que en un concierto. Se ha dado el caso en que la diferencia entre un procesador de gama alta, se ha diferenciado un procesador de gama baja, sólo por la cantidad de caché que incluían. Ese fue el caso algún procesador Pentium, de gama alta, y el Celeron, de gama baja. 1.3.3.5. DMA. Acceso directo a memoria
Anteriormente se ha comentado que a los periféricos se les podía gestionar mediante un esquema de atención por encuesta, en los que eran consultados por la CPU continuamente para conocer su estado, o por un esquema más avanzado: las interrupciones. Aún así, las interrupciones son insuficientes cuando se han de transferir gran cantidad de datos entre el periférico y la memoria, pensemos, por ejemplo, en la transferencia de datos entre un disco duro y la Memoria Principal. Por ello se desarrolló el acceso directo a memoria (DMA), que permite una comunicación entre el periférico y la Memoria Principal, a alta velocidad, sin apenas intervención de la CPU. Con el DMA, se configura la cantidad de datos a transferir al controlador de DMA y en qué zona de memoria, y se le cede el uso de los buses para que ser realice la transacción.
© C E D E – www.cede.es
CEDE - C/ Cartagena, 129 - 28002 Madrid Tel.: 91 564 42 94
Profesores de Enseñanza Secundaria INFORMÁTICA
Tema 1.69
Cabe destacar que aunque no se necesite la CPU, si se necesitan los buses de comunicación, por lo que puede haber un conflicto por el uso de dichos buses entre la CPU y el DMA. La memoria caché, soluciona en parte este problema, ya que la CPU puede coger los datos de la caché, que contiene una réplica de parte de la Memoria Principal, y el controlador DMA, atacar directamente a la Memoria Principal, pero esto da lugar a otro problema, la coherencia de caché. Ahora, los datos que hay en la caché y en la Memoria Principal, no son los mismos. Este problema puede solucionarse mediante procedimientos hardware, mediante la invalidación de líneas de caché, mediante software, en este caso sería el sistema operativo el que tiene que resolver la mayor parte del sistema. También se puede optar por una solución híbrida. Vemos que, como casi siempre, las técnicas que mejoran el rendimiento, plantean también problemas, que se pueden resolver, pero a costa de hacer los sistemas mucho más complejos. 1.3.3.6. Procesadores superescalares
Estos procesadores, según la taxonomía de Flynn, son de tipo MIMD, es decir, se ejecutan múltiples instrucciones, sobre múltiples datos. Se trata de utilizar no sólo el paralelismo a nivel de instrucción, sino también a nivel de flujo, o lo que es lo mismo, que haya varios flujos de instrucciones ejecutándose de forma paralela, todo ello, gracias a una estructura en pipeline. Un procesador superescalar de grado 4, que además proporcione segmentación a nivel de instrucción, puede tener cuatro instrucciones leyéndose, otras cuatro decodificándose, etc. Para que un procesador sea superescalar, ha de multiplicar las unidades funcionales del sistema, es decir, deber tener varias ALUs, varios decodificadores, etc. Si en un procesador segmentado, las instrucciones de salto son un problema, si además es un procesador superescalar, el problema se multiplica, ya que se puede tener que descartar un mayor número de instrucciones. La diferencia entre un procesador superescalar y un procesador multicore, es que en los superescalares, solo tienen unidades funcionales redundantes, mientras que en los multicore, son varios procesadores. Un procesador multicore, puede ser o no, también un procesador superescalar. 1.3.3.7. GPU (Graphic Processing Unit-Unidad de proceso gráfico)
El mayor grado de integración de los circuitos y razones comerciales, han hecho que se incluyan en el procesador, componentes que tradicionalmente, han sido independientes. La arquitectura que era común hasta ahora, incluye dentro del chipset, un puente norte y un puente sur. El puente norte, se encarga de gestionar los dispositivos que trabajan a alta velocidad, como la memoria y la tarjeta gráfica. Está unida al procesador a través del FSB(Frontal Side Bus). Un esquema como el siguiente:
CEDE - C/ Cartagena, 129 - 28002 Madrid Tel.: 91 564 42 94
© C E D E – www.cede.es
Tema 1.70
Profesores de Enseñanza Secundaria INFORMÁTICA
Sin embargo, la tendencia actual es que el controlador de memoria, y en algunos casos, también la GPU (procesador de gráficos) se incluyan en algunos procesadores. Por tanto, estos procesadores asumen la función que realizan la tarjeta gráfica y también la del chipset, concretamente, parte la función del puente norte, que siempre ha gestionado la memoria y las conexiones con la tarjeta gráfica (buses AGP o PCIx). Ahora el chipset tiene sólo la función de controlar los dispositivos de baja velocidad.
© C E D E – www.cede.es
CEDE - C/ Cartagena, 129 - 28002 Madrid Tel.: 91 564 42 94
Profesores de Enseñanza Secundaria INFORMÁTICA
Tema 1.71
Obviamente, la GPU que se incluye dentro de la CPU, tiene menor potencia que las tarjetas gráficas dedicadas, pero para equipos que requieran poca potencia gráfica, puede ser suficiente. Sin embargo, los fabricantes de tarjetas gráficas, no tienen intención de que la GPU pase a segundo plano dentro del procesador, sino todo lo contrario, se propone otra línea de innovación, consistente en utilizar la GPU de las tarjetas gráficas como apoyo al procesador, es decir, que no sean utilizadas exclusivamente para las aplicaciones gráficas sino también para otras aplicaciones de uso general. Se trata de explotar las ventajas de la GPU frente a la CPU de uso general, utilizando la capacidad de procesamiento paralelo de sus múltiples núcleos. La ejecución de múltiples tareas independientes es para lo que están diseñadas las GPU) Para obtener un buen rendimiento, es necesario que las aplicaciones estén diseñadas para aprovechar utilizar muchos hilos de ejecución independiente.
Diagrama del Intel Core
Actualmente, existen varios supercomputadores basados en GPUs, que tienen rendimiento similar a los supercomputadores basados en otros procesadores, pero con un coste muchas veces inferior. En definitiva, la CPU y la GPU, se influyen mutuamente. Por un lado la GPU se acerca a la CPU en el plano software, de hecho, los fabricantes de tarjetas gráficas ofrecen entornos de desarrollo de aplicaciones para sus productos, por ejemplo CUDA de Nvidia o CAL de AMD/ATI, y por otro lado, las CPUs, se están influenciando a nivel hardware de la GPU, por ejemplo, la microarquitectura Larrabee de Intel o Fusion de AMD, sin contar los procesadores Cell de Sony-Toshiba-IBM presente en las videoconsolas. 1.3.3.8. Buses alta velocidad. QuickPath-Hypertransport
Otro elemento importante a destacar es la eliminación de bus frontal (FSB), que unía la CPU con el chipset (Puente norte) a altas velocidades. Sin embargo, el FSB, trabaja con un ancho de bus relativamente grande, por lo que se ha sustituido por otros tipos de buses, que, a pesar de tener un ancho de bus mucho menor, funcionan a mayor frecuencia, consiguiendo así un ancho de banda mayor. Estos buses, conocidos comercialmente como QuickPath (Intel) o HyperTransport(AMD) y en algunos caso, como el HyperTransport, no solo se utilizan para conectar el procesador con otros elementos funcionales.
CEDE - C/ Cartagena, 129 - 28002 Madrid Tel.: 91 564 42 94
© C E D E – www.cede.es
Tema 1.72
Profesores de Enseñanza Secundaria INFORMÁTICA
1.3.3.9. Virtualización
La virtualización, consiste en la posibilidad de utilización de los mismos recursos hardware , por múltiples sistemas operativos. La virtualización tiene muchas ventajas, sobre todo en cuanto a versatilidad y aprovechamiento de recursos, por ello, los fabricantes de hardware, especialmente en procesadores y chipsets, han añadido soporte a sus productos para facilitarla. AMD proporciona en sus procesadores la extensión AMD-Virtualización (AMD-V) y por su parte, Intel, ofrece la tecnología VT-x. 1.3.3.10. Overclocking dinámico
El overclocking dinámico es una tecnología que permite ajustar la frecuencia de trabajo de los procesadores, así como el número de procesadores que están activos, para adaptarla a la demanda de trabajo que tiene el sistema en cada momento. Para los procesadores de definen una serie de límites, sobre todo en cuanto a frecuencia y temperatura de trabajo, que no deben sobrepasarse, pero mientras no se superen estos límites, la frecuencia de uno o varios núcleos, puede incrementarse para atender picos de trabajo. Es también una forma de ahorrar energía porque se pueden aumentar la frecuencia de trabajo de unos núcleos, y permitir que otros puedan seguir en reposo. Cuando se alcanzan los límites definidos de temperatura, la frecuencia de trabajo se decrementa para volver a situarse dentro de los límites normales de trabajo. Los nombres comerciales utilizados para estas tecnologías, son el TurboBoost de Intel y el TurboCore de AMD, que es una extensión del Cool'n Quiet.
RESUMEN La sociedad actual ha avanzado mucho, en parte, gracias a la gran cantidad de información disponible y que se comparte a través de Internet, por ello, a menudo se le denomina sociedad de la información. Dicha información, ha de estar en formato digital para que pueda ser almacenada e intercambiada entre ordenadores. Si tenemos en cuenta que los sistemas informáticos tienen el mayor potencial para compartir información y que éstos, sólo son capaces de manejar bits, no tenemos más alternativa que codificar toda la información utilizando tan sólo 1 y 0s .En este tema se aborda la codificación de los números, los caracteres y los formatos multimedia tal y como los manipula el ordenador. La codificación numérica se ha llevado a cabo desde los orígenes de los sistemas informáticos, de hecho, se basa en el sistema de numeración binario, sin embargo, para facilitar las operaciones lógicas y matemáticas, se han creado otros códigos como el C1 o el C2. También nos hemos visto en la necesidad de representar con cierta precisión, números cada vez más grandes o extremadamente pequeños y el formato IEEE754, es un estándar ampliamente aceptado ha venido a dar respuesta a esta necesidad. La representación de caracteres , también ha planteado nuevos retos debido a que ahora, la información se comparte globalmente y se debe dar cabida a todos los símbolos de las diversas lenguas
© C E D E – www.cede.es
CEDE - C/ Cartagena, 129 - 28002 Madrid Tel.: 91 564 42 94
Profesores de Enseñanza Secundaria INFORMÁTICA
Tema 1.73
con las que se publica la información, por ello, las normas actuales de codificación de caracteres, admiten gran cantidad de símbolos diferentes. En lo que a la información multimedia se refiere, ha tenido un auge espectacular, y ha supuesto un problema serio para los sistemas informáticos, ya que porque son contenidos que necesitan un gran volumen de volumen de información para ser almacenados (y distribuidos), y los recursos, son limitados. Las imágenes, el audio y el vídeo, son contenidos que normalmente provienen de señales analógicas, así que, necesitamos aplicar un proceso de digitalización para que éstas puedan ser tratadas por los ordenadores. El proceso de conversión de una señal analógica a digital, es un proceso complejo, pero se puede simplificar a un esquema en que se toman muestras de la señal analógicas, que se asocian a un valor concreto dentro de un rango de valores discreto y posteriormente, se codifica este valor con un conjunto de bits. En la actualidad, para reducir el volumen de datos generado, se utilizan métodos de compresión e incluso se descarta la información que no sea apreciable por el ser humano, que es a quien, al fin y al cabo, va dirigido el contenido multimedia. En lo que se refiere a las arquitecturas de los sistemas informáticos, también han evolucionado, debido, entre otras razones, a los avances en el campo de la electrónica con el uso de los semiconductores. Estos avances han permitido incluir millones de circuitos electrónicos en un espacio muy reducido, y con un consumo de energía relativamente bajo. Los sistemas actuales, han tenido como base la arquitectura propuesta por Von Neumann, a la que progresivamente se ha ido añadiendo más elementos y nuevas tecnologías para mejorar su rendimiento. Es bastante común que la inclusión de nuevos elementos que haga aumentar el rendimiento, genere a su vez otros problemas, que han se solucionarse complicando aún más la arquitectura, por ello, las arquitecturas actuales, son realmente complejas. En este tema, se ha descrito una arquitectura que toma como referencia, la Arquitectura de Von Neumann, y se ha explicado el funcionamiento de todos sus elementos, entre los que cabría destacar la Unidad de Control, la Unidad Aritmético-Lógica y la Memoria Principal. En esta arquitectura se ha ejecutado paso a paso un sencillo programa de tan sólo tres instrucciones, pero que es suficiente para mostrar el funcionamiento de los sistemas informáticos a bajo nivel. Una de las mejoras típicas que se solían incluir en los sistemas informáticos, ha sido el aumento de frecuencia de trabajo de sistema, y es que, cuanto más rápido vaya el sistema, más instrucciones ejecuta por segundo. Sin embargo, esta alternativa no está exenta de problemas, ya que a partir de cierta frecuencia, se genera un calentamiento excesivo de los circuitos, y éstos tienen problemas para disiparlo, así que se vuelven inestables. Por la razón anterior, a parte de incluir nuevos elementos como la caché, la FPU o las instrucciones multimedia, se ha optado por trabajar en paralelo, en lugar de seguir aumentando las frecuencias de trabajo. Una forma de hacerlo, es ejecutar varias instrucciones de forma simultánea aprovechando que las instrucciones pasan por diferentes fases, y que estas fases son independientes entre ellas, es lo que se denomina segmentación a nivel de instrucción. La segmentación a
CEDE - C/ Cartagena, 129 - 28002 Madrid Tel.: 91 564 42 94
© C E D E – www.cede.es
Tema 1.74
Profesores de Enseñanza Secundaria INFORMÁTICA
nivel de instrucción, no es la única forma de paralelismo, se pueden incluir también a múltiples de unidades de procesamiento en un mismo encapsulado. Es decir, ahora, dentro de un mismo procesador, hay distintos cores, que pueden llevar la ejecución de hilos de instrucciones independientes. Las unidades de procesamiento gráfico, están también en el punto de mira, ya que, al fin y al cabo, son microprocesadores diseñados para trabajar en paralelo, y que pueden utilizarse, no sólo para las aplicaciones gráficas, sino también para las de propósito general. Los fabricantes de tarjetas gráficas están fomentando el uso de las tarjetas gráficas en este sentido. Por su parte, los fabricantes de procesadores, han sido capaces de incluir las primeras GPU en sus microprocesadores. Si consideramos todos los avances producidos en la tecnología informática y el poco tiempo en el que se está produciendo, podemos decir que es uno de los sectores que avanzan con mayor rapidez, y por ahora, todo apunta a que va a seguir siéndolo porque las innovaciones se suceden una tras otra, y cada vez en menos tiempo.
BIBLIOGRAFÍA COMENTADA Los siguientes libros, tratan en profundidad los sistemas de numeración y codificación, así como la arquitectura de un sistema microinformáticos y avances en las arquitecturas actuales. • STALLINGS, William (2006). Organización y arquitectura de computadores. Prentice Hall. Ed. 7. • FERNÁNDEZ, Gregorio. Conceptos Básicos de Arquitectura y Sistemas Operativos. UPM. • PATTERSON, David A. y HENNESSY, John L. (2011). Estructura y Diseño de Computadores. Ed. Reverté. • CARTER, Nicholas (2004). Arquitectura de Computadores. Editorial McGraw-Hill. • ORTEGA, Julio; ANGUITA, Mancia; PRIETO, Alberto (2005). Arquitectura de Computadores. Ed. Thomson.
El libro siguiente libro, ofrece un simulador ficticio, denominado Simplez, con el que se explica de forma clara y sencilla las fases de ejecución de las instrucciones en un sistema informático. • FERNÁNDEZ, Gregorio. Conceptos Básicos de Arquitectura y Sistemas Operativos.
En cuanto a los bloques funcionales de las arquitecturas actuales, una buena referencia es el siguiente libro: • HERRERÍAS REY, J.E. El PC: Hardware y Componentes. Anaya.
© C E D E – www.cede.es
CEDE - C/ Cartagena, 129 - 28002 Madrid Tel.: 91 564 42 94
Profesores de Enseñanza Secundaria INFORMÁTICA
Tema 1.75
PÁGINAS WEB DE INTERÉS • www.intel.es Página oficial del fabricante del procesadores Intel. • www.amd.es Página oficial del fabricante del procesadores y GPUs, AMD. • http://www.nvidia.com Página oficial del fabricante de GPUs. • www.tomshardware.com/ Página de referencia con completa información en hardware. Interesantes comparativas y artículos sobre las novedades en hardware.
CEDE - C/ Cartagena, 129 - 28002 Madrid Tel.: 91 564 42 94
© C E D E – www.cede.es