Hola invitado | [ Registrate | Entrar ]  
Menú principal

Usuarios On-Line
Bienvenido Invitado

El registro es completamente gratuito y podrás acceder a todas las partes de la web
Puedes registrarte aquí
Usuario:


Contraseña:


Recuérdame

Miembros:  Admins
No Conectado  krixer  
No Conectado  IVAJ  
No Conectado  JimmyJazz  
Miembros:  Colaboradores
No Conectado  Bel  
No Conectado  Tonajo  
Miembros:  Conectados 16
Invitados:  Invitados: 16
Miembros:  Miembros Online 0
No hay miembros conectados

Foros M-E
 Foro Modding-Espanol.com
Hardware ::  Memoria RAM y Almacenamiento
Administración de Memoria [Completo]

Moderado por: krixer, JimmyJazz

JimmyJazz Enviado: 20.01.2008, 18:39
Admin
Admin
JimmyJazz

Karma: 9

Total: 8
Registrado: jun. 2007
Mensajes: 88

Estado: Desconectado
Ultima visita: 06.08.08
INTRODUCCIÓN

Cuando arrancamos el ordenador, las primeras instrucciones que recibe el procesador son de la BIOS*. Estas primeras instrucciones hacen que el procesador detecte la memoria RAM, muestran por pantalla un bonito dibujo con el logo del fabricante de la BIOS, detectan unidades lectoras y de disco y finalmente buscan un punto de arranque de sistema en alguna de estas unidades.

*Ultimamente pasa que lo primero que nos muestra la pantalla es el logo de la targeta gráfica que tenemos pero weno no es nada importante.

Una vez encontrado el punto de arranque se carga el SO en memoria RAM y se pasa a su ejecución. Cuando está el SO cargado pues nos ponemos a jugar, se pone a funcionar un antivirus, ponemos música, ponemos el Mozilla... Cada vez que ejecutamos un programa, este se guarda primero en la memoria RAM y después se ejecuta, que pasa dentro de la memoria RAM, como se gestiona esto?

PRIMERA SOLUCIÓN

Cada vez que se ejecuta un programa, se movia a MP (Memoria Principal: a partir de ahora llamaremos así a la memoria RAM) y cuando se terminaba de utilizar el programa se devolvía a MS (Memoria Secundaria: a partir de ahora llamaremos así a los discos duros o discos externos) y se repite este proceso indefinidamente hasta que se terminan de ejecutar todos los programas. El problema de esto es que la interconexión entre MP y MS es una operación de entrada-salida, se trata de una operación muy lenta respecto al procesador y el tiempo que se tarda en hacer estas transferencias de datos el procesador no hace nada y como siempre esto es tiempo perdido, cosa que no gusta a los diseñadores.

PARTICIONES DE TAMAÑO FIJO

Se les ocurre particionar la MP en varios trozos de tamaño fijo, uno para el SO y el resto para las aplicaciones que se vayan ejecutando. El procesador se encarga de meter cada proceso en la partición de memoria más pequeña posible que esté disponible. Pero este sistema tiene un gran defecto y es que se desperdicia una gran cantidad de memoria. Imaginad que tenemos una RAM de 1024 KB y la tenemos particionada de la siguiente manera:

128KB -> Sistema Operativo
64 KB -> Para aplicación
192 KB -> Para aplicación
256 KB -> Para aplicación
384 KB -> Para aplicación

Ejecutamos un programa A que ocupa 156 KB, el procesador se encargaría de ponerlo en la partición de 192 KB que en este momento está vacía y es la más pequeña posible en la que cabe esta aplicación quedando nuestra memoria así:


128KB -> Sistema Operativo
64 KB -> Para aplicación
192 KB -> Aplicación A (156KB)
256 KB -> Para aplicación
384 KB -> Para aplicación

Ahora ejecutamos una aplicación B de 60 KB mientras se ejecuta la aplicación A. El procesador verá que cabe en la partición de 64 KB y que está libre, así que:

128KB -> Sistema Operativo
64 KB -> Aplicación B (60 KB)
192 KB -> Aplicación A (156KB)
256 KB -> Para aplicación
384 KB -> Para aplicación

Pero ahora ejecutamos una aplicación C de 32 KB, como podéis observar este programa entraría perfectamente en la partición de 64 KB pero está siendo utilizada, así como la de 192 por lo que el procesador la pondría en la de 256KB que es la más pequeña que hay libre:

128KB -> Sistema Operativo
64 KB -> Aplicación B (60 KB)
192 KB -> Aplicación A (156KB)
256 KB -> Aplicación C (32KB)
384 KB -> Para aplicación

Llegados a este punto el Sistema tiene 648 KB sin ocupar (más de la mitad) pero solo son utilizables 384 KB, ya que han quedado desaprovechados muchos espacios.


PARTICIONES DE TAMAÑO VARIABLE

Se les ocurrió la idea de que en el momento de ejecutar un programa se le asignara la cantidad de memoria exacta que necesitara, de manera que los procesos se van poniendo uno a continuación del otro ocupando el tamaño exacto y una vez finaliza el proceso, se borra el programa de MP dejando el espacio libre, pero vamos a ver que pasa con este sistema en un ejemplo con nuestra RAM anterior:

128 KB -> Sistema Operativo
896 KB -> Libres

Ejecutamos una aplicación A de 192 KB de manera que nuestra RAM quedará así:

128 KB -> SO
192 KB -> Aplicación A
704 KB -> Libres

Ejecutamos una aplicación B de 60 KB:

128 KB -> SO
192 KB -> Aplicación A
60KB -> Aplicación B
644 KB -> Libres

Finaliza la aplicación A, liberamos el espacio ocupado por ésta aplicación:

128 KB -> SO
192 KB -> Libres
60KB -> Aplicación B
644 KB -> Libres

Ejecutamos la aplicación C de 140 KB, esta aplicación se guardará en memoria en el primer espacio libre que encuentre, ocupando solo el tamaño que necesite:

128 KB -> SO
140 KB -> Aplicación C
52 KB -> Libres
60 KB -> Aplicación B
644 KB -> Libres

Si os fijais ahora quedan 52 KB ahí en medio que están sin ocupar pero es un espacio demasiado pequeño para que se pueda guardar ninguna aplicación. A medida que se van ejecutando programas esto va en aumento. A esto se llama fragmentación de memoria y el SO de vez en cuando se tiene que encargar de ir desfragmentando la memoria moviendo los programas de manera que queden consecutivos y dejando toda la memoria libre al final, pero esto consume recursos del procesador por lo tanto, aunque con este sistema no desperdiciemos memoria, volvemos a lo de siempre: tiempo perdido.


PAGINACIÓN

Finalmente hayan un sistema que permite gestionar la memoria a una velocidad relativamente rápida y sin desperdiciar grandes cantidades de memoria. La paginación consiste en dividir la memoria en fragmentos de tamaño muy pequeño y en el momento de ejecutar una aplicación dividir ésta también en fragmentos del mismo tamaño. Los fragmentos de programa se denominan páginas y los fragmentos de memoria en los que se guardan las páginas del programa se llaman marcos de página.

Gracias a este sistema, la memoria desaprovechada se minimiza muchísimo ya que como máximo, la memoria desperdiciada es un trocito del marco que contiene la última página de un programa. A ojos del SO la memoria será un conjunto de marcos ocupados por programas en ejecución y un conjunto de marcos libres de los cuales el SO mantiene una lista actualizada. El tamaño de los marcos lo define el procesador que en el caso de los Pentium es de 4 KB.

Este sistema permite que un programa en ejecución, no necesariamente esté grabado en memoria de forma contigua, sino que puede estar repartido por toda la memoria. Imaginad un proceso de 4 páginas y que nuestra memoria está así:

Marco 1 -> En uso
Marco 2 -> Libre
Marco 3 -> Libre
Marco 4 -> En uso
Marco 5 –> En uso
Marco 6 -> Libre
Marco 7 -> En uso
Marco 8 -> Libre
Marco 9 -> En uso

Cada página del programa puede ir en un hueco desocupado de memoria y gracias a la tabla que guarda el SO con los marcos y el contenido de cada marco, se puede ejecutar el programa sin perdidas de rendimiento. La memoria al ejecutar el programa quedaría así:

Marco 1 -> En uso
Marco 2 -> Página 1
Marco 3 -> Página 2
Marco 4 -> En uso
Marco 5 –> En uso
Marco 6 -> Página 3
Marco 7 -> En uso
Marco 8 -> Página 4
Marco 9 -> En uso


Sin olvidar que el SO guarda una lista con los marcos libres que se va actualizando de manera que antes de ejecutar el programa tendriamos en la lista los marcos {2,3,6,8} y tras la ejecución la lista quedaría vacía {}. Esta lista que administra el SO se denomina PDT (Page Description Table). La PDT también contiene la información sobre cada página contenida en los marcos de manera que el procesador en cada momento sepa encontrar la instrucción a ejecutar a continuación.


AMPLIACIÓN:
Hay que tener en cuenta una cosa, en los programas muchas veces se hacen saltos, como por ejemplo bucles o condiciones y esto para el procesador significa tener que estar constantemente calculando direcciones de memoria. Cuando se programa, todas las direcciones con las que se trabajan en los saltos son direcciones lógicas, nunca trabajaremos con direcciones físicas, es decir refiriéndonos a posiciones de memoria en concreto.

Cuando nosotros programamos no sabemos donde estará nuestro programa dentro de la memoria en el momento de ejecutarlo por lo que es absurdo poner posiciones de memoria concretas ya que direccionándonos a estas posiciones de memoria pasaríamos a ejecutar cualquier cosa. Imaginad que en un programa yo pongo que quiero saltar a la posición de memoria 14, pues a lo mejor en la posición 14 de memoria hay una instrucción que formatea mi disco duro, o a lo mejor lo que hay es un número cualquiera que no es una instrucción y el sistema se volvería inestable (que grande es Windows xD).

Las direcciones lógicas son direcciones que dependen del comienzo de nuestro programa, es decir, si nuestro programa empieza en la posición X, pues yo quiero saltar a la posición X+5 si no se cumple una condición determinada. Por ejemplo:

if ( x<6){
x++
}
else {
x=0
}

Si x es menor que 6 pasamos a la siguiente instrucción y después de hacer x++ saltaríamos las líneas else y x=0. Si x es igual o mayor que 6 saltaríamos la linea de x++. Nuestro procesador no entiende que significa if ni que significa else, es mas, no sabe que significa x++ ni x=0, todo esto lo traduce un compilador a código máquina y para que el procesador entienda estos saltos de línea que se producen en el programa el compilador lo que haría es poner una instrucción BNZ o BZ que son instrucciones de salto tras hacer una comparación y realizaría el salto sumando un número determinado al número de instrucción actual. Por ejemplo, si estamos en la instrucción 3 y en caso de que en el registro R5 haya un 0 quiero saltar 4 instrucciones hacia delante pues pondríamos BZ R5(5) -> Branch if zero in R5 4 positions (Saltar si hay un 0 en R5 4 posiciones).

Todo esto viene a que la tabla PDT que he explicado antes sirve también para guardar la instrucción del programa a partir de la cual empieza la página del programa guardado en memoria, de manera que en caso de que hayan saltos en nuestro programa, se toma como punto de referencia esta instrucción guardada en la PDT.


PAGINACIÓN POR DEMANDA Y MEMORIA VIRTUAL

La paginación por demanda consiste en guardar en MP solo las páginas del programa a ejecutar que se necesitan, ir poniendo las páginas en MP a medida que son solicitadas. Imaginad que tenemos un programa de muchas páginas y que a su vez utiliza bloques de datos de muchas páginas. En un intervalo de tiempo de ejecución puede ser que estemos en un bucle del programa en el que se ejecuten varias veces las mismas instrucciones y se utilicen los mismos datos repetidamente, pues no sería necesario cargar todo el proceso en MP, con tener las páginas que contengan el bucle y los datos utilizados bastaría para ejecutar el programa durante ese intervalo de tiempo. Si se produjese un salto de instrucción a una página no cargada se produciría una Falta de Página y el SO se encargaría de buscar en la MS la página solicitada y de cargarla en memoria.

Esto permite que al ordenador tener muchos más procesos en MP y ejecutar programas más grandes que ésta. El SO ha de ser hábil en el intercambio de páginas para que el rendimiento del procesador no se vea afectado, existen algoritmos de predicción que intentan predecir que páginas se utilizarán basándose en historiales de uso. La memoria real es la MP ya que los procesos en ejecución se encuentran en ésta, pero el programador percibe una memoria mucho mayor gracias a la memoria virtual distribuida por la MS. Sobretodo tener en cuenta que todo el proceso de la paginación es gestionado por el SO, el procesador solo interviene en este proceso al decidir el tamaño de los marcos que formarán la memoria, y se realiza el particionado al arrancar el ordenador, antes de cargar el SO.


GESTIÓN DE LA PAGINACIÓN

Pero en esto de la paginación no todo es felicidad:

Hay que tener en cuenta, sobretodo cuando trabajamos con memoria virtual que las entradas en las tablas de páginas pueden ser muy complejas. Pensad que las tablas que genera el SO se guardan en MP y que estas tablas pueden llegar a ser muy grandes y ocupar varias páginas, a fin de cuentas, la tabla no son más que datos que utiliza un programa que es el SO. Y la tabla puede estar dividida en páginas algunas de las cuales estarán en MP y otras estarán en MS. Hay que ir actualizando las tablas constantemente en caso de que las páginas pasen de MS a MP o viceversa para saber en cada instante la situación de cada página.

A parte, cuando en un programa accedemos a un dato o instrucción, no accederemos a memoria principal solo una vez, accederemos 2 veces, una para consultar la tabla de páginas y localizar la página en la que se encuentra el dato o instrucción y una vez localizada la página, accedemos otra vez a MP para coger el dato y si la página no se encontrase en MP habría que buscarla en MS y todavía perderíamos más tiempo. A fin de cuentas nos encontramos que con la paginación, cada vez que queremos acceder a memoria, se duplica el tiempo de acceso.

La solución que se encuentra es diseñar un sistema de caché específico para tablas de paginación llamadas TLB (Translation Look-aside Buffer) o ATC (Adress Translation Cache) el nombre depende de las marcas. Estas caches contienen las páginas activas en MP más utilizadas y el acceso a estas tablas es mucho más rápido que el acceso a tablas que estén en MP mejorando mucho el rendimiento del sistema.

Aquí tenéis un esquema de cómo sería un acceso a memoria en un sistema con paginación y TLB:

1. INICIO: Petición de acceso a una página desde un programa
2. El procesador comprueba si la página se encuentra en la TLB
3. Si se encuentra en TLB pasar al paso 13, si no, pasar al 4.
4. Se accede a la PDT de MP (las páginas que contienen la tabla PDT que hay en MP si que están en TLB por lo que el acceso a memoria para buscar las tablas en MP pasarían solo por los pasos 1, 2, 3 y 13)
5. Si la página está en PDT pasar al paso 12, si no, pasar al 6.
6. El SO hace al procesador buscar la página en MS.
7. La CPU activa el hardware de entrada y salida.
8. Se transfiere la página del disco a MP.
9. Si la MP tiene espacio libre pasar al paso 11, si no, pasar al 10.
10. Sustituir la página menos utilizada de MP por la transferida de MS.
11. Se actualiza la PDT y pasamos al paso 2.
12. Guardamos la entrada de la página en TLB para futuros accesos a esta página y pasamos al paso 13.
13. El procesador calcula la dirección física.


Siento si el esquema es de difícil comprensión en este formato, intentaré colgar un esquema visual y ponerlo como imagen en el post

Todo este proceso es muy complejo a nivel de hardware y consumiría muchos recursos del procesador si éste fuera el encargado de hacer toda esta gestión por lo que existen chips dedicados exclusivamente a la administración de memoria denominados MMU (Memory Management Unit).

A parte de todo lo descrito arriba, la MMU se encarga también de otras funciones:

-Asignación dinámica de memoria para manipular eficientemente el espacio de direcciones físicas.
-Implementación y manejo de la memoria virtual y del apartado de direcciones lógicas.
-Proporciona protección de memoria (o páginas) y seguridad en las tareas aislándolas entre si añadiendo bits en los Page Descriptors de las PDT, para evitar que por cualquier redundancia, un programa pueda coger datos de una página que no es de ese programa.
-Permite compartir datos y codigo en MP a varias aplicaciones simultáneamente.
-Genera interrupciones para que el SO cargue las páginas necesarias durante la ejecución de un programa.

La MMU se coloca entre la MP y el procesador para hacer de intermediario y liberar a la CPU de las tareas de gestión de memoria.


SEGMENTACIÓN

Otra idea que se les ocurrió a los diseñadores para asignar la memoria direccionable fue la segmentación y a diferencia de la paginación que es algo totalmente transparente al programador (transparente significa que no se ve), la segmentación permite al programador asignar espacios de memoria más grandes que las páginas para contener bloques de datos o código.

El programador en su programa puede declarar varios segmentos de datos o instrucciones y delimitarlos en tamaño y además puede dar a cada segmento atributos de acceso y uso de manera que puede impedir el acceso a un segmento de datos determinado si el programa que intenta acceder está en nivel de usuario y no en nivel de administrador.

A la hora de acceder a memoria, se necesita una tabla como la PDT que indique que segmentos y de que programas hay en memoria en cada instante y esta tabla utilizada en la segmentación es la SDT (Segment Descriptor Table). Cada línea de la tabla contiene un Segment Descriptor, una protección de acceso y el tamaño del segmento.

Respecto a la paginación, la segmentación aporta el hecho de que se puedan manejar bloques de datos y código de tamaño variable sin desperdiciar memoria, permite que varios programas compartan los mismos segmentos de datos o instrucciones ahorrando así espacio en memoria y finalmente potencia la protección de tareas ya que para acceder a segmentos de datos de nivel de administrador se necesitan permisos.

Hoy en día los procesadores permiten trabajar con los dos sistemas: Paginación y Segmentación. La MP queda estructurada en varios segmentos de código y datos de tamaño variable y a su vez estos segmentos están divididos en páginas del mismo tamaño. En el esquema anterior de los pasos a seguir para calcular una dirección de memoria habría que añadir antes de la consulta a la PDT, una consulta a la SDT para saber a partir de que página comienza el segmento al que queremos acceder.


Y aquí termina todo lo referente a la administración de memoria, espero que os haya gustado y no os haya sido muy pesado.

Saludos!!

PD. Podeis copiar el texto a otras webs si lo deseais, pero siempre, haciendo referencia al Autor y a la web de donde lo habeis sacado, en este caso, JimmyJazz y Modding-Espanol.com. Gracias




Ve lo que yo veo, siente como siento, salva como salvo, juzga como juzgo.
Top  Perfil del usuario Enviar MP WwW
CASSIUS Enviado: 26.01.2008, 21:59
Modder
Modder
CASSIUS

Karma: 2

Total: 5
Registrado: ene. 2008
Mensajes: 43

Estado: Desconectado
Ultima visita: 24.02.08
icon_evil

Exelente


¨un mundo nuevo no es mas que una nueva forma de pensar¨
Top  Perfil del usuario Enviar MP




Temas: 99, Mensajes: 403
Usuarios registrados | & | 0 invitado

Dadas para los 10 últimos minutos.
Powered by pnForum Version 2.6
 



Todos los logos y marcas registradas en este sitio son propiedad de sus respectivos dueños. Los comentarios son propiedad de sus autores, el resto es de Modding-Espanol.com © 2003 - 2008,

Puedes sindicar nuestras noticias usando el archivo backend.php