Sabemos que el ordenador cuenta con la memoria central o
principal, pero esta es limitada y, en grandes sistemas, insuficiente.
Al principio, para ubicar los procesos en memoria y solucionar este
problema, se adoptaron técnicas tales como dividir el programa en
partes denominadas capas. Cada una de las capas se iba
ejecutando (cargando en memoria) según fuera necesario; es
decir, primero se pasaría parte del programa del disco duro (o
soporte de almacenamiento) a la memoria, y cuando fuera
necesario utilizar otra parte del programa que no estuviese en
memoria central o principal (RAM), se accedería de nuevo al disco
para cargar la siguiente capa en memoria central.
Esta labor de dividir el programa en capas la puede realizar el
mismo programador mediante la división del programa en módulos
que se irán ejecutando según sea necesario, si bien esto supone un
elevado esfuerzo para él.
Fotheringam diseñó un método conocido como de memoria virtual.
Este diseñador pensó en la posibilidad de que al ubicar un
programa en memoria, este fuera demasiado grande para el
tamaño físico de aquella y creó una técnica para hacer que en
memoria permaneciera solo la parte del programa que se estuviera
ejecutando y que el resto quedara en el disco.
La Segmentación de memoria es un
esquema de manejo de memoria
mediante el cual la estructura del
programa refleja su división lógica
llevándose a cabo una agrupación
lógica de la información en bloques
de tamaño variable denominados
segmentos.
Cada uno de ellos tienen información
lógica del programa: subrutina, arreglo,
etc.
Luego, cada espacio de direcciones de programa consiste de
una colección de segmentos, que generalmente reflejan la
división lógica del programa.
Obviamente este sistema de gestión de memoria es utilizado en
Sistemas operativos avanzados, pero ya existían muestras de su
actividad desde los S.O.’s Unix y D.O.S.
La paginación difiere de la segmentación en que las páginas son
de tamaño fijo y los segmentos no.
El uso de la técnica de paginación o segmentación dependerá
del sistema operativo utilizado y de la máquina en la que lo
usemos, además de las necesidades del software.
Cada segmento tiene un nombre o número y una longitud. El
usuario por esto especifica cada dirección por dos cantidades: un
nombre de segmento y un desplazamiento.
Dado que ahora una dirección dentro de un programa del
usuario (dirección lógica), debe especificarse como una dirección
de 2 dimensiones, y dado que la memoria física es aún un arreglo
de una sola dimensión, es necesario implementar un dispositivo
que mapee o convierta una dirección de dos dimensiones en otra
de una sola dimensión. Esto se hace por medio de la tabla de
segmentos.
Supongamos que realizamos un programa y, para que se
ejecute, necesita utilizar tablas (estructuras de datos) en
memoria. Si tenemos en cuenta que una tabla puede
asignarse de forma estática o dinámica según las necesidades
del programa, habrá veces en que esta tabla necesitará un
espacio determinado en memoria, mientras que otras, este
espacio será mayor o menor según la necesidad. Gracias a la
segmentación podemos ubicar en memoria estas estructuras
de datos, independientemente del tamaño que tengan.
El ordenador, a través del sistema operativo, puede organizar
la memoria en bloques concretos y tener partes de
ella
destinadas a almacenar las estructuras de datos,que pueden
crecer o menguar según las necesidades del usuario o del
programa. Para ello se utilizarán las pilas de memoria o stacks,
en las que se gestionan las estructuras de datos necesarias.
Cada rutina del programa puede ser un bloque sujeto a cambios y
recopilaciones, sin afectar por ello al resto del programa.
Donde cada estructura tiene su propio tamaño y este puede
variar.(Stack)
Se puede proteger los módulos del segmento contra accesos no
autorizados.
Dos o más procesos pueden ser un mismo segmento, bajo reglas de
protección; aunque no sean propietarios de los mismos.
Puede evitarse realizar todo el proceso de enlace antes de comenzar
a ejecutar un programa. Los enlaces se establecerán solo cuando sea
necesario.
• El programador puede conocer las unidades lógicas de su
programa, dándoles un tratamiento particular.
• Es posible compilar módulos separados como segmentos el
enlace entre los segmentos puede suponer hasta tanto se haga
una referencia entre segmentos.
• Debido a que es posible separar los módulos se hace más fácil
la modificación de los mismos. Cambios dentro de un modulo
no afecta al resto de los módulos.
• Es fácil el compartir segmentos.
• Es posible que los segmentos crezcan dinámicamente según las
necesidades del programa en ejecución.
• Existe la posibilidad de definir segmentos que aun no existan.
Así, no se asignara memoria, sino a partir del momento que sea
necesario hacer usos del segmento. Un ejemplo de esto, serian
los Arrays
cuya dimensión no se conoce hasta tanto no se comienza a
ejecutar el programa. En algunos casos, incluso podría retardar la
asignación de memoria hasta el momento en el cual se referencia
el Array u otra estructura de dato por primera vez
• Hay un incremento en los costos de hardware y de software
para llevar a cabo la implantación, así como un mayor
consumo de recursos: memoria, tiempo de CPU, etc.
• Debido a que los segmentos tienen un tamaño variable se
pueden presentar problemas de fragmentación externas, lo
que puede ameritar un plan de reubicación de segmentos
en memoria principal.
• Se complica el manejo de memoria virtual, ya que los discos
almacenan la información en bloques de tamaños fijos,
mientras los segmentos son de tamaño variable. Esto hace
necesaria la existencia de mecanismos más costosos que los
existentes para paginación.
• Al permitir que los segmentos varíen de tamaño, puede
ser necesarios planes de reubicación a nivel de los discos, si los
segmentos son devueltos a dicho dispositivo; lo que conlleva a
nuevos costos.
• No se puede garantizar, que al salir un segmento de la
memoria, este pueda ser traído fácilmente de nuevo, ya que
será necesario encontrar nuevamente un área de memoria
libre ajustada a su tamaño.
Descargar

Descarga