Memoria RAM y como se escribe...

Foro dedicado a PCs modernos. Desde Pentium 4 en adelante
Avatar de Usuario
mentalthink
Amiga 2500
Amiga 2500
Mensajes: 2840
Registrado: 11 Abr 2010, 15:06
Gracias dadas: 45 veces
Gracias recibidas: 14 veces

Memoria RAM y como se escribe...

Mensajepor mentalthink » 28 Abr 2013, 04:47

Bien queria hacer está pregunta que todos sabemos , la RAM como se escribe de manera alatoria... perfecto... pero debe de tener algún tipo de lógica, no?¿

Bueno la pregunta me surge porque siguiendo un curso por aquí de C++ que ya coloqué en su dia (ponéis Paueky, el tio explica de perlas es profe de UNI de Barna) y comentaba lo de los punteros y tal, y hacia referencia al tema del acceso a la RAM y como escribia, pero resulta que no he visto ese video en dónde se supone que explicaría la lógica de estó.

Lo de acceso aleatorio es relativo, porque si envia los datos a dónde le da la gana, puede ser que esté mirando en celdas con memoria 4 000 veces antes de encontrar algo que está libre... entonces como se hace estó... que está indexadas las posiciones de memoria en el procesador y avisa a dónde tiene que ir aleatoriamente en ese rango?¿...

Y por otro lado, que está pregunta si cabe me la he cuestionado más veces, si envez de saltar de puntos a puntos del chip, estuviera todo de forma seguida, no le costaría mucho menos a la CPU encontrar las cosas... lo mismo para los discos duros, porque cuando haces ... (no me acuerdo), algunos reparadores de Registro de Windows lo tienen... lo que te pone el disco organizado .. supuestamente para no perder espacio.

Avatar de Usuario
mcleod_ideafix
Amiga 2500
Amiga 2500
Mensajes: 5316
Registrado: 06 Oct 2009, 04:12
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Vectrex
Primera consola: TV Games/Pong Clone
Ubicación: Jerez de la Frontera
Gracias dadas: 12 veces
Gracias recibidas: 54 veces
Contactar:

Re: Memoria RAM y como se escribe...

Mensajepor mcleod_ideafix » 28 Abr 2013, 06:17

mentalthink escribió:Lo de acceso aleatorio es relativo, porque si envia los datos a dónde le da la gana, puede ser que esté mirando en celdas con memoria 4 000 veces antes de encontrar algo que está libre... entonces como se hace estó... que está indexadas las posiciones de memoria en el procesador y avisa a dónde tiene que ir aleatoriamente en ese rango?¿...


A ver: no soy profe de la universidad de Barcelona, pero a ver si uno de Sevilla te vale ;)

La palabra "aleatorio" en "memoria de acceso aleatorio" (RAM) no debe aquí interpretarse como "al azar", ya que dentro de un ordenador, nada sucede al azar.

Otra cosa: el concepto de posición de memoria "libre" o "ocupada" en realidad no existe. En toda posición de memoria RAM hay un dato. Otra cosa es que para el programa que se está ejecutando, ese dato sea relevante o no. Es decir, que si esa posición de memoria está asignada a una variable, podremos decir que dicha posición está "ocupada", y si no hay ninguna variable que la referencie, podemos decir que está "libre".

En un ordenador simple, como puede ser un Spectrum, parte de la memoria está "en uso", en el sentido de que se está guardando algo en ella que es relevante para el programa que se está ejecutando: puede ser código del programa, variables, la pantalla, o la pila de la CPU... o puede que no se está guardando nada en ella relevante, entonces se dice que está "libre". Cada una de estas cosas se guarda en una o varias posiciones de memoria, a menudo consecutivas, que llamamos "regiones de memoria".

Al conjunto de regiones de memoria y la descripción de su contenido se le denomina "mapa de memoria". En el siguiente gráfico se observa el mapa de memoria de un Spectrum 48K
http://wordpress.animatez.co.uk/wp-cont ... ry_map.png
Imagen

Los números a la izquierda indican las posiciones de memoria de comienzo y final de cada región. A la derecha, en fondo de color, está la desripción del contenido de dicha región. La región más grande es la de "memoria disponible".

Entonces, ¿cómo se usa la memoria RAM? Muy simple: como ya has apuntado, el procesador es quien, dictado por su programa, decide a qué posición de memoria se va a leer o a escribir, y en el caso de la escritura, qué dato es el que se va a escribir. Puedes pensar en la memoria como en una gran tabla con tantos elementos como posiciones de memoria tenga dicha memoria. Cada posición está, efectivamente, indexada. Ese índice es la "dirección de memoria".

Más información, en este libro (con el primero que aprendí estas cosas cuando chico :D ) :
http://www.paraquenoseolviden.com/galle ... putadoras/

Y sobre todo, en éste:
http://www.paraquenoseolviden.com/galle ... 1.jpg.html
Concretamente, las páginas 9, 10 y 11.

mentalthink escribió:Y por otro lado, que está pregunta si cabe me la he cuestionado más veces, si envez de saltar de puntos a puntos del chip, estuviera todo de forma seguida, no le costaría mucho menos a la CPU encontrar las cosas... lo mismo para los discos duros, porque cuando haces ... (no me acuerdo), algunos reparadores de Registro de Windows lo tienen... lo que te pone el disco organizado .. supuestamente para no perder espacio.


De hecho es así: se llama lectura en ráfaga, y se usa cuando quieres leer varias posiciones de memoria seguidas. En ese caso, la lectura es más rápida porque parte del direccionamiento de la memoria ya está hecho. Es más: un buen compilador, cuando traduce tipos de datos tales como vectores o matrices, se asegura de que los elementos de estos tipos de datos aparezcan contiguos en memoria, ya que se espera que el programador acceda a esos datos de forma secuencial. Entonces, organizándolos de forma continua, el acceso a dichos datos es, por lo general, más rápido.

Esto también influye en la caché del procesador. La caché guarda el dato recién traído de memoria, y unos cuántos más en posiciones seguidas, ya que se espera que el programa acceda a ese dato, y a los siguientes (esto se llama principio de localidad referencial, y es la base para que una memoria lenta en acceso aleatorio, tal como una DRAM, aparezca como más rápida a ojos del programa)

En los discos duros, después de desfragmentar, ocurre lo mismo: cuesta mucho menos leer sectores que están seguidos que sectores que están en posiciones distantes unos de otros, ya que en el segundo caso hay que mover el cabezal de la unidad, y ese es un proceso muy lento (comparado con la rotación del disco).
Recuerda: cada vez que se implementa un sistema clásico en FPGA, Dios mata a un purista

Avatar de Usuario
mentalthink
Amiga 2500
Amiga 2500
Mensajes: 2840
Registrado: 11 Abr 2010, 15:06
Gracias dadas: 45 veces
Gracias recibidas: 14 veces

Re: Memoria RAM y como se escribe...

Mensajepor mentalthink » 28 Abr 2013, 10:26

Parece ser que el profesor de Sevilla me ha servido mucho :D :D (El del curso de Youtube no es que lo explicará mal,pero no encontré la respuesta)

Pues gracias McLeod porque me has lo has dejao más claro que el agua, dejame un par más que leyendo me han venido a los sesos :mrgreen: (Si no me leo el libro que me dices y ya está no te preocupes).

Lo primero estó de la indexación... vamos a suponer que hablamos de un ordenador sencillo un specrtrum o un asmtrad, para no liar la troca.
O sea que como he creído la CPU sabe dónde hay que mirar, porque digámoslo asi , está mira la memoria, y va llenado un array, y le dice, aqui si y aqui no, de esto me viene una preguntilla, el dato que le dice aqui si o aqui no, valdría simplemente una booleana?¿, pero la declaración del "array" este interno debe ser un número enteo al menos no?¿.

Por otro lado estos datos "internos" digamos que se guardan en lo que se llama el Stack...?¿

Avatar de Usuario
na_th_an
Amiga 1200
Amiga 1200
Mensajes: 1273
Registrado: 10 Oct 2012, 11:17
Sistema Favorito: (Otro)
primer_sistema: Spectrum +2
consola_favorita: Sony PlayStation 1
Primera consola: Sega Master System
Gracias dadas: 18 veces
Gracias recibidas: 15 veces

Re: Memoria RAM y como se escribe...

Mensajepor na_th_an » 28 Abr 2013, 10:52

No funciona así. Como ha explicado Mcleod, la memoria no es más que un casillero enorme. Cada casilla tiene su dirección. En cada casilla va un número almacenado. La CPU no sabe qué hay en cada casilla, sólo se limita a hacer lo que le ordena el programa. Si el programa le dice que ponga un 7 en la casilla 4393 lo hará, sin importar que allí hubiese un 80 que nos hacía falta para otra cosa.

No existe, físicamente, el concepto de posición "libre" o "vacía". En una dirección de memoria SIEMPRE hay un dato. Que tenga sentido o no, es cuestión del programa que esté ejecutándose, como bien ha dicho Mcleod.

Programando a muy bajo nivel, esto es, en código máquina, es el programador el que tiene que estar pendiente de qué hay en cada casilla. Imagínate que tienes que guardar el número de vidas de tu jugador en un juego. Si tu decides que ese valor irá almacenado en 50000, tienes que tener cuidado de que no vayas a escribir otra cosa ahí que te lo pise.

En lenguajes de más alto nivel, son los compiladores los que eligen esas direcciones y se preocupan de acordarse donde estaban, de forma que si tu en tu programa tienes una variable "v" para las vidas, el compilador sabe que está en una dirección en concreto (la que le vaya tocando, cada compilador va reservando el espacio como mejor le pete), y genera el código máquina adecuado que hace uso del valor en la posición de memoria concreta.

El ordenador de por sí no sabe donde está nada. Son los programas que se ejecutan en él (por ejemplo, un sistema operativo) los que se encargan de eso. La CPU sólo sabe a qué dirección tiene que mirar para traerse la siguiente instrucción que tiene que ejecutar.

El Z80 en un CPC no sabe que la pantalla es una ristra de 16Kb situada a partir de la posición 49152. Es el sistema operativo del ordenador (que está en la ROM) el que lo sabe y se encarga de escribir los caracteres ahí, y no en otro sitio.

El stack (pila) es algo diferente. Es simplemente un area de la memoria que se reserva el procesador para introducir valores temporales. Por ejemplo, si el programa salta a una subrutina, almacena ahí la dirección de retorno, para saber luego adónde volver, una vez que se haya terminado la rutina. Normalmente, los procesadores tienen un registro que apunta a la posición de memoria donde empieza la pila, que el programador puede alterar cuando quiera. El programador, además, puede usar la pila también para introducir valores temporales (por ejemplo, las variables locales de una rutina).

Avatar de Usuario
scooter
Amiga 1200
Amiga 1200
Mensajes: 1031
Registrado: 17 Jul 2012, 09:25
primer_sistema: C64
Ubicación: Alicante

Re: Memoria RAM y como se escribe...

Mensajepor scooter » 28 Abr 2013, 10:59

Yo soy profesor pero no de informática...a ver si te sirve.
La memoria es como una gran tabla correlativa de posiciones, si es de 8 bits en cada cajón solo caben 8, osea un número binario entre 0 y 255. Si es de 16 o 32bits en cada cajón caben números mas grandes. Estos números se pueden usar de varias formas, pueden representar un número tal cual, uno con signo entre -128 y +127 , un carácter ASCII, un trozo de un número mayor o puede ser una instrucción del procesador.
Si por ejemplo en una posición hay 66 por decir algo será una cosa u otra según como lo usemos.
Para acceder a la memoria cada procesador tiene varios modos; absoluto, relativo, por registro etc dependiendo de que micro sea.
Así que para leer la posición 1000 por ejemplo se puede hacer con diversas instrucciones según te interese, pero que yo sepa la memoria en si misma no está indexada.
En un ordenador con z80 lo normal sería usar una pareja de registros hl, de,...para apuntar al array, cada vez que leas o escribas incrementas o decrementas la pareja de registros. Para no salirte de la tabla además deberás de comprobar si su valor es mayor o menor que los topes , si te pasas ya sabes que está llena, que desborda o lo que sea según el caso.

Avatar de Usuario
zup
Amiga 2500
Amiga 2500
Mensajes: 3012
Registrado: 04 Sep 2009, 20:07
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Nintendo DS/3DS
Primera consola: Nintendo GameBoy
Ubicación: Navarra
Gracias dadas: 86 veces
Gracias recibidas: 356 veces
Contactar:

Re: Memoria RAM y como se escribe...

Mensajepor zup » 28 Abr 2013, 11:33

Volvamos hacia atrás, a ver si podemos aclarar un poco los conceptos.

- "Memoria aleatoria" quiere decir que se puede escribir/leer donde a uno le da la gana. Lo contrario es "memoria secuencial", donde tienes que escribir y leer en la siguiente posición sí o sí. Piensa una memoria aleatoria como una hoja de papel, donde puedes escribir donde quieras; una memoria secuencial sería como una tira de papel muy fina, solo puedes escribir de izquierda a derecha.

- La memoria es un inmenso casillero, y cada dato se lee indicando su posición (32768, 16383, ese tipo de cosas). El mapa de memoria que te indican son una serie de direcciones "fijas" (p.ej.: en el Spectrum 48k las primeras 16k son la ROM, de 16384 a 23295 es la memoria de pantalla...) que el fabricante ha decidido que tienen un uso concreto.

- La CPU no sabe qué dirección tiene cada cosa ni de mapas de memoria. Lo único que le preocupa es que debe leer las instrucciones donde apunta PC, y el siguiente dato de la pila lo tiene que sacar SP. El resto se la trae floja, y es responsabilidad del programador saber que la dirección 40000 (por ejemplo) tiene el contador de vidas.

- ¿Es responsabilidad del programador? No del todo. Para eso están las etiquetas que defines en ensamblador. Si tu reservas un byte y le asignas la etiqueta cont_vidas (por ejemplo), el compilador se preocupará que todos los accesos a cont_vidas vayan a la dirección correcta, y no importa que cont_vidas esté en 40000, 50000 o 32000... eso es trabajo del compilador. Lo de asignar una dirección fija (por ejemplo) es algo "interno" del programa (a menos que tengas que ensamblar a mano no te interesa realmente).

- Arrays... para usarlos, solo tienes que "reservar" suficiente espacio, pero que sepas que el acceso a los elementos será todo a mano (dir. elemento=dir. inicio + indice * tam. elemento), y que no tienes control de los límites. Si tu array tenía 32 elementos y escribes en el 33... pues la primera señal de que te has equivocado suele ser un cuelgue por haberte cargado alguna subrutina o el stack.
I have traveled across the universe and through the years to find Her. Sometimes going all the way is just a start.
Además vendo cosas!

Avatar de Usuario
scooter
Amiga 1200
Amiga 1200
Mensajes: 1031
Registrado: 17 Jul 2012, 09:25
primer_sistema: C64
Ubicación: Alicante

Re: Memoria RAM y como se escribe...

Mensajepor scooter » 28 Abr 2013, 11:47

En realidad esas "reservas" para variables, arrays etc son directivas del ensamblador o del compilador, la cpu es "tonta del todo" (al menos las que conozco) y le da lo mismo escribir o leer en donde sea, por eso en ocasiones se cuelga el sistema, si por error escribes en una posición en la que hay un programa el número de vidas (por ejemplo) interpretará es número de vidas como una instrucción veteasabercual y el sistema peta.
Cuando era joven el ensamblador era yo y mi hoja de papel con mi lápiz y tenía que llevar cuidado de no pisar cosas, ya de mayor el ensamblador era un programa en un pc mas o menos listo que generaba un código para el micro que en ese momento usaba, casi siempre un 8052.

Lo del aleatorio viene de lo que te han dicho; en la ram puedes leer o escribir donde quieras cuando quieras, desde el punto de vista de la memoria es aleatorio porque no sabe en que está pensando la cpu. Desde el punto de vista de la cpu es ordenada y coherente.
Por otra parte por ejemplo una memoria tipo CF no se tiene acceso al contenido así tal cual, hay un protocolo en el que se le pide a la memoria tal o cual dato o una ráfaga de datos que empiezan en xxxx y acaban en yyyy. No se puede ir pillando así sin mas esta posición y esta otra, es un poco mas complejo.


Volver a “PC Moderno”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 6 invitados