0% found this document useful (0 votes)
79 views

Variables

This document discusses variables in programming and how they are stored in computer memory. A variable is a piece of data stored at a memory address in RAM. Variables can be numbers, strings, or expressions and are accessed by their name. The memory addresses of variables are made up of segments and offsets. Various commands like PRINT are used to output the values of variables.

Uploaded by

Ernest Barrera
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
79 views

Variables

This document discusses variables in programming and how they are stored in computer memory. A variable is a piece of data stored at a memory address in RAM. Variables can be numbers, strings, or expressions and are accessed by their name. The memory addresses of variables are made up of segments and offsets. Various commands like PRINT are used to output the values of variables.

Uploaded by

Ernest Barrera
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 27

Variables

This chapter discusses an important topic in programming, "variables." Please read this section thoroughly. A variable is a piece of data kept in the computer's memory (RAM). The location of a variable in RAM is called the "address."

How a variable is stored in RAM The following program prints the variable X to the screen: print X Since the variable hasn't been assigned a number, the value of the variable is 0. So, the output of the program is: 0 This next program sets X to 15, and then prints the variable: X = 15 print X This time, the output is: 15 In the above example, the number 15 was stored in the computer's RAM at a certain memory address. Then the PRINT command accessed (or looked at) that address when it printed "15" to the screen.

(NOTE: The memory address of X is not necessarily 1000000)

ADVANCED TIP: Although you don't normally need to, you can find the actual memory address of a variable (X, for example) by using the VARSEG and VARPTR commands. PRINT (VARSEG(X) * 65536) + VARPTR(X) (For more information, see Memory.)

As in the programs above, a variable is accessed by calling its name. Variable names can have a combination of letters and numbers. The following are valid variables: Y num VALUE xYz abc123

Also, you can use multiple variables in your program. X = 82 Y = 101 Z = 79 PRINT X PRINT Y PRINT Z Output: 82 101 79

(NOTE: The memory addresses of these variables are not necessarily as specified)

Expressions If you pass an expression to a variable, the expression is evaluated and the variable is set to that value. x = 500 + (10 * 7) PRINT x Output: 570 You can also use variables as expressions. rate = 50 time = 2 distance = rate * time PRINT distance Output: 100 Plus, you can have both variables and numbers in an expression. X = 100 Y = X * 7 PRINT Y Output: 700 TIP: The following increases X by 1: X = X + 1

Strings

If you add a dollar sign ($) to the end of a variable, the variable is a string. X$ = "Hello World!" PRINT X$ Output: Hello World! If you try to set a string to a non-string variable, an error occurs. X = "Hello World!" The QBasic interpreter says "Type mismatch" when

you

try

to

run

the

above

program.

A string can be added to the end of an existing variable string. X$ = "Hello" X$ = X$ + "World" PRINT X$ Output: HelloWorld You can also add variable strings together. a$ = "String1" b$ = "String2" c$ = "String3" d$ = a$ + b$ + c$ PRINT d$ Output: String1String2String3 Memory

(Before

you

study

this

chapter,

you

may

need

to

read

chapter

18,

Numbering

systems.)

Bits A "bit" is the smallest piece of data stored in your computer's memory. The value of a bit can be either 0 or 1. All data in your computer has a certain number of bits.

Bytes A "byte" is 8 bits, and can have a value between 0 and 255 (or, in binary, between 0 and 11111111). A character, such as Q, takes up one byte of memory. This is because there are 256 different characters. (If you don't fully understand bits and bytes, don't worry about it.)

How

data

is

stored

Data is stored in RAM at a certain memory address, as explained in chapter 3 (Variables). Each address takes up 1 byte of memory. Therefore, it can only have a value between 0 and 255. A memory address (on a 32-bit computer) can be somewhere between 0 and 4,294,967,295. In hexadecimal, this is between 0 and FFFFFFFF. Each memory address is divided into two parts: segments and offsets. See the figure below.

Segments and offsets

A memory address such as 12345678 (in hexadecimal) has a segment of 1234 and an offset of 5678. A segment can have a value between 0 and 65535 (or between 0 and FFFF). An offset can be within the same range. You can find out a memory address of a piece of data by multiplying its segment by 65536 (or 10000, in hexadecimal) and then adding its offset to the result. In QBasic, you can get a variable's segment by using VARSEG and its offset by using VARPTR. segment = VARSEG(x) offset = VARPTR(x) ' This prints the memory address of "x" (in decimal): PRINT (segment * 65536) + offset

Algunos tiles de Unix Comandos del sistema y herramientas Lo que decimos aqu es mnima, y una serie de otras herramientas] slo una sugerencia que usted busca ms informacin con el hombre.

Aqu estn algunas herramientas para los usuarios con privilegios: tcpdump , pathchar y Sniffit da y Ethereal sniffers. Aqu van algunas indicaciones de seguridad del sistema: CIAC: Red de Herramientas de Seguridad

Unix host y herramientas de seguridad de red Mat Unix Seguridad

ps : muestra el estado del proceso actual Para una lista de todos sus procesos, escriba: ps A la lista de todos los procesos, escriba: ps aux uname : muestra informacin sobre el sistema operativo uname [-amnrsv] -A Muestra toda la informacin especificada en el m-,-n,-r,-s, y vopciones. -M Muestra el tipo de hardware que utilicen el sistema. -N Muestra el nombre del nodo (esto puede ser un nombre que el sistema est conocido por una red de comunicaciones). -R Muestra el nmero de versin del sistema operativo. -S Muestra el nombre de la aplicacin del sistema operativo. opcin est activada de forma predeterminada.) -V Muestra la versin del sistema operativo. (Este

matar : enva una seal a un proceso en ejecucin Para matar un proceso con identificador de proceso 21234 $ kill-KILL 21234 Para detener un proceso con identificador de proceso 21234 $ kill-STOP 21234 Para reanudar un proceso detenido con identificador de proceso 21234 $ kill-CONT 21234 cuerdas : Busca cadenas en un archivo ASCII o binario Se utiliza con archivos de texto que no, como objeto y archivos ejecutables, imprime todos los oconsisting cadenas de al menos 4 caracteres imprimibles consecutivos en el archivo. cadenas [-ao] [-n cantidad] [archivo ...] -Bsquedas un archivo de un objeto completo, en lugar de slo los datos inicializados el espacio. -N nmero Establece la predeterminado de 4. longitud mnima de la cadena a un nmero ms que el valor

-O Precede cada cadena por su desplazamiento (en octal) en el archivo. archivo : determinar el tipo de un archivo archivo nombre de archivo Determina qu tipo de nombre de archivo es, si es binaria, de texto, si el archivo objeto, si la fuente en Java ..

strace : imprimir informacin sobre el sistema de llamadas realizadas y recibidas las seales por un programa strace comando Se ejecuta el comando imprimir informacin sobre todas las llamadas al sistema que hace y seales que recibe. Con calificativos se puede obtener tambin informacin sobre el tiempo en las convocatorias y entre las llamadas. Por ejemplo strace-c a.out imprime la informacin y las estadsticas de tiempo para el programa a.out ipcs : muestra la comunicacin entre procesos (IPC) instalacin de estado ipcs [-a |-bcopt] [-mq] donde -A. Lo mismo que especificar la opcin-b,-c, o-, p-y-t opciones B-Escribe el nmero mximo de bytes en las colas de mensajes, el tamao de los segmentos mentos para la memoria compartida, y el nmero de semforos en cada semforo conjunto. C-Escribe el nombre de usuario y grupo del usuario que realiz la instalacin. -M Escribe informacin sobre activos segmentos de memoria compartida. -O escribe la informacin de uso: Nmero de mensajes en cola Nmero total de bytes en las colas de mensajes Nmero de procesos asociados a los segmentos de memoria compartida P-Escribe el nmero de proceso de proceso de conectar o desconectar el segmentos de memoria compartida -Q Escribe informacin sobre colas de mensajes activos. -S Escribe informacin acerca del conjunto de semforos activos. -T escribe lo siguiente: Momento de la operacin de control de pasado que cambi el permiso de accesones para todas las instalaciones Momento de la ltima llamada a msgsnd () y msgrcv last () en las colas de mensajes Momento de la ltima semop () en el semforo conjuntos ipcrm : elimina los identificadores de la cola de mensajes, un conjunto de semforos, o de memoria compartida ipcrm [-m shared_memory] [-M shared_memory_key] [-q message_queue] [-Q message_key] [-s semaphore_ID] [-S semaphore_key] donde: -M shared_memory Elimina la memoria compartida identificador shared_memory. La memoria compartida estructura del segmento y los datos asociados con shared_memory tambin eliminado despus de la ltima operacin de separacin. -M shared_memory_key Elimina el identificador de memoria compartida, creada con la clave shared_memory_key. El segmento de memoria compartida y la estructura de datos asoated con ella tambin se eliminan despus de la ltima separacin. -Q message_queue

Elimina la cola de mensajes message_queue identificador y el mensaje estructura de la cola y los datos asociados con l. -Q message_key Elimina el identificador de la cola de mensajes, creada con la clave message_key, y la cola de mensajes y la estructura de los datos asociados con l. -S semaphore_ID Elimina el identificador semaphore_ID semforo y el conjunto de semforos y estructura de datos asociada con l. -S semaphore_key Elimina el identificador del semforo, creada con la clave semaphore_key, y el conjunto de semforos y la estructura de datos asociada con l. netstat : muestra las estadsticas de la red Para producir la pantalla por defecto para las conexiones de red, escriba: netstat Para mostrar el estado de las interfaces configuradas, escriba: $ Netstat-i Para mostrar las tablas de enrutamiento, escriba: $ Netstat-r Para mostrar las tablas de enrutamiento con las direcciones de red, escriba: $ Netstat-rn

ifconfig : configura los parmetros de muestra o de interfaz de red Para mostrar informacin sobre todas las interfaces, escriba: $ Ifconfig-a Para consultar el estado de la interfaz de lnea de serie sl0, escriba: $ Ifconfig sl0 nslookup : consulta los servidores de nombres de Internet de forma interactiva Para encontrar los puntos de direcciones nombre de host $ Nslookup snowhite.cis.temple.edu Para encontrar el nombre de host 155.247.190.207 $ Nslookup 155.247.190.207 de IP decimales de snowhite.cis.temple.edu

la

direccin

IP

decimal

con

puntos

mesa de ping : enva paquetes ICMP ECHO_REQUEST de mquinas de la red Para determinar el estado de www.cs.stanford.edu host: $ Ping www.cs.stanford.edu Tener tambin un registro de la ruta a www.cs.stanford.edu: $ Ping-R www.cs.stanford.edu traceroute : Imprimir la ruta que los paquetes se toman a la red de acogida Para encontrar la ruta al host rtfm.mit.edu, escriba: $ Rtfm.mit.edu traceroute

arp : Muestra y controla Address Resolution Protocol (ARP), tablas Para mostrar todas las entradas ARP actuales: $ Arp-a lsof : informacin sobre la lista de archivos abiertos por procesos Este es un comando complejo, no disponible en todos los Unix (se puede obtener una copia de ftp://vic.cc.purdue.edu/pub/tools/lsof/). A la lista de todos los archivos abiertos, utilice: lsof A la lista de todos los abiertos de Internet, x.25 (HP-UX), y los archivos de UNIX de dominio, utilice: lsof-i-U A la lista de todos los archivos utilizando cualquier protocolo en cualquier puerto de snowhite.cis.temple.edu, use: lsof-i @ snowhite.cis.temple.edu Para encontrar el proceso que se ha / u / abe / foo abierto, utilice: lsof / u / abe / foo Para encontrar cualquier archivo abierto, incluyendo un archivo de socket UNIX de dominio abierto, con la el nombre de / dev / log, utilice: lsof / dev / log Para obtener PID y el nombre del comando de salida de campo para cada proceso, descripcin de archivos tor, el nmero de archivo de dispositivo, y el nmero de inodo para cada archivo de cada programa proceso, utilice: lsof-FpcfDi Para encontrar una IP versin 4 archivo de socket por sus asociados numrico de puntos de forma direccin, utilice: lsof-i @ 128.210.15.17 iostat : pantalla de E / S estadsticas iostat [unidad ...] [intervalo] [cuenta] Por ejemplo iostat 1 5 5 muestra los informes de estado tomadas en intervalos de 1 segundo. vmstat : muestra las estadsticas de la memoria virtual intervalo de vmstat [cuenta] vmstat [-f |-M | P-|-s] donde: -F Muestra slo las estadsticas sobre el nmero de tenedores desde el inicio del sistema (Ver el tenedor () de llamada). -P Muestra las estadsticas acumuladas sobre el uso de memoria fsica. -S Muestra estadsticas acumuladas a lo largo de con el tamao de pgina. df : Muestra estadsticas de espacio libre en disco du : Muestra un resumen del uso del disco

Para mostrar el uso del disco de un rbol de directorios y cada uno de sus subrboles, escriba: $ Du / u / fran Para mostrar el uso del disco de cada archivo, escriba: $ Du-a / u / fran Para mostrar slo el uso del disco total de un rbol de directorios, escriba: $ Du-rs / u / fran ruta : Manipula las tablas de enrutamiento de forma manual Requiere privilegios de sistema.

Captulo 3. Almacenamiento de datos en memoria Tabla de contenidos 3.1. La memoria RAM 3.2. Operaciones sobre memoria 3.3. Conexin entre memoria y procesador 3.4. Almacenamiento de datos 3.4.1. Almacenamiento de booleanos 3.4.2. Almacenamiento de caracteres 3.4.3. Almacenamiento de enteros y naturales 3.4.4. Almacenamiento de instrucciones 3.4.5. Tamao de datos en operaciones de lectura y escritura 3.5. Almacenamiento de tablas 3.5.1. Almacenamiento de tablas en Java 3.6. Almacenamiento de direcciones de memoria 3.6.1. Ejemplos de indireccin 3.7. Ejercicios En este capitulo se estudia el funcionamiento de la memoria RAM que utiliza el procesador para almacenar todos aquellos datos y cdigo que precisa para la ejecucin de un programa. Tambin se estudia la tcnica de la indireccin por la que se manipulan direcciones de memoria que apuntan a datos en lugar de los propios datos. 3.1. La memoria RAM Los circuitos digitales nicamente pueden procesar datos representados con ceros y unos, pero para ello deben estar almacenados en otro circuito que permita a su vez su modificacin. En el contexto de un ordenador este dispositivo suele ser la memoria RAM (random access memory), un circuito que contiene en su interior una tabla que almacena informacin en cada uno de sus compartimentos. Como toda tabla, es preciso saber dos de sus dimensiones: el tamao de cada uno de sus elementos, y el nmero de elementos de los que dispone. Actualmente, las memorias convencionales almacenan la informacin en elementos de tamao 1 byte. Por lo tanto una memoria se puede ver como una tabla que contiene un determinado nmero de bytes. Los elementos de esta tabla estn numerados con nmeros naturales comenzando por el cero. El nmero correspondiente a cada una de los elementos se denomina direccin de memoria y se suele representar de forma abreviada por el smbolo @. Al conjunto de nmeros que representan las direcciones de una memoria se le denomina su espacio de direcciones. La figura 3.1 ilustra la estructura, contenido y direcciones de una memoria RAM. Figura 3.1. Estructura de la memoria RAM

El acceso a los datos internos de la memoria viene determinado por el tamao de sus celdas o elementos. Tal y como est estructurada, la memoria no ofrece acceso directo a cualquiera de sus bits, sino que es preciso primero obtener un byte y posteriormente acceder al bit pertinente. Los procesadores incluyen en su lenguaje mquina las instrucciones necesarias para poder manipular los bits de un byte. Si se quiere, por tanto cambiar un bit de un byte de memoria se debe leer el byte entero, utilizar instrucciones para cambiar su valor, y escribirlo de nuevo en memoria. Internamente la memoria est implementada por un conjunto de transistores diseados de tal forma que pueden almacenar la informacin dada. La unidad responsable de almacenar un bit de informacin se denomina celda. Un chip de memoria no es ms que un circuito que contiene un determinado nmero de celdas en cuyo interior se almacena un bit. Existen dos tcnicas para el diseo de memoria: esttica y dinmica. La memoria RAM esttica o SRAM es un circuito que una vez que se escribe un dato en una de sus celdas lo mantiene intacto mientras el circuito reciba voltaje. En cuanto el voltaje desaparece, tambin lo hace la informacin. La celda de dicha memoria est compuesta por alrededor de seis transistores conectados de forma similar a un registro. El tiempo de lectura de una posicin de memoria compuesta por ocho celdas suele ser del orden de decenas de nanosegundos (1 nanosegundo son 10-9 segundos). La memoria RAM dinmica o DRAM es similar a la anterior pues tambin almacena informacin, pero su estructura interna es radicalmente diferente. La celda de memoria dinmica consta nicamente de un transistor y un condensador. Este ltimo es el que almacena una carga, mientras que el transistor se utilizar para su carga y descarga. La celda de memoria dinmica almacena el valor 1 cuando el condensador est cargado, y cero cuando est descargado. El problema que presenta esta celda es que, a pesar de estar conectada continuamente a su alimentacin, si el condensador almacena el valor 1 y no se realiza ninguna operacin, su carga se degrada hasta alcanzar el valor 0. Es decir, la celda de esta memoria no es capaz de mantener el valor uno durante un tiempo arbitrario, sino que acaba perdindose. Pero, tal y como est diseada la lgica de lectura, al leer una celda se refresca totalmente su valor, y por tanto se recupera la prdida de carga que pudiera haberse producido. El tiempo que tarda una celda en perder su informacin es del orden de milisegundos (1 milisegundo son 10 -3 segundos). Este comportamiento de las celdas puede parecer intil para almacenar informacin, pero si el contenido se lee de forma peridica, la memoria dinmica se comporta de forma idntica a la esttica. Los circuitos de memoria dinmica incluyen la lgica necesaria para que sus celdas sean continuamente ledas independientemente de las operaciones de lectura y escritura realizadas por el procesador, de esta forma se garantiza que su contenido no se pierde. A esta operacin se le conoce con el nombre de refresco. La mayora de ordenadores utilizan memoria dinmica en su memoria principal y las principales razones para ello son el coste y el espacio. La celda de memoria dinmica con un nico transistor y un condensador es aproximadamente la cuarta parte del tamao de la celda de SRAM que consta de alrededor de seis transistores. Pero, adems de ser ms pequea, el proceso de diseo de una celda DRAM tiene un coste mucho menor por lo que los chips de memoria de gran capacidad de almacenamiento se disean con memoria dinmica. La memoria esttica tiene una clara ventaja frente a la dinmica y es que su tiempo de acceso es menor. En la realidad, en un ordenador se utilizan ambos tipos de memoria. Para aquellos componente en los que se necesite mayor capacidad de almacenamiento la memoria dinmica es la idnea. En aquellos en los que se quiera un tiempo de acceso ms reducido se utiliza la memoria esttica. El diseo de un circuito de memoria es significativamente ms simple que el de un procesador. La mayor parte del circuito son rplicas de la celda que almacena un bit. Adems de estas celdas, las memorias incluyen la lgica necesaria para el refresco (si son DRAM) y para realizar las operaciones de lectura y escritura. 3.2. Operaciones sobre memoria Las dos operaciones que permite una memoria son lectura y escritura. En la operacin de lectura, la memoria recibe una direccin y devuelve el byte contenido en el elemento con dicho nmero. En la operacin de escritura la memoria recibe una direccin y un byte y sin devolver resultado alguno sobreescribe el byte en el elemento correspondiente. Otra forma posible de especificar estas operaciones es mediante la notacin tpica de un lenguaje de programacin. byte Lectura(direccin d): Dada una direccin de memoria devuelve el byte almacenado en dicho elemento. void Escritura(direccin d, byte b): Almacena el byte b en el elemento de direccin d.

El contenido de los datos almacenados inicialmente en la memoria es indefinido. Si al encender el ordenador, la primera operacin que se realiza es de lectura sobre memoria RAM, el resultado es indefinido. De esta propiedad se deduce que toda operacin de lectura se debe ejecutar sobre una posicin de memoria que haya sido previamente escrita. La figura 3.2 muestra el efecto de un conjunto de operaciones sobre memoria.

Figura 3.2. Operaciones sobre memoria

Al ser la memoria un circuito digital, todos sus datos deben ser codificados igualmente con ceros y unos y esto incluye a los parmetros que reciben las operaciones de lectura y escritura. El dato a leer o escribir es un byte y por tanto ya est codificado en binario. Las direcciones tambin deben estar codificadas en binario, y como son nmeros naturales (son positivos y comienzan por cero) la codificacin utilizada es base dos. La lectura de un dato consiste en enviar a la memoria los bits que codifican una direccin, y la memoria devuelve ocho bits. La operacin de escritura consisten en enviar a la memoria los bits que codifican una direccin y ocho bits de datos, y stos ltimos se almacenan en la posicin especificada. La codificacin de las direcciones tiene una relacin directa con el tamao de la memoria. Todo byte en memoria tiene una direccin, y el nmero de bytes corresponde con el nmero mximo de direccin que se puede codificar. Al utilizar la codificacin en base 2 se deduce que una memoria cuyas direcciones se codifican con n bits puede tener como mximo un tamao de 2 n bytes con direcciones desde 0 hasta 2n-1. En consecuencia, el tamao T de memoria y el nmero n de bits que se utilizan para codificar las direcciones estn relacionadas por la ecuacin

Debido a esta relacin entre los bits que codifican una direccin y el nmero de elementos, las memorias suelen tener un tamao potencia de 2. El coste de incluir un nmero determinado de bits hace que se aprovechen todas sus combinaciones. El tamao de la memoria se mide en mltiplos que no siguen las reglas convencionales de multiplicacin por potencias de 10 sino por potencias de 2. As, un kilobyte son 210 bytes o 1024 bytes. Las unidades de medida del tamao de memoria as como sus exponentes y los prefijos de su nomenclatura se muestran en la tabla 3.1. Tabla 3.1. Unidades de almacenamiento de informacin en bytes Prefijo Smbolo Potencia kilo mega K M 210 220

Prefijo Smbolo Potencia giga tera peta exa zetta yotta G T P E Z Y 230 240 250 260 270 280

3.3. Conexin entre memoria y procesador La conexin entre la memoria y el procesador debe permitir que se realicen las operaciones de lectura y escritura de la forma descrita en la seccin 3.2. Para ello son necesarios dos buses. El primero para que la memoria reciba la direccin del procesador, y el segundo para que el procesador enve a la memoria el dato a escribir o que la memoria enve al procesador el dato a leer. Adems de estos dos buses el procesador debe notificar a la memoria el tipo de operacin. La figura 3.3 muestra de forma esquemtica cmo estn conectadas estas seales. Figura 3.3. Seales que conectan el procesador y la memoria

Dado el nmero de bits del bus de direcciones se puede deducir el tamao de la memoria. Se puede cambiar el tamao de la memoria de un ordenador? A la vista de las conexiones que se muestran en la figura 3.3 esto no es factible. El bus de direcciones es un conjunto de seales fijo y por tanto cambiar el tamao de memoria significara cambiar este nmero. Si un ordenador duplica su memoria RAM necesita un bit adicional en su bus de direcciones. Los buses se implementan como pistas de metal en un circuito impreso y sus extremos se conectan a los puertos de entrada del procesador y la memoria, por lo que aadir un bit ms al bus es una operacin extremadamente compleja. Sin embargo, en los equipos actuales s se ofrece la posibilidad de aumentar la memoria disponible mediante la insercin de circuitos adicionales. Esto es posible porque el bus de direcciones tiene ms bits de los que son necesarios y adems, el procesador comprueba que las direcciones de memoria utilizadas estn dentro del rango correcto. En general, en un procesador, el nmero de bits de los que consta el bus de direcciones es un parmetro fundamental de su arquitectura y no puede ser modificado. Por ejemplo, en el procesador Intel Pentium, el bus de direcciones es de 32 bits, con lo que se pueden direccionar hasta un mximo de 4 gigabytes de memoria. En realidad, el procesador puede trabajar con un subconjunto de las direcciones posibles, es lo que se denomina memoria real del ordenador frente a la memoria posible que representa la memoria mxima que permite direccionar la anchura del bus de direcciones. La figura 3.4 ilustra esta situacin para el caso en el que un procesador de tipo Intel Pentium dispone de una memoria real de 256 megabytes.

Figura 3.4. Memoria real y posible en un Intel Pentium

El procesador incluye un mecanismo por el que el lmite de la memoria real es un dato conocido. Antes de realizar cualquier operacin sobre memoria se comprueba que la direccin est contenida entre ciertos lmites. En caso de que as sea, la operacin se realiza, y en caso contrario el procesador detiene el acceso y se produce una excepcin en la ejecucin. En el caso concreto del procesador Intel Pentium, el bus de direcciones de 32 bits limita la memoria mxima que puede direccionar a 4 gigabytes. Dada la progresin que ha tenido el precio de la memoria, ordenadores personales que tengan memoria mayor de 4 gigabytes sern pronto una realidad. Un cambio en el bus de direcciones quiere decir una reorganizacin de la arquitectura entera del procesador, y este ha sido el caso del Intel Pentium. La siguiente generacin de procesadores ofrece un bus de direcciones y de datos de 64 bits, por tanto con capacidad para direccionar un mximo de 16 exabytes (2 64 bytes). 3.4. Almacenamiento de datos La nica estructura que ofrece la memoria es la organizacin de sus elementos en bytes. Por tanto, para almacenar los datos que manipula un procesador es imprescindible saber de antemano su tamao. El tamao de algunos datos bsicos viene definido por la arquitectura del propio procesador. Por ejemplo, el lenguaje mquina del Intel Pentium contiene instrucciones mquina para operar enteros de 32 bits. Esto no quiere decir que el procesador no pueda manejar enteros de otros tamaos, sino que el procesador manipula estos de forma mucho ms rpida y eficiente. Nmeros de otros tamaos pueden ser manipulados igualmente pero con un coste mayor en tiempo de ejecucin. Los lenguajes de programacin de alto nivel como Java definen un conjunto de datos denominados bsicos y un conjunto de mecanismos para definir datos complejos en base a ellos. Como los programas escritos en estos lenguajes deben ejecutar en diferentes equipos con diferentes procesadores, es difcil definir el tamao de los datos tal que se ajuste a todos ellos. El compilador se encarga de transformar las operaciones escritas en lenguaje de alto nivel en las instrucciones ms adecuadas para manipular los datos en el procesador pertinente. La tabla 3.2 muestra los tipos de datos bsicos definidos en Java as como su tamao. Tabla 3.2. Tipos de datos bsicos en el lenguaje Java Tipo Contiene Tamao Rango 1 bit 8 bits [-128, 127]

boolean true, false byte Entero

Tipo char short int long float double

Contiene Caracter Unicode Entero Entero Entero

Tamao Rango 16 bits 16 bits 32 bits 64 bits 9223372036854775807] [1.4012985E-45, 3.4028235E+38] [4.94065645841246544E-324, [0, 65535] [-32768, 32767] [-2147483648, 2147483647] [-9223372036854775808,

IEEE-754 Coma Flotante 32 bits IEEE-754 Coma Flotante 64 bits

1.7976931348623157E+308] La regla para almacenar datos en memoria es utilizar tantos bytes como sean necesarios a partir de una direccin de memoria. En adelante, la posicin de memoria a partir de la cual est almacenado un dato se denominar su direccin de memoria. De forma anloga, cuando se dice que un dato est en una posicin de memoria lo que significa es que est almacenado en esa posicin y las siguientes que se precisen. 3.4.1. Almacenamiento de booleanos Los valores booleanos, a pesar de ser los ms sencillos, no son los ms fciles de almacenar. La memoria permite el acceso a grupos de 8 bits (1 byte) por lo que almacenar un nico bit significa utilizar una parte que no es directamente accesible sino que requiere procesado adicional. Por este motivo se intenta almacenar varios booleanos juntos y de esta forma maximizar la informacin contenida en un byte. Esta estrategia se utiliza cuando es fcil saber la posicin de un booleano dentro del byte. En el caso de que esto no sea posible, se utiliza un byte para almacenar un nico bit, con lo que los 7 bits restantes se desperdician. La figura 3.5 muestra estas dos posibles situaciones. Figura 3.5. Almacenamiento de booleanos

Si un conjunto de 8 booleanos se agrupan para ocupar un byte por entero, para acceder a un valor concreto se precisan instrucciones especiales contenidas en prcticamente todos los lenguajes mquina de los procesadores y suelen estar basadas en instrucciones lgicas tales como la conjuncin o la disyuncin. En el caso del Intel Pentium, mediante operaciones como and u or, la utilizacin de mscaras y la consulta de los bits de estado se pueden manipular los booleanos en un byte. 3.4.2. Almacenamiento de caracteres Tal y como se ha visto en el captulo 2, la codificacin ASCII utiliza 8 bits para representar caracteres. La forma de almacenar estos datos en memoria es simplemente utilizando un elemento o byte para cada letra. La figura 3.6 muestra cmo se almacenan en memoria un conjunto de letras representadas por su valor en ASCII. Figura 3.6. Almacenamiento de un string

Todo smbolo tiene su correspondiente cdigo, incluido el espacio en blanco (0x20). Si la codificacin utilizada fuese Unicode UTF16, cada smbolo ocupa dos posiciones consecutivas de memoria en lugar de una. 3.4.3. Almacenamiento de enteros y naturales Para almacenar un nmero entero o natural en memoria es imprescindible saber su tamao en bytes. Las representaciones ms utilizadas incluyen tamaos de 2, 4, 8 o hasta 16 bytes. Siguiendo la regla genrica de almacenamiento, se utilizan tantos bytes consecutivos a partir de una posicin dada como sean precisos. El tamao de esta representacin no slo influye en el lugar que ocupan en memoria sino tambin en el diseo de las partes del procesador que realizan las operaciones. Por ejemplo, si los enteros se representan con 32 bits, el procesador suele incluir una unidad aritmtico lgica con operandos de 32 bits. Pero en esta representacin es esencial saber en qu orden se almacenan estos bytes. Dado un entero que ocupa n bytes a partir de la posicin p de memoria, se pueden almacenar estos bytes comenzando por el byte menos significativo del nmero o por el ms significativo. Estas dos posibilidades son igualmente factibles. Considrese el ejemplo de un procesador que manipula nmeros enteros de 32 bits. La representacin del entero 70960543 en complemento a 2 es 0x043AC59F y se almacena a partir de la posicin de memoria 0x00001000. La figura 3.7 muestra las dos posibles formas de almacenamiento dependiendo de si se seleccionan los bytes de menor a mayor significacin o al contrario. Figura 3.7. Almacenamiento de enteros en memoria

A estas dos formas de almacenar nmeros enteros o naturales de ms de un byte en tamao se les conoce con el nombre de little endian y big endian. El primero almacena los bytes de menor a mayor significacin, mientras el segundo almacena primero el byte de mayor significacin. Cada procesador utiliza un nico mtodo de almacenamiento para todos sus enteros o naturales, y en la actualidad coexisten procesadores que utilizan little endian con otros que utilizan big endian. El problema de la existencia de ambas polticas de almacenamiento surge cuando dos procesadores intercambian nmeros. Como una secuencia de bytes es interpretada de forma diferente por los dos procesadores, se debe realizar un proceso de traduccin por el que se garantiza que ambos manipulan los mismos datos. La figura 3.8 muestra cmo la interpretacin de un nmero de 4 bytes con ambas formas ofrece resultados diferentes. Figura 3.8. Interpretacin de bytes en little endian y big endian

Existen numerosos argumentos a favor y en contra de ambas notaciones pero ninguno de ellos es concluyente. Quizs el ms intuitivo a favor de la notacin little endian es que si un nmero se almacena siguiendo este esquema y su representacin se extiende en tamao, nicamente es necesario utilizar ms posiciones de memoria sin reorganizar los bytes. En cambio, en el caso de big endian, la misma operacin requiere almacenar los bytes en diferentes posiciones de memoria. 3.4.4. Almacenamiento de instrucciones El almacenamiento de instrucciones consiste simplemente en utilizar posiciones consecutivas de memoria para almacenar los bytes de la codificacin de cada una de ellas. Una secuencia de instrucciones, por tanto, requiere tantas posiciones de memoria como la suma de los tamaos de cada una de las codificaciones.

Tal y como se ha descrito en la seccin 2.8.2, existen dos tipos de lenguajes mquina. Los procesadores con formato fijo de instruccin almacenan las instrucciones en memoria en porciones idnticas. En este caso, dada una porcin de memoria que contiene una secuencia de instrucciones es muy fcil acceder a una de ellas de forma arbitraria, pues todas ocupan lo mismo. El caso de instrucciones de formato variable es ligeramente ms complejo. Dada una porcin de memoria, para saber qu posiciones ocupa cada instruccin es preciso interpretar la informacin que stas codifican. Esto es precisamente lo que hace el procesador al comienzo de la ejecucin de cada instruccin, solicita de memoria tantos bytes como sean necesarios para obtener toda la informacin referente a la instruccin. Una vez concluida esta fase, la siguiente instruccin comienza en la posicin contigua de memoria. La figura 3.9 muestra un ejemplo de cmo se almacenan los dos posibles formatos de instruccin. Figura 3.9. Almacenamiento de instrucciones en formato fijo y variable

En el almacenamiento de instrucciones no es preciso distinguir entre los estilos big endian o little endian pues en la codificacin no existen bytes ms significativos que otros. El convenio que se utiliza es que se escriben los bytes de la instruccin en el mismo orden en el que estn almacenados en memoria. 3.4.5. Tamao de datos en operaciones de lectura y escritura La memoria almacena un byte en cada una de sus posiciones que a su vez tiene una direccin nica. El funcionamiento de la memoria est totalmente definido mediante esta estructura. Sin embargo, cuando la memoria forma parte del conjunto de un ordenador, el tiempo que tarda en realizar una operacin es mucho mayor comparado con el que tarda el procesador en ejecutar una instruccin. En otras palabras, los accesos a memoria requieren tanto tiempo que retrasan la ejecucin de las instrucciones del procesador. Existen mltiples decisiones de diseo en la arquitectura de un procesador que se utilizan para paliar este retraso. De entre ellas, una de las ms efectivas es realizar las operaciones en memoria en paquetes de informacin mayores de un byte. Es decir, cuando el procesador lee y escribe en memoria, en lugar de trabajar con un nico byte, los datos estn compuestos por ms de un byte en posiciones consecutivas. Esta tcnica tiene la ventaja de que un nico acceso a memoria para, por ejemplo, lectura, proporciona ms de un byte en posiciones consecutivas. El inconveniente es que es posible que en ciertas ocasiones, se obtenga de memoria ms informacin de la estrictamente necesaria. Generalmente, todo procesador ofrece la posibilidad de escribir un cierto tamao de datos en bytes (mayor que uno) en una nica operacin de memoria. La forma en que se implementa este mecanismo es utilizando mltiples mdulos de memoria. Por ejemplo,

supngase que se quiere manipular la memoria tal que las operaciones se hagan en grupos de cuatro bytes simultneamente. El ejemplo que se describe a continuacin se puede realizar con cualquier agrupamiento de informacin que sea potencia de dos. La primera decisin es almacenar los datos en cuatro mdulos o circuitos independientes de memoria de tal forma que la posicin 0 de memoria se almacena en el primer mdulo, la posicin 1 en el segundo, y as sucesivamente. La quinta posicin de memoria se almacena de nuevo en el primer mdulo. Con este esquema, el mdulo en el que est almacenado el dato de la posicin p se obtiene mediante la expresin p % 4. La consecuencia de este patrn de almacenamiento es que se puede acceder a cuatro bytes de memoria en el tiempo en el que se lee un byte. Dada una direccin de memoria, cada mdulo devuelve un byte y se obtienen los cuatro en el tiempo de retardo de un nico mdulo pues todos trabajan en paralelo. Por tanto, dada una direccin de memoria d, con esta tcnica, la memoria es capaz de devolver los datos desde la posicin d / 4 (donde esta divisin es divisin entera) a la posicin d / 4 + 3 en el tiempo de retardo de un nico mdulo. Otra interpretacin de esta organizacin es que la memoria contiene grupos de 4 bytes y cada uno de ellos est almacenado en la posicin d / 4. Pero, dada la direccin d, como se obtiene el nmero d / 4?. La direccin de memoria est codificada en base 2, y como esta operacin es una divisin por una potencia de la base, equivale a tomar la direccin ignorando los dos bits de menos peso, pues 4 = 22. En realidad, dada la direccin d el cociente de la divisin entera entre cuatro es el nmero de grupo mientras que el resto de esta divisin representa el byte del grupo de 4 al que se refiere d. La figura 3.10 muestra cmo implementar este esquema de acceso en una memoria con direcciones de 32 bits. Figura 3.10. Acceso a memoria en grupos de 4 bytes

Cada mdulo de memoria recibe 30 de los 32 bits de la direccin. Esto es as porque la memoria consta de exactamente 2 30 grupos de cuatro bytes y cada mdulo de memoria provee un byte de cada grupo. Con esta configuracin se obtienen cuatro bytes en el tiempo en el que un mdulo lee uno de sus bytes, pues los cuatro acceden a su dato respectivo de forma paralela. Adems de los componentes que se muestran en la figura 3.10, la nueva memoria contiene la lgica necesaria para igualmente permitir la lectura y escritura de un nico byte en lugar de cuatro. Los accesos a esta memoria a direcciones que son mltiplos de 4 se denominan accesos alineados. Pero, qu sucede si el procesador quiere acceder a 4 bytes consecutivos de esta memoria pero que no comienzan en una posicin mltiplo de 4? El paralelismo se obtiene porque si cada mdulo lee la misma direccin de memoria y ofrece su correspondiente byte, pero si el procesador requiere cuatro bytes que no estn en el mismo grupo, este esquema no funciona puesto que no todos los mdulos deben leer de la misma direccin. A este tipo de accesos se le denominan accesos no alineados. En tal caso, la memoria se ocupa internamente de realizar

cuantos accesos sean necesarios para devolver los cuatro bytes que requiere el procesador. No se precisan ms de dos accesos a memoria para servir cualquier peticin de cuatro bytes consecutivos del procesador. Por ejemplo, si el procesador requiere los datos en las posiciones 4 * d + 3 a 4 * d + 6, el procesador selecciona el ltimo byte del grupo con direccin 4 * d y los tres primeros del grupo con direccin 4 * (d + 1). La figura 3.11 muestra los dos accesos a memoria para obtener los datos requeridos. Figura 3.11. Acceso doble para obtener 4 bytes consecutivos

En el caso concreto del procesador Intel Pentium, su arquitectura define su su bus de direcciones y su bus de datos ambos de tamao 32 bits. El procesador puede leer o escribir 4 bytes de datos en memoria de forma simultnea. 3.5. Almacenamiento de tablas En la seccin 3.4 se ha visto cmo los tipos de datos bsicos se almacenan en memoria, pero los programas manipulan estructuras de datos ms complejas compuestas a su vez por datos bsicos. Un ejemplo de estas estructuras son las tablas o arrays. Una tabla es un conjunto de datos agrupados de forma que cada uno de ellos puede ser accedido a travs de un ndice que se corresponde con un nmero natural. El primer elemento est en la posicin con ndice cero y el ltimo en la posicin con ndice igual al nmero de elementos de la tabla menos uno. En los lenguajes de programacin tales como C o Java, si una tabla de elementos se denomina tabla, el elemento en la posicin i se accede mediante la expresin tabla[i]. Cmo se almacenan estos datos en memoria de forma que puedan ser accedidos por el procesador? Al igual que en el caso de los datos bsicos, la estrategia consiste en utilizar posiciones consecutivas de memoria para almacenar los elementos. Si una tabla contiene n elementos y cada uno de ellos se codifica con m bytes, el espacio total ocupado por la tabla es de n * m bytes. Dada la direccin de memoria d a partir de la cual se almacena la tabla y el tamao m en bytes de cada elemento la direccin donde est almacenado el elemento en la posicin p se obtiene sumando a d los bytes que ocupan los elementos anteriores, o lo que es lo mismo d + (p * m). La figura 3.12 ilustra cmo se realiza este clculo. Figura 3.12. Direccin de un elemento de una tabla

Considrese, por ejemplo, una tabla de 4 enteros almacenada en la memoria del procesador Intel Pentium a partir de la posicin 0x100 y con los nmeros 0x34AF89C4, 0x583B7AF1, 0x97FA7C7E, 0x14C8B9A0 almacenados en ese mismo orden. La figura 3.13 muestra su disposicin en memoria.

Figura 3.13. Ejemplo de almacenamiento de una tabla de enteros de 32 bits en memoria

Pero para manipular tablas de datos no slo basta con almacenar los elementos en posiciones consecutivas. Considrese el siguiente ejemplo. Se dispone de una tabla de enteros y se debe calcular la suma total de sus elementos. Para ello se comienza sumando el primer elemento, a l se le suma el segundo, a este resultado el tercero, y as sucesivamente. Pero cmo se sabe que se ha llegado al ltimo elemento? Para cualquier tabla, adems de la direccin de comienzo y el tamao de sus elementos, es preciso saber el nmero de elementos que contiene. Existen dos mecanismos para saber cuntos elementos contiene una tabla. El primero de ellos consiste en depositar como ltimo elemento, un valor que denote el final. Por ejemplo, considrese una tabla de letras que almacena una frase. Cada letra se almacena con su codificacin en ASCII (ver seccin 2.8.1), por lo que cada letra ocupa un byte. Al final de la tabla se incluye un byte con valor 0 que est reservado especficamente en ASCII para codificar el final de una secuencia de letras. Para recorrer todos los elementos de esta tabla basta con escribir un bucle que se detenga cuando encuentre el valor cero. Pero la tcnica de depositar un valor concreto como ltimo elemento no funciona para todos los tipos de datos. Qu sucede en el caso de una tabla de nmeros enteros? Cada elemento se codifica con su representacin en complemento a 2 que utiliza la totalidad de posibles combinaciones de bits. Por tanto, no es posible utilizar un valor especfico para denotar el final de la tabla pues se confundira con la representacin de su nmero entero correspondiente. Para saber el tamao, simplemente hay que almacenar este valor en una posicin adicional de memoria. De esta forma, si se desea acceder a todos los elementos de la tabla de forma secuencial basta con escribir un bucle que compare la posicin del elemento con el tamao. Tanto esta tcnica como la anterior se utilizan de forma frecuente en los lenguajes de programacin de alto nivel. 3.5.1. Almacenamiento de tablas en Java El lenguaje de programacin Java garantiza que el acceso a los elementos de un array se realiza siempre con un ndice correcto. Dado que toda tabla en Java tiene su primer elemento en la posicin con ndice cero, el ndice i con el que se accede a una tabla de n elementos debe cumplir 0 i < n. Pero esta comprobacin slo se puede realizar mientras un programa est en ejecucin. Supngase que un programa Java contiene la expresin tabla[expresin]. Cmo se puede garantizar que el acceso a la tabla es correcto? La solucin consiste en que antes de que el programa ejecute esta expresin se comprueba que su valor est en los lmites correctos, en cuyo caso el acceso se realiza sin problemas. Si el ndice no est entre los lmites permitidos el programa produce una excepcin del tipo ArrayIndexOutOfBounds. Para implementar este mecanismo no slo toda tabla en Java debe tener almacenado su tamao sino que cada acceso va precedido de la comprobacin del valor del ndice. Se necesita, por tanto, un mecanismo que almacene los datos de una tabla y su tamao de forma compacta y que adems permita una eficiente comprobacin de los accesos a sus elementos. La solucin en Java consiste en almacenar el tamao de una tabla junto con sus elementos en posiciones consecutivas de memoria. De entre todas las posibilidades de organizar estos datos, la ms lgica es poner el tamao en las primeras posiciones de memoria seguido de los elementos. La figura 3.14 muestra cmo se almacena en memoria una tabla de seis enteros de 32 bits en formato little endian a partir de la posicin 0x100. Figura 3.14. Almacenamiento de una tabla de seis enteros en Java

Antes de cada acceso al elemento i que ocupa t bytes de una tabla con s elementos almacenada a partir de la posicin d, el programa escrito en Java realiza las siguientes operaciones: Obtiene el entero s almacenado a partir de la posicin d. Comprueba que 0 i. En caso de que no sea as produce una excepcin. Comprueba que i < s. En caso de que no sea as produce una excepcin. Calcula la direccin donde est el elemento i como d + 4 + (t * i).

3.6. Almacenamiento de direcciones de memoria Supongamos que la memoria utilizada tiene un tamao de 4 Gigabytes y por tanto sus direcciones se representan con 32 bits. Las direcciones de memoria son nmeros naturales en el rango [0, 2 32 - 1]. Pero este nmero natural es susceptible de ser almacenado l mismo en memoria. Es decir, se puede almacenar la representacin binaria de una direccin de memoria en la propia memoria. Al tener un tamao de 32 bits o 4 bytes, se utilizan para ello cuatro posiciones de memoria consecutivas. Una direccin de memoria, por tanto, se puede considerar de dos formas posibles: o como una direccin de una celda de memoria, o como un nmero natural susceptible de ser manipulado como tal. Supngase que en la posicin de memoria 0x00000100 se encuentra almacenado el nmero entero de 32 bits 0x0153F2AB y que en la posicin 0x00000200 se debe almacenar la direccin de dicho nmero. Para ello se almacena, a partir de la posicin 0x00000200 el nmero 0x00000100 utilizando los cuatro bytes a partir de esa posicin y se hace en orden creciente de significacin al utilizar el esquema little endian. El resultado se ilustra en la figura 3.15. Figura 3.15. Direccin de memoria almacenada como nmero natural

Tras almacenar la direccin de memoria de un dato en la posicin 0x00000200, es posible obtener de nuevo el nmero 0x0153F2AB? La respuesta es afirmativa, pero no de forma inmediata, se debe obtener de memoria primero los cuatro bytes almacenados en la posicin 0x00000200 y utilizarlos como una direccin de memoria de donde obtener los cuatro bytes contenidos en la posicin 0x00000100. El acceso a este ltimo dato se ha realizado de forma indirecta, es decir, mediante un acceso previo a memoria para obtener la direccin del dato final. Utilizando la notacin funcional de operaciones sobre memoria, el acceso al dato se logra ejecutando Lectura(Lectura(0x00000200)). A este mecanismo de acceso a un dato en memoria a travs de su direccin a su vez almacenada en otra posicin se le conoce con el nombre de indireccin. En el ejemplo anterior se dice que el dato almacenado en la posicin 0x00000200 apunta al dato 0x0153F2AB. La figura 3.16 ilustra esta situacin. Figura 3.16. Una posicin de memoria apunta a otra

El mecanismo de indireccin se puede encadenar de manera arbitrariamente larga. La direccin que contiene la direccin de un dato, a su vez se puede almacenar de nuevo en memoria. En tal caso, para acceder al dato final se requieren dos accesos a memoria en lugar de uno. Por tanto, es posible almacenar las direcciones tal que haya que seguir una cadena de indirecciones para en ltima instancia acceder al dato. La figura 3.17 muestra una distribucin de datos tal que la posicin 0x00000100 contiene la direccin de memoria de la direccin de memoria de la direccin de memoria del dato. Figura 3.17. Indireccin mltiple para acceder a un dato

De la tcnica de indireccin se deriva que en memoria no slo se almacenan datos (naturales, enteros, coma flotante, letras, etc.) sino tambin direcciones de memoria. Todos estos datos, a efectos de almacenamiento y su manipulacin por el procesador, no son ms que una secuencia de bytes en diferentes celdas. El que una secuencia de bits determinada se interprete como un nmero o como una direccin queda totalmente bajo el control del programador. En los programas escritos en ensamblador es preciso saber qu dato est almacenado en qu posicin de memoria pero el propio lenguaje no aporta mecanismo alguno que compruebe que se el acceso se hace de forma correcta. Si por error en un programa se obtiene un dato de 32 bits de memoria y se interpreta como una direccin cuando en realidad es un dato numrico o viceversa, lo ms probable es que el programa termine de forma brusca o con resultados incorrectos. 3.6.1. Ejemplos de indireccin El almacenar una direccin en memoria no parece a primera vista un mecanismo til, pues esta cumple un nico papel que es el de apuntar al dato en cuestin. Sin embargo, esta tcnica se utiliza con frecuencia en la ejecucin de programas. Ejemplo 3.1. Almacenamiento de una tabla de strings Supngase que se dispone de un conjunto de n strings almacenados en otras tantas posiciones de memoria. Aunque las letras de cada string estn almacenadas en posiciones consecutivas, los strings no estn uno a continuacin de otro sino en zonas de memoria dispersas. Se quiere imprimir estos strings en orden alfabtico. El primer paso es ordenar los strings para a continuacin imprimir cada uno de ellos por orden. Para ordenar los strings hay dos opciones, o se manipulan todos los caracteres de cada uno de ellos, o se manipulan sus direcciones de comienzo. Es decir, en lugar de tener los strings ordenados alfabticamente y almacenados en posiciones consecutivas de memoria, se almacenan por orden las direcciones de memoria de comienzo de cada string y se ordenan en base a las letras que contienen. Esta estructura se ilustra en la figura 3.18. Figura 3.18. Tabla con direcciones de comienzo de strings

La ordenacin los strings se puede realizar sin mover ninguna de las letras en memoria. La tabla resultante contiene en cada uno de sus elementos una indireccin a un string, es decir, la direccin en la que se encuentra el string pertinente. Para imprimir los strings en orden alfabtico se itera sobre los elementos de la tabla y mediante doble indireccin se accede a las letras de cada string. Ejemplo 3.2. Referencias en el lenguaje Java El lenguaje de programacin Java utiliza el mecanismo de indireccin para acceder a los datos almacenados en un objeto. Supngase que se ha definido una clase con nombre Dato que a su vez contiene un campo de acceso pblico, entero y con nombre valor. Se ejecuta la siguiente porcin de cdigo. Lnea Cdigo 1 2 3 4 5 6 Dato obj1, obj2; obj1 = new Dato(); obj1.valor = 3; obj2 = obj1; obj2.valor = 4; System.out.println(obj1.valor)

Qu valor imprime por pantalla la ltima lnea? El cdigo asigna al campo valor de obj1 el valor 3, a continuacin se produce la asignacin obj2 = obj1, luego se asigna el valor 4 al campo valor de obj2 y se imprime el mismo campo pero de obj1. Al ejecutar este fragmento de cdigo se imprime el valor 4 por pantalla. La lnea que explica este comportamiento es la asignacin obj2 = obj1. En Java, todo objeto se manipula a travs de una referencia. Las variables obj1 y obj2 son referencias y la asignacin obj1 = obj2 no transfiere el contenido entero de un objeto a otro, sino que se transfiere el valor de la referencia. Por tanto, al ejecutar esta asignacin, obj2 se refiere al mismo objeto que obj1 y por eso la ltima lnea imprime el valor 4. El mecanismo interno que se utiliza a nivel de lenguaje mquina para representar las referencias est basado en el concepto de indireccin. Cuando se crea un objeto se almacenan sus datos en memoria. Cuando un objeto se asigna a una referencia esta pasa a contener la direccin de memoria a partir de la cual est almacenado. La asignacin obj2 = obj1 transfiere la direccin de memoria contenida en obj1 al contenido de obj2. Cualquier modificacin que se haga a travs de la referencia obj1 afecta por tanto al objeto al que apunta obj2 pues ambas referencias apuntan al mismo objeto. La figura 3.19 ilustra cmo se asignan los valores en memoria para este ejemplo. Figura 3.19. Dos referencias en Java que apuntan al mismo objeto

El objeto est ubicado en una posicin arbitraria de memoria (en la figura 3.19 es la posicin 0x00000100). En dos posiciones de memoria adicionales se almacenan las referencias obj1 y obj2. La primera de ellas recibe su valor al ejecutarse el constructor de la clase. La segunda recibe el mismo valor cuando se ejecuta la asignacin. A partir de este momento, cualquier modificacin realizada en el objeto a travs de obj1 ser visible si se consulta a travs de obj2. Ejemplo 3.3. Doble indireccin con referencias en el lenguaje Java Las referencias en Java se utilizan, por tanto, como indirecciones a memoria. Pero las clases definidas en Java pueden contener en su interior campos que sean referencias a otros objetos. Por ejemplo, si se define una segunda clase Dato2 en cuyo interior existe un campo con nombre c1 de la clase Dato, este campo es una referencia a un objeto. Supngase que se ejecuta la siguiente porcin de cdigo. Lnea Cdigo 1 2 3 4 Dato2 obj2; obj2 = new Dato2(); obj2.c1 = new Dato(); obj2.c1.valor = 4;

En este caso la referencia obj2 apunta a un objeto de la clase Dato2 que a su vez contiene en su interior una referencia a un objeto de la clase Dato. Para ejecutar la ltima lnea en la que se asigna el valor 4 al campo valor es preciso realizar una doble indireccin. La referencia obj2 contiene la direccin del objeto de la clase Dato2, y este a su vez contiene en su interior una referencia que contiene la direccin del objeto de la clase Dato. Tras esta doble indireccin se asigna el valor 4 a dicho dato. La figura 3.20 muestra el acceso a este dato a travs de la doble indireccin. Figura 3.20. Acceso a un dato mediante doble indireccin

3.7. Ejercicios 1. Disear una memoria tal que ofrezca al procesador la capacidad de acceder a ocho bytes consecutivos de memoria en el tiempo en el que se lee un nico byte. El diseo debe incluir el tamao de los buses as como su estructura interna.

2.

3.

La memoria de un procesador ofrece acceso a cuatro bytes consecutivos de memoria mediante un nico acceso siempre y cuando estn almacenados a partir de una posicin que es mltiplo de cuatro. En este procesador se ejecutan dos programas con idnticas instrucciones que acceden a un array de un milln de enteros de tamao 32 bits. El primer programa realiza un total de un milln de accesos a la zona de memoria en la que est almacenado el array. El segundo programa realiza exactamente el doble de accesos a memoria a la misma zona, cmo es esto posible? Supongamos un procesador que permite operaciones en memoria en bloques de 32 bits (4 bytes). Se ejecutan las siguientes instrucciones: Write(0x100, 0x01234567) Write(0x101, 0x89ABCDEF) Write(0x102, 0xFFFFFFFF) Read(0x100) Cul es el resultado de la ltima operacin?

4.

5. 6.

Una tabla en Java almacena referencias a objetos. Estas referencias ocupan 32 bits cada una. La tabla contiene 23 elementos y est almacenada a partir de la posicin 300 de memoria. En qu direccin est almacenada la referencia del elemento en tabla[21]? Y la referencia del elemento tabla[23]? Cuntas posiciones de memoria reserva la ejecucin de la expresin Java int[] tabla = new int[49]? Supongase un ordenador con memoria principal de 16 Kilobytes (1 Kilobyte = 1024 bytes). Explicar cuantos bits de datos y direccin se precisan y por qu en los siguientes supuestos: a. La memoria lee y escribe la informacin en grupos de 8 bits: b. La memoria lee y escribe la informacin en grupos de 32 bits:

You might also like