Mostrando entradas con la etiqueta ram. Mostrar todas las entradas
Mostrando entradas con la etiqueta ram. Mostrar todas las entradas

martes, 22 de enero de 2008

Los informáticos contamos empezando por 0

A veces tengo que llamar a un servicio técnico que funciona de la siguiente forma: llamo, digo quién soy, qué problema tengo y a continuación me validan una contraseña que nos han asignado. Por seguridad (no es muy recomendable decir la contraseña en voz alta rodeado de gente), en vez de pedirme la contraseña completa, me piden sólo algunas letras o cifras de la misma: "por favor, dígame las posiciones 1, 6 y 7 de su contraseña".

La primera vez que llamé no fui capaz de decirle las letras que me pedía hasta el tercer intento por lo menos. ¿Qué pasó?
Sencillo: estaba contando los caracteres como si estuviese programando, empezando por 0.

Normalmente, procederíamos así a la hora de contar (en la línea de arriba, la palabra, en la de abajo, la numeración o posiciones):
 C | o | n | t | r | a | s | e | ñ | a

 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10

Sin embargo, un programador contará así:
 C | o | n | t | r | a | s | e | ñ | a

 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

Casi todos los lenguajes de programación y sistemas siguen este esquema: empezar a contar desde cero. ¿Por qué se hace de esta forma tan poco intuitiva?
La razón que me parece más sencilla es la siguiente: el número 0 también contiene información.

Cuando utilizamos los números naturales para contar empezamos con el 1 porque el 0 no tiene significado: si no hay nada que contar, no contamos. Si hay algo que contar, empezamos por la unidad: "una manzana, dos manzanas, ..."

Sin embargo en los ordenadores cuando contamos en realidad lo que estamos es enumerando direcciones o posiciones.
Vamos a ver un sencillo ejemplo:

Supongamos que tenemos una ínfima memoria RAM de 8 bytes. Esto quiere decir que sólo disponemos de 8 "huecos", "casillas", posiciones o direcciones de memoria.
Podemos pensar en la memoria RAM como en un montón de buzones de correo apilados.

Si queremos acceder a una de estas direcciones para recuperar el contenido o escribir algo necesitamos saber su dirección. Como sabemos, los ordenadores sólo utilizan ceros y unos para contar, así que con tres bits seremos capaces de direccionar toda la memoria:
000 - 001 - 010 - 011 - 100 - 101 - 110 - 111

Estas ternas de números binarios son en el sistema decimal:
0 - 1 - 2 - 3 - 4 - 5 - 6 - 7

Así que tendremos el buzón 0, el buzón 1, el buzón 2, ... hasta el buzón 7. Total, 8 buzones.
Si nos hubiésemos empeñado en numerar los buzones desde el número 1 no nos hubiesen bastado 3 bits (*), puesto que el número 8 en binario es 1000 (**).

Los mayoría de los lenguajes de programación trata las cadenas de texto de la misma forma. Por ejemplo, el lenguaje PHP (con el cual están programados estos blogs) tiene una función o instrucción para extraer parte de una cadena de texto:
substr('Contraseña', 1, 5) nos proporciona 5 caracteres de la palabra 'Contraseña' a partir de la posición 1, esto es, "ontra".
Como ven, también cuentan desde 0.


Notas

(*) Existe una regla muy sencilla para saber cuántas posiciones podemos abarcar con n bits: 2^n.

  • Con 3 bits podemos contar 2^3 = 8 posiciones, esto es, del 0 al 7.

  • Con 4 bits podemos contar hasta 2^4=16 posiciones (del 0 al 15).


Un ordenador que funcione con 32 bits (los Pentium "clásicos", por ejemplo) podrá direccionar 2^32 = 4.294.967.296 direcciones, es decir, 4 Gigas de memoria. No compre más memoria que esta cantidad para su viejo Pentium. No podrá utilizarla.

(**) A los informáticos también se nos dan muy bien las potencias del número 2. Pregúntenle a un programador "¿cuanto es 2^10?". Seguro que le contesta con bastante rapidez ;-)

martes, 18 de diciembre de 2007

Las tripas de un ordenador

"Tengo que ampliar la RAM", "el disco duro esta lleno", "esta CPU es muy potente", ...

Nuestro lenguaje cotidiano está lleno de tecnicismos y referencias a dispositivos informáticos. ¿Sabemos realmente su significado y cuál es su función?

Hagamos un poco de historia.

Las primeras computadoras electrónicas se empezaron a diseñar y construir en los años 30-40 del siglo XX. Eran artilugios de un tamaño monstruoso que funcionaban a base de válvulas de vacío, condensadores, resistencias y otros componentes electrónicos de uso común.
Sin embargo, pese a su aparente primitivismo, muchas de estas primeras computadoras ya tenían un estructura similar a la que encontramos en los ordenadores actuales: una parte se ocupaba de realizar los cálculos y operaciones lógicas, otro componente estaba especializado en almacenar instrucciones y resultados de los cálculos y, finalmente, otro conjunto de dispositivos se encargaba de recibir datos de entrada y presentar o emitir los datos procesados.

Como decíamos, hoy los ordenadores tienen una estructura muy similar.
Examinemos los más importantes, simplificando bastante y siguiendo un criterio no muy académico.

1. CPU
Son las siglas de "Central Processing Unit" (Unidad Central de Proceso).
Básicamente desempeña varias funciones diferenciadas, asignadas cada una de ellas a un subsistema dentro de la misma CPU.

  • Mantener un mecanismo de sincronización o temporización para todas las operaciones que realiza. El dispositivo más habitual es un generador de pulsos periódicos, comúnmente llamado "reloj".

  • Controlar o gestionar el funcionamiento general de todas las operaciones y procesos que se llevan a cabo.

  • Leer e interpretar las instrucciones que están almacenadas en la memoria.

  • Hacer los cálculos y operaciones lógicas necesarias.

  • Guardar resultados intermedios e instrucciones temporalmente. Estos se almacenan en unas memorias internas de la CPU llamada registros.


Coloquialmente llamamos "CPU" a la caja del ordenador (en modelos de sobremesa), pero esta denominación no es correcta: en la caja realmente se encuentran la CPU, la memoria, los discos duros, la fuente de alimentación y más componentes.
La velocidad de funcionamiento de una CPU se suele medir como la frecuencia del reloj interno (hertzios o múltiplos, del orden de GHz en las CPUs actuales)

2. Memoria principal
También llamada RAM (Random Access Memory, memoria de acceso aleatorio), en referencia a su funcionamiento.
En la memoria principal se almacenan datos e instrucciones. Para entendernos: en la memoria en un momento dado está cargado tanto el programa que estamos ejecutando (por ejemplo, el procesador de textos) como los datos que maneja el programa (el texto que estamos escribiendo).
La memoria principal suele ser volátil, esto es, si se apaga el ordenador, su contenido se pierde. Por esta razón se necesita algún dispositivo de almacenamiento permanente, para guardar los programas que necesitamos para trabajar y los datos con los que trabajamos.
Actualmente la memoria principal en ordenadores personales suele ser de cientos de Mb a algunos Gb [*]

3. Memoria auxiliar o secundaria.
Son los dispositivos en los que la información se guarda de forma más o menos permanente (discos duros, CDs, DVDs, memorias externas -USB y similares-, etc)
Son más lentos que la memoria principal y por esta razón cuando arrancamos un programa (el navegador, por ejemplo), primero se lee del disco duro y se transfiere el programa a la memoria principal. La CPU entonces accede a la memoria principal y "lee" las instrucciones que debe llevar a cabo.
La capacidad de almacenamiento en los discos duros actuales está comprendida entre decenas y centenas de Gb.

A veces el conjunto de instrucciones de un programa es demasiado grande y no cabe en la memoria. En este caso, sólo se carga parte del programa en la memoria principal. Cuando se necesitan más instrucciones, se leen del disco duro. Este último acceso es menos rápido, por lo que, si este acceso al disco duro es muy frecuente, tendremos la sensación subjetiva de que "el ordenador va lento".

4. Dispositivos de entrada y salida
Monitores, teclados, ratones, escáneres, impresoras, ... Todos son dispositivos que permiten introducir y/o recuperar información en el ordenador e interactuar con las personas que los utilizan.

Podemos generalizar y decir que las unidades funcionales de un ordenador mantienen una jerarquía, y que, cuanto más "abajo" en esta jerarquía, mayor lentitud de funcionamiento.

El componente más rápido es la CPU, seguido de la memoria principal, la memoria auxiliar y los dispositivos de entrada-salida. El "componente" más lento somos nosotras, las personas.

(*) En próximas entradas hablaremos de hertzios, megas, gigas y demás unidades.

Para saber más