Beruflich Dokumente
Kultur Dokumente
1 Conceptos Previos
La informática es la ciencia que estudia el procesamiento automático de la información.
Para llevar a cabo ese procesamiento se utiliza el computador, que es una máquina, generalmente
electrónica, que procesa información siguiendo las instrucciones de un programa.
Los computadores pueden manejar grandes volúmenes de datos y realizar gran número de
operaciones en un corto espacio de tiempo.
Los computadores suelen ser de propósito general. Es decir, el mismo computador puede utilizarse
para realizar diferentes tareas (p.e. crear un documento de texto, servir páginas web, hacer cálculos
matemáticos etc... ). Pueden existir computadores de propósito específico (p.e. el computador que
gobierna una lavadora, un vehículo, etc...), pero incluso estos computadores de fin específico,
podrían realizar tareas radicalmente distintas con sólo cambiar las instrucciones de los programas
que ejecutan.
Para entender qué es un programa habría que definir primero algoritmo. Un algoritmo es la
descripción precisa de los pasos que permiten resolver un determinado problema. Por ejemplo, los
pasos a seguir para calcular quién es el alumno que ha sacado la nota más elevada en un examen
(supuesto que el computador ya contiene la lista de alumnos con el nombre y nota de cada uno)
podrían codificarse mediante el siguiente algoritmo:
Como se puede observar contiene 7 pasos, cada uno de ellos es lo suficientemente preciso, como
para que sea improbable que dos personas los entiendan de forma diferente.
Un programa es la codificación de un algoritmo mediante un lenguaje de programación. El
algoritmo de la ilustración anterior, está codificado en el lenguaje que utilizamos cotidianamente, al
que nos referiremos a partir de ahora como lenguaje natural. Pero los computadores, al menos a
fecha de hoy, no entienden el lenguaje natural. Por tanto, es necesario codificar las instrucciones de
los algoritmos en un lenguaje que sí entiendan. Existen muchos lenguajes de este último tipo, y se
conocen como lenguajes de programación.
Un lenguaje de programación, por tanto, es un conjunto de instrucciones y reglas sintácticas que
permiten codificar un programa de forma inteligible para el computador.
En la Ilustración 2 se puede ver el mismo algoritmo de la ilustración anterior ya codificado en un
determinado lenguaje de programación. Cada elemento en el código no es casual, sino que se rige
por las reglas sintácticas de ese lenguaje. Por ejemplo, se ve que todas las llaves abiertas "{" tienen
una correspondiente llave cerrada "}". Cada linea representa una instrucción, en algunas hay
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<TITLE>Ejemplo alumno con la nota maxima</TITLE>
</head>
<body>
<script language="javascript" type="text/javascript">
var notaMaxima=-1;
var alumnoMaximo="";
document.write("Solución: "+alumnoMaximo);
</script>
</body>
</html>
Los lenguajes de programación puedes ser más fáciles entender por el programador (por un
humano) y entonces se dice que es un lenguaje de alto nivel, o más difíciles de entender por un
humano, y entonces se habla de lenguajes de bajo nivel.
El lenguaje de más bajo nivel, es el llamado lenguaje máquina. El lenguaje máquina se caracteriza
porque sólo utiliza ceros y unos en su codificación, que se corresponden con dos estados que
pueden tener distintos componentes físicos del computador. Por ejemplo, por un conductor puede
pasar -o no- corriente eléctrica, o un CD puede tener -o no- una cavidad en un determinada
posición, o un disco puede tener magnetismo remanente en uno u otro sentido en una posición del
mismo, o una de las obsoletas tarjetas perforadas, puede tener -o no- una posición perforada. Cada
uno de esos dos estados puede ser representarse mediante un 1 y un 0 respectivamente (o
viceversa).
Los computadores modernos están basados en millones de estos componentes que pueden tomar
dos estados posibles, y el lenguaje máquina de un determinado computador (cada computador
-2-
2 Representación de la Información
Un computador sólo es capaz de entender de forma “directa” información que le viene codificada
de forma binaria (i.e. a través de ceros y unos). Cada uno de estos ceros o unos se conocen como
bits. Una cifra o ristra binaria compuesta por 8 ceros y/o unos se conoce como byte. En un
computador la información binaria siempre ocupa un determinado número de bytes, o lo que es lo
mismo, todas las cifras o ristras binarias tienen una longitud en bits, que es múltiplo de 8.
Los datos que procesa un computador pueden ser de distintos tipos: numéricos y cadenas de
caracteres entre otros. Las cadenas de caracteres sirven para representar texto. Los datos numéricos
pueden a su vez ser de distintos tipos: enteros sin signo, enteros con signo y números reales
típicamente. A su vez cada uno de estos tipos puede ser representado en binario de distintas formas
o codificaciones.
Nos pueden plantear el problema inverso: dado un número en decimal pasarlo a una determinada
base B. Supongamos el número 97 en decimal que queremos representarlo en base 5. El
procedimiento que se sigue en ese caso es el de divisiones sucesivas por la base:
-3-
Ilustración 3: Paso del número 97 a base 5 por el método de las divisiones sucesivas.
Como muestra la figura, se va dividiendo el número por la base a la que queremos pasarlo,
repitiendo la misma operación con el cociente así obtenido. Y eso lo hacemos hasta que lleguemos a
un cociente menor que la base (en el ejemplo hemos parado porque el cociente 3 es menor que 5).
Después, se toma el último cociente: 3, y se concatenan los restos de las divisiones desde abajo
hacia arriba: 4 y 2 (ver flechas de la ilustración). Por tanto, 342 en base 5 es lo mismo que 97 en
base 10.
Esto es fácil de ver, ya que las divisiones sucesivas lo que realmente nos dicen es que
97 = 5*19 + 2 = 5*( 5*3 + 4) + 2 = 5*5*3 + 5*4 + 2 = 3*52+4*51+2*50=97
Ahora utilizaremos estos dos conceptos para representar un número en las bases 2, 8 y 16, muy
utilizadas en el ámbito de los computadores.
-4-
157 2
1 78 2
0 39 2
1 19 2
1 9 2
1 4 2
0 2 2
0 1
Ilustración 4: Paso del número 157 a base 2 por el método de las divisiones sucesivas.
-5-
-6-
-7-
Tabla 3: Cifras binarias para un entero con signo y magnitud de longitud 1 byte.
Intuitivamente, lo que ha pasado es que se han destinado la mitad de las cifras (las que empiezan
por uno) a representar a los números negativos, y la otra mitad (los que empiezan por cero) a
representar los números positivos.
El número negativo más pequeño que se pude representar utilizando n cifras es – (2n-1-1). 2n-1 es
precisamente la mitad de 2n, y el -1, igual que antes es porque empezamos a contar desde cero en
lugar de desde uno.
De la misma manera, el número positivo más grande que se pude representar utilizando n cifras es
(2n-1-1). 2n-1 es la mitad de 2n, y el -1, nuevamente es porque empezamos a contar desde cero en
lugar de desde uno.
La representación son signo y magnitud presenta dos problemas:
1. Hacer restas entre números binarios requiere un algoritmo distinto que para las sumas, por lo
que para cada cosa se necesitan circuitos electrónicos diferentes.
2. Como se aprecia el número cero tiene dos representaciones posibles, por lo que no sólo se
desperdicia una cifra que podía valer para representar otro número, sino que además a la
hora de hacer operaciones se vuelven más complicadas porque hay que tener en cuenta este
hecho.
Por ello, aparece la representación binaria con signo conocida como complemento a 1. En esta
representación el bit más significativo sigue representando el signo ( 0 positivo, 1 negativo), y la
magnitud esta codificada de manera que los ceros se han sustituido por unos y viceversa. Por
ejemplo:
1. El número de un byte 0010 0101 es un número positivo porque el primer bit es un cero, por
lo tanto la magnitud viene dada por los siete bits restantes 010 0101 que representan el
número decimal 32+4+1=37.
2. Sin embargo, el número de un byte 1010 0101 es un número negativo porque empieza por 1,
para saber de qué número en decimal se trata hay que sustituir los ceros por unos y
viceversa, en el ejemplo se obtendría 0101 1010. Ese número binario en decimal es
-8-
64+16+8+2 = 90, por lo tanto se trata del “-90” en decimal.
La siguiente tabla muestra para números de longitud de 1 byte el rango posible de enteros a
representar en codificación complemento a 1.
Binario Significado Decimal Rango
6 5 4 3 2 1 0
1000 0000 -111 1111(binario)=(1*2 +1*2 +1*2 +1*2 +1*2 +1*2 +1*2 ) -127 -127 = - (27-1)
1000 0001 -111 1110(binario)=-(1*26+1*25+1*24+1*23+1*22+1*21+0*20) -126
1000 0010 -111 1101(binario)=-(1*26+1*25+1*24+1*23+1*22+0*21+1*20) -125
…....................................
1111 1110 -000 0001(b=-(0*26+0*25+0*24+0*23+0*22+0*21+1*20) -1
1111 1111 -000 0000(b=-(0*26+0*25+0*24+0*23+0*22+0*21+0*20) 0
0000 0000 +(0*26+0*25+0*24+0*23+0*22+0*21+0*20) 0
6 5 4 3 2 1 0
0000 0001 +(0*2 +0*2 +0*2 +0*2 +0*2 +0*2 +1*2 ) 1
….......................................
0111 1101 +(1*26+1*25+1*24+1*23+1*22+0*21+1*20) 125
6 5 4 3 2 1 0
0111 1110 +(1*2 +1*2 +1*2 +1*2 +1*2 +1*2 +0*2 ) 126
0111 1111 +(1*26+1*25+1*24+1*23+1*22+1*21+1*20) 127 127 = + (27-1)
0 0 0 0111011 1
+00001110
00011001
donde los unos en superíndice indican el acarreo (por ejemplo: 1+1 = 10(b se pone un cero por
debajo de la raya horizontal, y el 1 es el acarreo o “las que me llevo”).
Si hacemos 11 – 14 basta también con sumar el 11 al “-14”, es decir 0000 1011(b + 1111 0001(b
0 0 0 0 1 01111
+11110001
11111100
El resultado 1111 1100, al cambiar los ceros por unos es 0000 0011, es decir 3, por tanto menos 3,
que efectivamente es el resultado de hacer 11 – 14. En general cuando el resultado de la resta es
negativo basta sumar ambos números como hemos visto en este ejemplo, pero la cosa cambia
cuando el resultado es positivo.
Si hacemos 14 – 11 al sumar el 14 con el “-11”, es decir 0000 1110(b + 1111 0100(b :
-9-
Es decir 2, cuando tenía que haber dado 3. En general, cuando el resultado de la resta es positivo,
nos sale una unidad menos de la que tenía que salir. Esto nos lleva a otra representación binaria que
soluciona este problema: el complemento a 2.
Para representar un número negativo en complemento a 2, primero lo representamos en
complemento a 1, y a continuación se le suma 1. Por ejemplo, el número 0010 0101 igual que en
casos anteriores es positivo por empezar por cero, y los otros siete dígitos 010 0101 codifican el
número decimal 37.
Pero 1010 0101 es un número negativo por empezar por uno, luego para saber de qué número se
trata tenemos que tener en cuenta que se le ha sumado 1, por tanto buscamos el número
inmediatamente anterior: 1010 0100 y en ese número hacemos el cambio de ceros por unos: 0101
1011 que en decimal es 64+16+8+2+1=91, por tanto es el -91.
Si hacemos la tabla que representa todos los números posibles en complemento a 2 para una
longitud de un byte tenemos:
Binario Significado Decimal Rango
1000 0000 0111 1111(complemento a 1)=-1000 0000(b=-1*27 -128 -128 = - 27
1000 0001 1000 0000(c1=-0111 1111(b -127
1000 0010 1000 0001(c1=-0111 1110(b -126
…....................................
1111 1110 1111 1101(c1=-0000 0010(b -2
1111 1111 1111 1110(c1=-0000 0001(b -1
0000 0000 +(0*26+0*25+0*24+0*23+0*22+0*21+0*20) 0
6 5 4 3 2 1 0
0000 0001 +(0*2 +0*2 +0*2 +0*2 +0*2 +0*2 +1*2 ) 1
….......................................
0111 1101 +(1*26+1*25+1*24+1*23+1*22+0*21+1*20) 125
6 5 4 3 2 1 0
0111 1110 +(1*2 +1*2 +1*2 +1*2 +1*2 +1*2 +0*2 ) 126
0111 1111 +(1*26+1*25+1*24+1*23+1*22+1*21+1*20) 127 127 = + (27-1)
-10-
01010101111 1 0
+11110101
100000011
El uno más significativo se pierde, por ser el límite de la longitud de palabra 8 bits (sería el noveno
bit...) por lo que efectivamente el resultado es 0000 0011, es decir 3 en decimal.
Otras posibles representaciones para los enteros son la representación sesgada y la BDC, en los que
las operaciones no son tan simples como en el complemento a 2.
-11-
-12-
2.6 Representación del texto o cadenas de caracteres
Un carácter es un símbolo cualquiera, lo que incluye a:
• Las letras, tanto en mayúsculas como en minúsculas.
• Los propios dígitos decimales.
• Los signos de puntuación ( puntos, comas, puntos y coma, etc.)
• Y caracteres de control, los cuales no se visualizan en la pantalla o en el papel de la
impresora, pero tienen una finalidad concreta, como son: el carácter que indica que finaliza
una línea, o el que indica que finaliza un fichero, o el que indica un tabulador etc.
-13-
2.6.2 Unicode
Unicode es otro estándar de codificación de caracteres que se publica a principios de los 90.
Persigue dar cabida en un mismo código estándar a otras alfabetizaciones además de la latina, como
por ejemplo árabe, hebreo, caracteres asiáticos e incluso ideogramas de algunas cultura indígenas,
de manera que con Unicode es posible tener texto en el que aparezcan caracteres de todos estos
alfabetos. Esto no es posible con los códigos ASCII extendidos, pues cada página de código sólo
cubre algunos alfabetos pero no tantos como Unicode.
Unicode permite representar más de cientos de miles de caracteres de distintos alfabetos. Tiene en
cuenta cuestiones como el orden lexicográfico para hacer ordenaciones de las palabras (evitando
por ejemplo que la ñ quede detrás de la z), visualización de derecha a izquierda, para idiomas como
el árabe o el hebreo que lo requieren, y representación de ideogramas (típicamente para alfabetos
orientales basados en el chino).
En terminología unicode cada carácter se conoce como un code point, el cual tiene un número y
nombre asociado. Los code points se agrupan en planes. Actualmente hay 17 planos, que se
numeran del 00 al 10 (en hexadecimal) y cada uno de ellos tiene 216 (65.536) code points. El plano
00 es el más utilizado y se conoce como BMP o Basic Multilingual Plane, y contiene básicamente
los caracteres de todas las lenguas modernas, por lo que la mayoría de los code points del BMP son
caracteres del chino y otros idiomas basados en el chino (el chino es un lenguaje con miles de
caracteres), pero también da cabida a los alfabetos latinos. Existen, por tanto en la actualidad otros
16 planos (en el futuro podría haber más) que se utilizan para lenguas de la antigüedad, símbolos
matemáticos, símbolos musicales, lenguajes poco comunes etc. y también hay planos reservados
para usos futuros.
Aunque cada carácter tiene asociado ese numerito llamado code point, es posible hacer una
representación comprimida de los code points utilizando lo que se conoce como UTF o Formato de
Transformación de Unicode.
-14-
-15-
-16-
1) si las 2 a la vez son distintas.
A B A XOR B
0 0 0
0 1 1
1 0 1
1 1 0
A XOR B, puede reformularse como (NOT A AND B) OR ( A AND NOT B). Esta propiedad y
otras (como por ejemplo las Leyes de Morgan) las verás en otras asignaturas.
Las operaciones lógicas pueden extenderse para ristras de bits, de manera que se va aplicando
posición a posición, si fuese una operación que requiere dos ristras se aplica entre los 2 bits que
están en la misma posición. Por ejemplo:
• NOT 11001100 = 00110011
• 00110011 OR 10101010 = 10111011
• 00110011 AND 10101010 = 00100010
• 00110011 XOR 10101010 = 10011001
Aunque ahora no te lo parezca estas operaciones tienen gran utilidad.
4 Maquinas de Turing
(Conferencia por el profesor César García Osorio).
-17-
d,i d
c Salida (S)
Entrada (E) Memoria Externa (ME)
d,i c
c
e e i d
e e Procesador (CPU)
Unidades Centrales
-18-
A2 D4
8 9 10 11
73 20 05 33 D5
A3
12 13 14 15 D6
65 12 A1 B3 D7
w/r
Ilustración 7: Esquema de funcionamiento de la memoria interna.
Gracias a que no hay dos direcciones de memoria iguales en un computador, es posible leer o
escribir el contenido (la palabra) de una dirección de memoria determinada especificando el valor
de la dirección de memoria a la que se quiere acceder.
En la Ilustración 7 vemos como se podría producir estas dos operaciones en una memoria de
ejemplo con 16 posiciones o direcciones, numeradas del 0 al 15 (están numeradas en decimal, ver
las esquinitas de cada celda). El contenido de cada dirección de memoria se ha representado en
hexadecimal. Así en la dirección 8 vemos que el contenido es 73.
Dos dígitos hexadecimales en binario ocupan 8 bits, por lo que vemos que todas las direcciones
contienen almacenados 8 bits. Esos 8 bits de cada celda, son por lo tanto las palabras de memoria, y
8 bits (o 1 bytes) es la longitud de las palabras de memoria, que se puede observar que es siempre 8
en todas las direcciones, pues incluso en la celda 10, aunque contiene un 5=0101, relamente lo que
contiene es un 05=0000 0101 que efectivamente ocupa 8 bits.
-19-
-20-
Bits Bytes
10 7
1 KBit 2 bits 2 bytes
-21-
2m ≥ n
Por lo que tomando logaritmos en ambos lados de la inecuación:
m ≥ lg2 n
Por tanto, para direccionar n palabras, necesitamos que las direcciones de memoria sean al menos
de longitud lg2 n bits. En la siguiente tabla se ven algunos ejemplos de longitud de dirección
mínima para algunas capacidades medidas en longitud de palabra.
Capacidad de la memoria en palabras Longitud mínima de las direcciones de
memoria en número de bits
1 Kpalabra 10 bits
1 Megapalabra 20 bits
1 Gigapalabra 30 bits
1 Terapalabra 40 bits
Tabla 8: Longitud mínima de las direcciones de memoria para distintos tamaños de la misma.
En la actualidad, los ordenadores personales están haciendo al transicción entre 32 y 64 bits para
direccionamiento. Esto significa que los ordenadores de 32 bits sólo podían direccionar a lo
máximo 2 Gigapalabras, mientras que los de 64, podría direcciónar 224 Terapalabras (24+40=64).
Operación
ALU
Resultado
(8 bits)
Ilustración 8: Ejemplo de Unidad Aritmético-Lógica.
Supongamos una ALU muy simple como la de la ilustración. La llegan 2 operandos de 8 bits, a
traves de sendos grupos de 8 conexiones, y devuelve un resultado a través de otro grupos de 8
conexiones. Se supone, que en este caso, la longitud de palabra de memoria también será 8, pues los
operandos podrían haberse leído de memoria, y a su vez el resultado podría escribisrse en memoria;
por lo que se hace necesario que los tamaños de palabra de memoria, operandos y resultado
coincidan.
Para indicarle a la ALU qué operación ha de realizar habrá una seria de conexiones, como por
-22-
Donde por ejemplo los 4 primeros bits son el código de operación, los 6 siguientes representan al
primer operando y los 6 siguientes al segundo. Por ejemplo, supongamos que se trata de la
operación suma y que está codificada con el código de operación 0110. La unidad de control conoce
que lo que le pide la instrucción es una suma y no es una resta, porque la resta tendrá otro código de
operación distinto. Al recibir ese código de operación la unidad de control sabrá que tiene que leer
esos operandos (quizás de unos registros, aunque existen más posibilidades que ahora no vamos a
detallar), y depositar el resultado quizás en la posición del segundo operando.
En este caso el operando 1 podría saber que está en un registro porque esa máquina entiende que
-23-
-24-
etiquetadas como e son las señales de estado siguen el camino inverso y sirven de indicadores a la
unidad de control de que las operaciones realizadas han dado o no algún problema, situación o
circunstancia especial. Por ejemplo, la ALU debería de indicar de alguna forma a la unidad de
control que una operación ha dado lugar a un resultado con más dígitos de los permitidos (i.e. un
desbordamiento u overflow).
La unidad de control también manda señales de control y recibe señales de estado de los periféricos.
Normalmente es la unidad de control la que a través de señales de control ordena hacer operaciones
a los periféricos, pero puede darse el caso de que sea el periférico el que solicite la atención de la
unidad de control, mandándole una señal. Estas señales de los periféricos hacia la unidad de control
se conocen como interrupciones. El nombre viene de que la unidad de control tiene que dejar de
realizar el programa en curso, para atender la petición del correspondiente periférico. Por ejemplo,
un periférico puede decir a la unidad de control “dame más datos de memoria que ya he acabado de
imprimir o de grabar los que me mandaste antes”.
La unidad de control y la ALU forman la CPU2 (Central Process Unit) y en los computadores
modernos vienen juntas en un único componente, que es el microprocesador.
5.5 Buses
Son conexiones que transmiten información sobre instrucciones, datos y direcciones de memoria
entre las distintas unidades del computador. En la Ilustración 6 se corresponden con las conexiones
etiquetadas con d e i (datos e instrucciones).
Una de las formas que hay de clasificar la transmisión digital de la información es distinguir entre
comunicaciones en serie y en paralelo. En las comunicaciones en serie la información se transmite
de manera que en cada instante el emisor sólo envía al receptor un bit; mientras que en la
comunicación en paralelo existen n conexiones entre el emisor y el receptor, lo que permite enviar
la información de n en n bits. Los buses utilizan la comunicación en paralelo, el número de bits que
puede trasmitir simultáneamente un bus se conoce como anchura del bus.
2 En un abuso del lenguaje actualmente el término CPU también es usado de forma incorrecta para designar la carcasa
de un PC junto con todo lo que contiene. Esta denominación errónea no debe de confundirnos.
-25-
Memoria
Ilustración 9: Interconexión de la UC utilizando un bus separado para memoria y otro para los
periféricos.
Aparentemente, el problema parece resuelto, pues los datos pueden circular entre memoria y
periféricos, sin que tengan que pasar entre medias por la CPU. Sin embargo, en el modelo unibús la
CPU es la encargada de controlar el tráfico por el bus. Si se necesita una transferencia de datos en la
que intervenga un periférico o la memoria, la CPU deberá de indicar al bus cual es el origen y
destino de la comunicación, prohibiendo al resto de elementos conectados al bus, que lo utilicen en
esos momentos.
La lentitud de los periféricos, puede hacer que el tiempo en el que el bus quede bloqueado sea
-26-
Canal 0 Canal 1
-27-
Bus E/S
Caché Memoria Adaptador Bus
Sin embargo, a pesar de todas estas mejoras, cuando hay un intercambio de información entre la
memoria y un periférico, nos sigue pasando lo mismo que la arquitectura inicial de la Ilustración 9:
la información en ese caso en algún momento tiene que pasar por la CPU, ocupando registros y
tiempo de CPU.
Para resolver este problema aparecen los controladores DMA (Direct Memory Access) o
controladores de acceso directo a memoria, que se trata de un procesador especializado que
permite la transferencia directa de datos memoria-periférico.
-28-
Per. 00 Per. 01 Per. 0n Per. 10 Per. 11 Per. 1n
Bus E/S
Caché DMA Memoria
Ilustración 13: Arquitectura con controladoras E/S, bus dedicado de E/S y dispositivo DMA.
Una operación de E/S que involucrara a la memoria y a un periférico, ahora con DMA sería de la
siguiente forma:
1. La CPU inicia la operación transmitiendo la siguiente información a la controladora DMA:
1. Tamaño del bloque de datos
2. Dirección en la que se encuentran los datos en la unidad origen
3. Dirección en la que se encuentran los datos en la unidad destino
4. Sentido de la transferencia (lectura o escritura)
2. A partir de ese momento la CPU cede el control del bus del sistema al controlador DMA, y
se dedica a otras tareas.
3. Cuando finaliza la transferencia:
1. El controlador DMA manda una interrupción a la CPU indicando que ya ha acabado.
2. La CPU vuelve a hacerse con el control de bus del sistema.
-29-
-30-