miércoles, 15 de septiembre de 2010

Direccion de Memoria y Acceso a Datos Pt. 1



Direcciones de memoria: En informática, una dirección de memoria es un identificador para una localización de memoria con la cual un programa informático o un dispositivo de hardware pueden almacenar un dato para su posterior reutilización. En aplicaciones informáticas las direcciones son asignadas por el sistema operativo a cada programa en ejecución, asegurándose éste, comúnmente por medio de un daemon, que las direcciones utilizadas por un ejecutable u otro proceso no se solapen o se escriba en posiciones protegidas de memoria, por ejemplo, en el sector de arranque.
Los sistemas operativos actuales son comúnmente diferenciados según el ancho de palabras soportado por sus registros, es decir 32 y 64 bits. Estas cifras se refieren a la máxima capacidad que dichos sistemas operativos pueden direccionar, así un sistema de 32 bits podría acceder y direccionar, sin utilizar memoria virtual, un máximo de 232 posiciones de memoria, usualmente designadas por un código hexadecimal. 


Vinculación de direcciones de memoria: carga dinámica, enlace dinámico, overlays:


Carga dinámica: No cargamos una rutina hasta que la necesitamos durante la ejecución.
- Llamada a la rutina
- Chequeo si la rutina está cargada.
- Llamada al cargador para cargar la rutina en la memoria.
- Cambio de las tablas de direcciones en el programa.


Enlace dinámico, o bibliotecas compartidas: La mayoria de los programas están enlazados con las bibliotecas de sistema. ¿Dónde está el desgaste? Cada uno tiene una copia de las bibliotecas en su binario. Una solución es las bibliotecas compartidas.
Para cada rutina de sistema que usamos, tenemos un stub (un fragmento de código) en el binario para encontrar o cargar la rutina.


Cuando llamamos al stub, se reemplaza con la dirección de la rutina.
No necesitamos reenlazar los programas cuando hay una versión nueva de la biblioteca.
Necesitamos apoyo del S.O. ¿Por qué?


Overlays (superposiciones).


Hasta ahora hemos asumido que todo el texto y los datos de un proceso pueden caber en memoria.
Si no hay bastante memoria, una posibilidad es estructuar el programa en trozos independientes (cada uno es un overlay). Los overlays son imágenes binarias.
- Usamos solamente un overlay a la vez, y lo cambiamos cuando necesitamos otro overlay.
El diseño del programa con overlays es muy complicado
Se usan overlays en los computadores y PCs primitivos que carecen de hardware para esquemas más avanzados.


Dirección lógica o virtual: una dirección generada por la CPU.
Dirección física: una dirección vista por la unidad de memoria.
Si cargamos programas en posiciones fijas en la memoria física, los dos tipos de direcciones son iguales. Pero si tenemos la habilidad de mover un proceso en memoria, son distintos. Un proceso tiene un espacio de direcciones virtuales y un espacio de direcciones físicas.

Intercambio o Swapping: Es un mecanismo o modo de interrelacionar la memoria principal (la que contiene el Programa en ejecución, los datos de proceso inmediato y los resultados intermedios) con la secundaria, de tal modo que se produce un intercambio de programas entre ambas cuyo resultado es la simulación de un sistema multitarea o la potenciación de memoria central a base de recursos de la memoria secundaria.
Microsoft Windows usa un fichero de intercambio desde su versión 3.1 (1992), la primera en usar memoria virtual. Lo implementa mediante un fichero situado en el directorio raíz (C:\) o en el de sistema (C:\WINDOWS\), y tiene por nombre:


386SPART.PAR en Windows 3.1
WIN386.SWP en Windows 3.11, 95 y 98
pagefile.sys en Windows NT y sucesores


En GNU/Linux se suele usar con una partición de intercambio, aunque también permite usar ficheros de intercambio. Se pueden asignar varios dispositivos de intercambio, incluso de diferentes tipos, y asignar a cada uno una prioridad. Si la prioridad es la misma en varios, las páginas de memoria se distribuirán como en un RAID de nivel 0. Esto permite que los dispositivos de swap se usen en paralelo, cosa que puede aumentar la eficacia, sobre todo si están en discos independientes.

Particiones de Memoria: 

Pueden ser tando como para los discos duros como para las memorias RAM:


- DD: Al momento de formatiar la unidad de disco duro se puede esta particionar, todo esto dependiendo de la memoria que posea el disco duro.
- Memoria Logica(RAM): La RAM es una memoria temporal que ocupan los programas en un determinado instante mientras se estén ejecutando y existen varios privilegios que se les puede  dar para reservarles memoria lógica(ram) y en ese momento el usuario puede realizarle particiones dinamicas.

La fragmentación interna: es la pérdida de espacio en disco debido al hecho de que el tamaño de un determinado archivo sea inferior al tamaño del cluster, ya que teóricamente el archivo estaría obligado a ser referenciado como un cluster completo. Los cluster(s) son contiguos de forma que desde el último bit del archivo situado en el cluster "a" hasta el primer bit del archivo situado en el cluster contiguo (es decir "b") queda un espacio sobrante siempre teniendo la condición de que el archivo del cluster "a" fuera más pequeño que el cluster en sí. Por eso se sugiere no disponer de un gran tamaño de partición en los discos nuevos donde la capacidad es muy importante. Por ejemplo si nuestro clúster es de 18KB (18.432 bytes) por más que un archivo ocupe menos, en nuestro disco ocupara 18KB. Esto sugiere una pérdida de ese espacio que dice utilizar pero no utiliza.

Fragmentación externa

Este tipo de fragmentación aparece como consecuencia de las distintas políticas de ajuste de bloques que tiene un sistema de ficheros, o al utilizar asignaciones dinámicas de bloques en el caso de la memoria. En el sistema de ficheros, la sucesiva creación y eliminación de ficheros de distintos tamaños puede conducir al aislamiento de los bloques libres de un disco y, dependiendo de la política de ajuste, su no elección para futuros ficheros.En la memoria del sistema la fragmentación se produce cuando los procesos asignados han ocupado posiciones no contiguas de memoria dejando demasiados bloques libres de pequeño tamaño, en los que no "caben" nuevos procesos.

Paginación: El concepto de almacenamiento a un sólo nivel, en el que la memoria secundaria aparece como una extensión de la memoria principal, se introdujo por primera vez en el ordenador Atlas de la Universidad de Manchester alrededor de 1960, y desde entonces ha ejercido una profunda influencia en el diseño de los ordenadores.
El almacenamiento a un sólo nivel puede llevarse a cabo mediante una técnica llamada paginación, según la cual el espacio de direcciones virtuales se divide en páginas del mismo tamaño (en el Atlas eran de 512 palabras). La memoria principal se divide también en marcos o páginas físicasdel mismo tamaño. Estos marcos son compartidos entre los distintos procesos que haya en el sistema, de forma que en cualquier momento un proceso dado tendrá unas cuantas páginas residentes en la memoria principal (sus páginas activas) y el resto en la memoria secundaria (sus páginas inactivas). El mecanismo de paginación cumple dos funciones:

a) Llevar a cabo la transformación de una dirección virtual a física, o sea, la determinación de la página a la que corresponde una determinada dirección de un programa, así como del marco, si lo hay, que ocupa esta página;

b) Transferir, cuando haga falta, páginas de la memoria secundaria a la memoria principal, y de la memoria principal a la memoria secundaria cuando ya no sean necesarias.


Segmentación: Divide la memoria en segmentos, cada uno de los cuales tiene una longitud variable, que está definida intrínsecamente por el tamaño de ese segmento del programa. Los elementos dentro de un segmento están identificados por su desplazamiento con respecto al inicio del segmento: la primera instrucción del programa, la séptima entrada de la pila, la quinta instrucción de la función Sqrt(), etc.

Las tablas de paginación o tablas de páginas: son una parte integral del Sistema de Memoria Virtual en sistemas operativos, cuando se utiliza paginación. Son usadas para realizar las traducciones de direcciones de memoria virtual (o lógica) a memoria real (o física) y en general el sistema operativo mantiene una por cada proceso corriendo en el sistema.
En cada entrada de la tabla de paginación (en inglés PTE, Page Table Entry) existe un bit de presencia, que está activado cuando la página se encuentra en memoria principal. Otro bit que puede encontrarse es el de modificado, que advierte que la página ha sido modificada desde que fue traída del disco, y por lo tanto deberá guardarse si es elegida para abandonar la memoria principal; y el bit de accedido, usado en el algoritmo de reemplazo de páginas llamado Menos Usado Recientemente (LRU, least recently used). También podrían haber otros bits indicando los permisos que tiene el proceso sobre la página (leer, escribir, ejecutar).
Tabla de segmentos: El SO mantiene una tabla de segmentos: La tabla es propia de cada programa. Se guardan las direcciones base y límite del segmento y otra información como 'tipo de acceso'.Al igual que en paginación, también se puede guardar la tabla de segmentos en registos o en memoria. Si es en memoria, existe un registro especial que indica dónde comienza la tabla de segmentos (STBR: Segment Table Base Register). Si el SO esta diseñado para usar muchos segmentos (extraño), se debe proveer algún sistema similar a TBL para optimizar el acceso a la tabla de segmentos.

Memoria Cache: La memoria caché de un procesador es un tipo de memoria volátil (del tipo RAM), pero de una gran velocidad. En la actualidad esta memoria está integrada en el procesador, y su cometido es almacenar una serie de instrucciones y datos a los que el procesador accede continuamente, con la finalidad de que estos accesos sean instantáneos.
Hay tres tipos diferentes de memoria caché para procesadores:


Caché de 1er nivel (L1):
Esta caché está integrada en el núcleo del procesador, trabajando a la misma velocidad que este. La cantidad de memoria caché L1 varía de un procesador a otro, estando normalmente entra los 64KB y los 256KB. Esta memoria suele a su vez estar dividida en dos partes dedicadas, una para instrucciones y otra para datos.


Caché de 2º nivel (L2):
Integrada también en el procesador, aunque no directamente en el núcleo de este, tiene las mismas ventajas que la caché L1, aunque es algo más lenta que esta. La caché L2 suele ser mayor que la caché L1, pudiendo llegar a superar los 2MB. A diferencia de la caché L1, esta no está dividida, y su utilización está más encaminada a programas que al sistema.


Caché de 3er nivel (L3):
Es un tipo de memoria caché más lenta que
la L2, muy poco utilizada en la actualidad. En un principio esta caché estaba incorporada a la placa base, no al procesador, y su velocidad de acceso era bastante más lenta que una caché de nivel 2 o 1, ya que si bien sigue siendo una memoria de una gran rapidez (muy superior a la RAM, y mucho más en la época en la que se utilizaba), depende de la comunicación entre el procesador y la placa base.


Unidad Administradora de Memoria MMU: Entre las funciones de este dispositivo se encuentran la traducción de las direcciones lógicas (o virtuales) a direcciones físicas (o reales), la protección de la memoria, el control de caché y, en arquitecturas de computadoras más simples (especialmente en sistemas de 8 bits), Bank switching. Cuando la CPU intenta acceder a una dirección de memoria lógica, la MMU realiza una búsqueda en una memoria caché especial llamada Buffer de Traducción Adelantada (TLB, Translation Lookaside Buffer), que mantiene la parte de la tabla de páginas usada hace menos tiempo. En esta memoria se mantienen entradas de la tabla de páginas (llamadas PTE por sus siglas en inglés, Page Table Entry), donde se pueden rescatar las direcciones físicas correspondientes a algunas direcciones lógicas, de forma directa. Cuando la dirección requerida por la CPU se encuentra en el TLB, su traducción a dirección real o física es entregada, en lo que se conoce como 'acierto en el TLB' ('TLB hit'). En otro caso, cuando la dirección buscada no se encuentra en el TLB (fallo en el TLB), el procesador busca en la tabla de páginas del proceso utilizando el número de página como entrada a la misma. En la entrada de la tabla de páginas del proceso se encuentra un bit de presencia, que indica si la página buscada está en memoria principal.