Escolar Documentos
Profissional Documentos
Cultura Documentos
ADMISTRACIN DE LA MEMORIA
Durante este nuevo tema nos enfrentaremos con el problema de la gestin de la memoria.
Haremos un breve estudio preliminar de las posibles alternativas y variantes a la hora de organizar y
administrar el espacio de direcciones de un sistema. Esta primera toma de contacto nos servir de
excusa para introducir algunos conceptos generales, que se irn desarrollando luego.
Empezaremos por el tipo de gestin ms bsico, el de los sistemas de monoprogramacin
que apenas necesitan de ninguna organizacin. La irrupcin de los sistemas multiprogramados hace
necesario tomar decisiones sobre aspectos tan diversos como cunto espacio se dedica a cada
proceso, de qu modo se le asigna, en qu lugar se ubica, durante cunto tiempo permanece en
memoria, qu sucede si no existe suficiente espacio o cmo se protege frente a accesos ajenos.
Todos estos factores sern valorados primero para tcnicas de asignacin contigua(particiones
estticasy dinmicas) y para mtodos de asignacin no contigua (paginacin, segmentaciny
segmentacin paginada). Tambin se discutir el soporte hardware, y el grado de proteccin y
comparticin que es posible con cada uno de los esquemas. Dentro del segundo paquete de
estrategias de administracin de la memoria tendrn un particular inters los esquemas de traduccin
de direcciones, por su repercusin en el tiempo efectivo de acceso a memoria y, por tanto, en el
rendimiento del sistema.
Jerarqua de la memoria
Los programas y datos necesitan estar en la memoria principal para ser ejecutados, o para
poder ser referenciados. Los programas o datos que no se necesitan de inmediato pueden guardarse
en la memoria secundaria hasta que se necesiten, y en ese momento se transfieren a la memoria
principal para ser ejecutados o referenciados. Los soportes de memoria secundaria, como cintas o
discos, son en general menos caros que la memoria principal, y su capacidad es mucho mayor.
Normalmente, es mucho ms rpido el acceso a la memoria principal que a la secundaria.
En los sistemas con varios niveles de memoria hay muchas transferencias constantes de
programas y datos entre los distintos niveles. Estas transferencias consumen recursos del sistema,
como tiempo de la CPU, que de otro modo podran utilizarse provechosamente.
En los aos sesenta se hizo evidente que la jerarqua de la memoria poda extenderse un
nivel ms, con una clara mejora del rendimiento. Este nivel adicional, la memoria cach, es una
memoria de alta velocidad, mucho ms rpida que la memoria principal. La memoria cach es
extremadamente cara, si se compara con la principal, por lo que slo se utilizan memorias cach
relativamente pequeas. La figura 6.1 muestra la relacin que existe entre la memoria cach, la
principal y la secundaria.
La memoria cach introduce un nivel adicional de transferencia de informacin en el sistema.
Los programas en memoria principal se pasan a la memoria cach antes de ejecutarse. En la
memoria cach se pueden ejecutar mucho ms rpido que en la principal. La esperanza de los
diseadores es que el trabajo extra requerido por la transferencia de programas sea mucho menor
que el incremento del rendimiento obtenido por la ejecucin ms rpida en la cach.
El esquema de los registro base y lmite sigue siendo vlido para la reasignacin y la
proteccin. Otro tema a tener en cuenta es la cantidad de memoria por asignar a un proceso recin
creado. Si los procesos se crean con un tamao fijo invariante, la asignacin es muy sencilla, se
asigna exactamente lo que se necesite.
Si, por el contrario, los segmentos de datos de los procesos pueden crecer, como es el caso
de la asignacin dinmica de memoria a partir de una pila, que ocurre en muchos lenguajes de
programacin, aparece un problema cuando un proceso intenta crecer. Si hay un hueco adyacente al
proceso, ste puede ser asignado, y el proceso podr crecer hacia el hueco. Sin embargo, si el
proceso es adyacente a otro proceso, el proceso de crecimiento deber ser desplazado a un hueco de
la memoria lo suficientemente grande; o bien, habr que eliminarlo.
Si es de esperar que la mayora de los procesos crezcan conforme se ejecuten, sera una
buena idea asignar un poco de memoria adicional siempre que un proceso pase a la memoria, con el
fin de reducir el gasto excesivo
asociado con el traslado de
procesos que ya no caben en
su memoria asignada. En la
figura
5-a
vemos
una
configuracin de la memoria en
la que se asign a dos procesos
el espacio adicional para el
crecimiento.
Si los procesos pueden
tener dos segmentos de
crecimiento, como por ejemplo,
el segmento de datos, que se
utiliza como una pila, y el stack,
se
sugiere
un
mtodo
alternativo, el de la figura 5-b.
En esta figura se puede ver que
cada proceso tiene un stack de
crecimiento hacia abajo, en la
parte superior de la memoria
asignada a l; adems, tiene un segmento de datos justo encima del programa, el cual crece hacia
arriba. La memoria entre ellos se puede utilizar para cualquiera de los segmentos. Si el espacio se
agota, puede ocurrir que el proceso sea desplazado a un hueco con el espacio suficiente; o bien, ser
aniquilado.
Figura 6.6. (a) Una parte de la memoria, con cinco procesos y 3 huecos. La marca muestra
las unidades de asignacin de la memoria. Las regiones sombreadas ( 0 en el mapa de bits) estn
libres. (b) El mapa de bits correspondiente. (c) La misma informacin como lista enlazada.
6.4.3 Estrategias de colocacin
Cuando en un sistema de particiones dinmicas se debe asignar memoria principal para un
nuevo proceso, y los procesos y huecos se mantienen en una lista ordenada por direcciones, se
pueden utilizar diversos algoritmos para la eleccin del hueco de memoria donde ubicar al proceso.
Supongamos que se conoce la cantidad de memoria por asignar.
El algoritmo ms simple es el primero en ajustarse (first fit). Se revisa la lista de huecos
hasta encontrar un espacio lo suficientemente grande. El espacio se divide entonces en dos partes,
una para el proceso, y otra para la memoria no utilizada, excepto en el caso poco probable de un
ajuste perfecto. Este algoritmo es rpido, ya que busca lo menos posible.
Otro algoritmo es el mejor en ajustarse (best fit), el cual busca en toda la lista, y elige el
mnimo hueco suficientemente grande como para ubicar al proceso. Este algoritmo intenta que los
huecos que se creen en la memoria sean lo ms pequeos posible.
Como ejemplo de los algoritmos, retomemos la figura 6.6. Si se necesita un bloque de tamao
2, el primero en ajustarse asignar el espacio en 5, mientras que el mejor en ajustarse asignar el
espacio en 18.
Realizando simulaciones se ha demostrado que el algoritmo del mejor ajuste desperdicia
ms la memoria, pues al crear huecos demasiado pequeos, stos no pueden ser utilizados por
procesos. Un algoritmo que enfrenta el problema de la manera contraria es el del peor ajuste (worst
fit). En este algoritmo se elige el hueco ms grande disponible. De esta forma aumenta la
probabilidad de que el nuevo hueco creado sea lo suficientemente grande como para albergar un
proceso.
6.4.4 Intercambio (swapping)
En un sistema con particiones estticas el nmero de procesos con posibilidades de estar en
estado listo viene determinado por el nmero de particiones, y en uno de particiones dinmicas por el
tamao de la memoria principal y el tamao de los procesos, ya que en ambos mtodos un proceso
permanece en una particin hasta que finaliza. Supongamos un sistema en que dicho nmero es
cinco, es muy probable que en un momento dado los cinco procesos que ocupan las particiones estn
bloqueados (por ejemplo, porque esperan la finalizacin de una operacin de E/S). Mientras los cinco
procesos permanezcan bloqueados se desperdicia la CPU. Para remediar este inconveniente muchos
sistemas operativos optaron por permitir ejecutar concurrentemente ms procesos de los que pueden
entrar fsicamente en la memoria principal del ordenador. Para ello se utiliza la memoria secundaria
(generalmente los discos) que, aunque ms lenta, tiene mayor capacidad de almacenamiento que la
principal. La solucin consiste en tener en disco una copia de la parte de la memoria que ocupa todo
proceso. En el disco se encuentran todos los procesos, en la memoria slo unos cuantos. Para que un
proceso se pueda ejecutar debe residir en memoria principal.
La razn por la que se aumenta el nmero de procesos con posibilidades de tener
instrucciones en memoria principal es porque cuanto mayor sea este nmero, es menos probable que
se d la circunstancia de que todos estn bloqueados y, por lo tanto, es menor la posibilidad de que la
CPU permanezca inactiva.
Algunos sistemas UNIX utilizaban el intercambio en un sistema de particiones dinmicas. El
movimiento de procesos entre la memoria principal y el disco lo realizaba el planificador de nivel
medio, conocido como el intercambiador (swapper a medio plazo). El intercambio de la memoria
principal al disco (swapping out) se iniciaba cuando el S.O. precisa memoria libre y estaba toda ocupa
debido a alguno de los siguientes eventos:
- Una llamada al sistema fork que necesitaba memoria para un proceso hijo.
- Una llamada al sistema brk de solicitud de memoria dinmica en un proceso que no tiene
suficiente memoria libre como para aceptar la peticin.
- Una pila que se agranda, y ocupa un espacio mayor al asignado.
Adems, cuando haba que recuperar un proceso presente en el disco (swapping in) desde
hace mucho tiempo con frecuencia se necesitaba sacar a otro proceso de memoria a disco para
disponer de espacio para el primero.
El intercambiador elega una vctima al examinar los procesos bloqueados en espera de algo
(por ejemplo, una entrada del terminal). Es mejor sacar a un proceso bloqueado (pasar a estado
suspendido_bloqueado) que sacar a uno listo. Si existan varios procesos bloqueados ubicados en
la memoria principal se elega a uno cuya combinacin de prioridad y tiempo de residencia en
memoria principal fuera ms desfavorable. As, un buen candidato era un proceso que hubiera
consumido mucho tiempo de CPU recientemente, al igual que uno que hubiera permanecido en la
memoria durante mucho tiempo, aun cuando durante este tiempo hubiera realizado E/S. Si no se
dispone de procesos bloqueados, entonces se elega a un proceso listo en base a los mismos
criterios.
Cada pocos segundos el intercambiador examinaba la lista de procesos intercambiados para
ver si alguno estaba listo para su ejecucin. En caso de que existiera alguno, se seleccionaba a aquel
que hubiese permanecido en el disco durante mucho tiempo. A continuacin el intercambiador
verificaba si el intercambio sera fcil o difcil. Un intercambio fcil era aquel en el que existiera la
suficiente memoria libre, de forma que no haba necesidad de sacar a un proceso para hacer espacio
para el nuevo. Un intercambio difcil precisaba la eliminacin de uno o ms procesos. La implantacin
de un intercambio fcil se llevaba a cabo al traer el proceso a la memoria. Un intercambio difcil se
implantaba liberando primero la memoria suficiente sacando a disco a uno o ms procesos, y
despus, cargando en la memoria el proceso deseado.
Este algoritmo se repeta hasta que se cumpliera alguna de estas condiciones: (1) ningn
proceso en el disco est suspendido_listo; o (2) la memoria est tan ocupada por procesos recin
trados que no hay espacio para ms. Para evitar un trasiego excesivo entre memoria y disco que
pudiera afectar al rendimiento no se intercambiaba hacia el disco a un proceso hasta que hubiera
permanecido en la memoria durante 2 segundos.
El espacio libre en la memoria principal y en el dispositivo de intercambio se registraba
mediante una lista enlazada de huecos. Si se necesitaba espacio en alguno de los dos, el algoritmo
del primero en ajustarse lea la lista adecuada de huecos, y devolva el primer hueco que encontrara y
que fuese lo bastante grande, a la vez que eliminaba este espacio de la lista de huecos.
10
Las direcciones a las que hace referencia un proceso en ejecucin, en este esquema, se
llaman direcciones virtuales. El intervalo de direcciones virtuales a las que puede hacer referencia
un proceso en ejecucin se llama espacio de direcciones virtuales, V, del proceso. El intervalo de
direcciones reales de la memoria principal de un ordenador concreto se llama espacio de
direcciones reales, R. El nmero de direcciones de V se denota |V|, y el nmero de direcciones de R,
|R|. En los sistemas de almacenamiento virtual ya implantados lo normal es que |V| >> |R|, aunque se
han construido sistemas en los que |V| < |R|.
La memoria virtual es una tcnica de gestin de la memoria que posibilita que el espacio de
direcciones virtuales sea mayor al espacio de direcciones reales. En otras palabras, se permite hacer
programas de tamao mayor al de la memoria principal. Para lograr esto, el sistema operativo se
encarga de mantener en la memoria principal solamente aquellas partes del espacio de direcciones
del proceso que actualmente estn siendo referenciadas, el resto permanece en disco.
La memoria virtual se basa en el hecho de que muchos programas presentan un
comportamiento conocido como operacin en contexto, segn el cual, en cualquier intervalo
pequeo de tiempo un programa tiende a operar dentro de un mdulo lgico en particular, sacando
sus instrucciones de una sla rutina y sus datos de una sla zona de datos. De esta forma, las
referencias de memoria de los programas tienden a agruparse en pequeas zonas del espacio de
direcciones. La localidad de estas referencias viene reforzada por la frecuente existencia de bucles:
cuanto ms pequeo sea el bucle, menor ser la dispersin de las referencias. La observacin de
este comportamiento conduce al postulado (Denning, 1970) del llamado principio de localidad: "Las
referencias de un programa tienden a agruparse en pequeas zonas del espacio de direcciones.
Estas zonas, adems, tienden a cambiar slo de forma intermitente".
La validez del principio de localidad vara de programa en programa: ser, por ejemplo, ms
vlido en programas que lleven a cabo accesos secuenciales a vectores que en programas que
accedan a estructuras complejas de datos.
La memoria virtual se compagina con la multiprogramacin. Al no tener que almacenar los
procesos enteros en la memoria, pueden entrar ms en la memoria principal, con lo que es ms
probable que siempre exista un proceso en estado listo. Por otro lado, cuando un proceso espera a
que se cargue en la memoria principal parte de su cdigo o datos, se inicia una E/S con el disco.
Mientras dura dicha E/S la CPU puede ejecutar otro proceso.
Aunque los procesos
slo hacen referencia a
direcciones virtuales, deben
ejecutarse en la memoria real.
Por lo tanto, durante la
ejecucin de un proceso es
preciso
establecer
la
correspondencia entre las
direcciones virtuales y las
reales. Como se ver ms
adelante
esta
correspondencia
debe
realizarse de una manera
rpida, pues si no, se
ralentizara demasiado el
tiempo de ejecucin de los
procesos.
Se han desarrollado
varios mtodos para asociar
las direcciones virtuales con
las reales. Los mecanismos
de traduccin dinmica de
direcciones
convierten
la
direcciones
virtuales
en
direcciones reales en tiempo
11
de ejecucin. Todos estos sistemas tienen la propiedad de que las direcciones contiguas en el espacio
de direcciones virtuales de un proceso no son necesariamente contiguas en la memoria principal. Esto
se conoce como contigidad artificial (fig. 6.8). Debe quedar claro que toda esta correspondencia es
transparente al programador, que escribe sus programas en trminos de direcciones consecutivas de
memoria virtual.
6.5.1 Esquema general de traduccin
Los mecanismos de traduccin dinmica de direcciones deben mantener mapas de
correspondencia de traduccin de direcciones que indiquen qu localidades de la memoria virtual
estn en memoria principal en un momento dado y dnde se encuentran.
Existen dudas en cuanto a si los bloques en que se dividen los procesos deben ser del mismo
tamao o de tamaos diferentes. Cuando los bloques son del mismo tamao, se llaman pginas, y la
organizacin de la memoria virtual correspondiente se conoce como paginacin. Cuando los bloques
pueden tener tamaos diferentes se llaman segmentos, y la organizacin de la memoria virtual
correspondiente se llama segmentacin. Algunos sistemas combinan ambas tcnicas, con segmentos,
que son entidades de tamao variable, compuestas de pginas de tamao fijo ( Segmentacin
paginada ).
Las direcciones en un sistema de correspondencia son bidimensionales. Para referirse a un
elemento en particular, el programa especifica el bloque en el que se encuentra el elemento, y su
desplazamiento a partir del inicio del bloque. Una direccin virtual, v, se denota por un par ordenado
(b,d), donde b es el nmero de bloque en el que se encuentra el elemento al que se hace referencia, y
d es el desplazamiento a partir del inicio del bloque.
La traduccin de una direccin virtual v = (b,d) a una direccin real, r, se ejecuta de la
siguiente forma (fig. 9). Cada proceso tiene su propia tabla de correspondencia de bloques, mantenida
por el sistema operativo dentro de la memoria principal. Un registro especial dentro de la CPU,
denominado registro de origen de la tabla de correspondencia de bloques, se carga con la direccin
real, a, de la tabla de correspondencia de bloques del proceso durante el cambio de proceso. La tabla
contiene una entrada por cada bloque del proceso, y las entradas siguen un orden secuencial para el
bloque 0, el bloque 1, etctera. Ahora se suma el nmero de bloque, b, a la direccin base, a, de la
tabla de bloques, para formar la direccin real de la entrada del bloque b en la tabla de
correspondencia de bloques. Esta entrada contiene la direccin real, b', de inicio del bloque b. El
desplazamiento, d, se suma a la direccin de inicio del bloque, b', para formar la direccin real
deseada, r = b' + d.
12
13
As pues, cada vez que la CPU genere una direccin de memoria sta es transformada por
una unidad hardware, de forma que en el bus del sistema se introduce la direccin fsica
correspondiente. Es importante observar que la paginacin es en s misma una forma de reubicacin
dinmica. Cada direccin lgica es transformada en alguna direccin fsica por el hardware de
paginacin. Observe tambin que si el tamao de pgina (como es lo usual) es una potencia de dos,
el hardware no precisa realizar ninguna divisin, simplemente sabe que los ltimos n bits, si el tamao
de pgina es de 2n , representan el desplazamiento, y los primeros bits la pgina.
Cada proceso debe tener su propia tabla de pginas, y su direccin de comienzo en la
memoria principal forma parte de la porcin del PCB utilizada para realizar un cambio de proceso.
14
15
Con el fin de que se pueda hacer referencia a todas las pginas activas a travs de un PAR,
hay que disponer de tantos como marcos haya en la memoria. Ello es posible en sistemas con una
memoria principal reducida (como por ejemplo, el Atlas), pero en sistemas mayores no es viable,
desde el punto de vista econmico, disponer de todos los PARs necesarios para ello (aunque es de
esperar que estos argumentos de tipo econmico cambien a medida que se desarrolla la tecnologa).
Se puede llegar a una solucin de compromiso, guardando para cada proceso una tabla de pginas
completa en la memoria, y utilizando una pequea memoria asociativa para referenciar unas pocas
pginas asociadas a los procesos activos ms recientes. En este caso, el marco al que har
referencia cada PAR, no vendr implcito por la situacin de ste, sino que deber incluirse como un
campo adicional en el mismo PAR. El hardware de direccionamiento de la memoria lleva a cabo,
entonces, la operacin de transformacin de direcciones que se muestra en la figura 6.12. Como
antes, slo se requiere la intervencin del software en el caso de que haya que sustituir una pgina.
Un problema que no ilustra la figura 6.11 es el de distinguir en la memoria asociativa las
pginas asociadas al proceso en ejecucin de las pginas correspondientes a otros procesos. Una
solucin consistira en ampliar los PARs para incluir la identificacin de los procesos, junto con el
nmero de la pgina. Cada direccin que se presente a la memoria asociativa deber incluir, segn
esto, el identificador del proceso junto con los bits de la pgina.
Evidentemente, es de desear que la memoria asociativa contenga los nmeros de las pginas
a las que haya mayores posibilidades de acceder. Lamentablemente, no existe ningn algoritmo
general que nos asegure que as suceda (vase el siguiente tema). En la prctica se cargan
cclicamente en la memoria asociativa las direcciones de las pginas a las que se ha hecho referencia
con ms frecuencia recientemente. Este algoritmo, ms bien primitivo, es, de hecho, bastante eficaz.
El porcentaje de veces que se encuentra un nmero de pgina entre los registros asociativos
est relacionado claramente con el nmero de registros asociativos. Con 8 o 16 registros asociativos,
puede obtenerse un porcentaje del 80 al 90%. Un porcentaje del 80% significa que el 80% de las
veces encontramos el nmero de pgina deseado entre los registros asociativos. Si explorar los
registros asociativos lleva 50 nanosegundos, y 750 nanosegundos acceder a memoria, entonces un
acceso a memoria "mapeada" lleva 800 nanosegundos cuando el nmero de pgina se encuentra en
los registros asociativos. Si no conseguimos encontrar el nmero de pgina (50 ns), entonces
tenemos que acceder a la memoria en primer lugar para buscar el nmero de marco en la tabla de
pginas (750 ns) y entonces acceder a la palabra deseada en memoria (750 ns), dando en total 1550
nanosegundos. Para encontrar el tiempo efectivo de acceso a memoria, tenemos que ponderar
cada caso con su probabilidad:
t. efectivo de acceso a memoria = 0,80 x 800 + 0,20 x 1550 = 950 ns
16
En este ejemplo, sufrimos un 26,6% de retardo en el tiempo de acceso a memoria (de 750 a
950 nanosegundos).
17
18
traduce las direcciones lgicas en direcciones fsicas. Esta operacin permanece oculta al usuario, y
la controla el sistema operativo.
Un resultado de la distincin entre direcciones fsicas y lgicas es que de hecho pueden no
ser iguales. Por ejemplo, en el XDS-940, una direccin lgica es de 14 bits y una direccin fsica es de
16 bits. Un nmero de pgina de 3 bits se usa como ndice en la tabla de pginas para seleccionar un
nmero de marco de 5 bits. As, puede haber hasta 4 veces ms memoria fsica que la que un usuario
puede direccionar.
Esta tcnica fue adoptada en particular por los fabricantes de miniordenadores. Muchos
miniordenadores fueron diseados en los aos 60, cuando la memoria era cara y los programas
tenan que ser pequeos. De esta manera las direcciones estaban limitadas a 15 o 16 bits. Con la
disponibilidad de la memoria de semiconductores, ms barata, se hizo factible aumentar la memoria
fsica de estos miniordenadores. Pero incrementar el tamao de la direccin para obtener direcciones
de 17 o 18 bits, precisas para la memoria fsica aumentada, significaba, o bien redisear el conjunto
de instrucciones, o bien extender el tamao de palabra para acomodar los bits extra. Cualquier
solucin implicara un cambio importante, invalidando todos los programas y documentacin
existentes. La solucin que adoptaron la mayora de los fabricantes fue el mapping de memoria. Las
direcciones lgicas (15 o 16 bits), se transforman en direcciones fsicas (17 o 18 bits).
Multiprogramando el sistema, puede utilizarse toda la memoria. Sin embargo, los usuarios individuales
no pueden emplear ms memoria que antes, puesto que el espacio para la direccin lgica no ha sido
incrementado. No obstante, hay que tener claro que en los sistemas actuales el rango de direcciones
virtuales suele ser muy superior al rango de direcciones reales.
El sistema operativo controla esta transformacin, y puede activarla para el usuario y
desactivarla para el sistema operativo. Puesto que el sistema operativo gestiona memoria fsica, tiene
que estar al tanto de la memoria fsica: qu marcos estn asignados, qu marcos estn disponibles,
cuntos marcos hay en total, etc. Esta informacin se mantiene generalmente en una estructura
denominada tabla de marcos. La tabla de marcos tiene una entrada para cada marco, que indica si
est libre o asignado y, si est asignado, a qu pgina de qu proceso.
Adems, el sistema operativo tiene que conocer qu procesos de usuario operan en el
espacio de usuario, y tiene que transformar todas las direcciones lgicas para generar direcciones
fsicas. Si un usuario realiza una llamada al sistema (para realizar E/S) y da una direccin como
parmetro (por ejemplo, un buffer), esa direccin tiene que ser traducida para generar la direccin
fsica correcta. El sistema operativo puede utilizar la direccin de la tabla de pginas del proceso (que
se guarda en su descriptor o PCB) para traducir las direcciones lgicas en fsicas siempre que tenga
que realizar por l mismo la operacin.
19
6.5.3 Segmentacin
Un aspecto importante de la gestin de la memoria que la paginacin convierte en inevitable
es la separacin de la visin que el usuario tiene de la memoria y la memoria fsica real. La visin del
usuario no coincide con la memoria fsica real. La visin del usuario se transforma en la memoria
fsica. La traduccin de direcciones permite esta diferencia entre la memoria lgica y la fsica.
6.5.3.1 Visin del usuario de la memoria
Cul es la visin de la memoria que tiene el usuario ? Concibe el usuario la memoria como
una tabla lineal de palabras, algunas de las cuales contienen instrucciones mientras que otras
contienen datos, o bien se prefiere alguna otra visin de la memoria ? Hay un acuerdo general en que
el usuario o programador de un sistema no piensa en la memoria como una tabla lineal de palabras.
Ms bien prefieren concebirla como una coleccin de segmentos de longitud variable, no
necesariamente ordenados (fig. 6.14).
20
el programa de entrada. Un compilador de Pascal podra crear segmentos separados para (1) las
variables globales, (2) la pila de llamada de procedimientos, para almacenar parmetros y devolver
direcciones, (3) el cdigo de cada procedimiento o funcin, y (4) las variables locales de cada
procedimiento y funcin. El cargador tomara todos esos segmentos y les asignara nmeros de
segmento.
6.5.3.2 Hardware
Aunque el usuario ahora puede referenciar los objetos del programa por medio de una
direccin de dos dimensiones, la memoria fsica real es todava, por supuesto, una secuencia
unidimensional de palabras. La transformacin se efecta por medio de una tabla de segmentos.
El empleo de una tabla de segmentos se muestra en la figura 6.15. Una direccin lgica
consta de dos partes: un nmero de segmento s y un desplazamiento dentro de ese segmento, d. El
nmero de segmento se utiliza como un ndice en la tabla de segmentos. Cada entrada de la tabla de
segmentos tiene una base de segmento y un lmite. El desplazamiento d de la direccin lgica tiene
que estar comprendido entre 0 y el lmite de segmento. En caso contrario se produce una excepcin
al sistema operativo (tentativa de direccionamiento lgico ms all del fin de segmento). Si este
desplazamiento es legal, se aade a la base para producir la direccin de la tabla deseada en la
memoria fsica. La tabla de segmentos es as esencialmente una matriz de pares registros
base/lmite.
21
conjunto de bits de control de acceso que especifican acceso denegado, acceso de slo lectura, o
acceso de lectura/escritura al segmento.
El Burroughs B5500 permita 32 segmentos de hasta 1024 palabras cada uno. Estas
especificaciones definan un nmero de segmento de 5 bits y un desplazamiento de 10 bits. Sin
embargo, la experiencia con este sistema mostr que los segmentos eran pocos y que el lmite del
tamao del segmento era demasiado pequeo (las tablas mayores de 1K tenan que fragmentarse
entre varios segmentos). Por ello, el GE 645 utilizado por Multics permite hasta 256 K-segmentos de
hasta 64 K-palabras.
Con tantos segmentos no es factible mantener la tabla de segmentos en registros, de modo
que tiene que mantenerse en memoria. Un registro de base de tabla de segmentos (STBR) apunta a
la tabla de segmentos. Puesto que el nmero de segmentos utilizado por un programa puede variar
ampliamente, tambin se utiliza un registro de longitud de tabla de segmentos (STLR). En el caso de
una direccin lgica (s, d) verificamos primero que el nmero de segmento s es legal (s < STLR),
Entonces, aadimos el nmero de segmento al STBR resultando la direccin en memoria de la
entrada de la tabla de segmentos (STBR + s). Esta entrada se lee en la memoria y actuamos igual
que antes: se verifica el desplazamiento frente a la longitud de segmento, y se calcula la direccin
fsica de la palabra deseada como la suma de la base del segmento y el desplazamiento.
Igual que con la paginacin, esta transformacin requiere dos referencias a memoria por
direccin lgica, el ordenador disminuir su velocidad en un factor de 2, a menos que se haga algo
para evitarlo. La solucin normal consiste en utilizar un conjunto de registros asociativos para
mantener las entradas utilizadas ms recientemente en la tabla de segmentos. Un conjunto de
registros asociativos relativamente pequeo (8 \ 16) puede reducir generalmente el retardo a los
accesos a memoria hasta no ms all de un 10% o 15% ms lentos que los accesos a memoria
"mapeada".
22
Tambin es posible compartir solo partes de programas. Por ejemplo, subrutinas de uso
frecuente pueden compartirse entre muchos usuarios definindolas como segmentos de slo lectura
compartibles. Por ejemplo, dos programas Fortran pueden utilizar la misma subrutina Sqrt, pero slo
ser precisa una copia fsica de la rutina Sqrt.
Aunque esta comparticin parece ser bastante sencilla, tiene algunas sutilezas. Tpicamente,
los segmentos de cdigo tienen referencias a s mismos. Por ejemplo, un salto condicional tiene
normalmente una direccin de transferencia. La direccin de transferencia es un nombre de segmento
y un desplazamiento. El nmero de segmento de la direccin de transferencia ser el del segmento de
cdigo. Si tratamos de compartir este segmento, todos los procesos que lo compartan tienen que
definir el segmento de cdigo compartido con el mismo nmero de segmento.
Por ejemplo, si queremos compartir la rutina Sqrt y un proceso quiere definirla como
segmento 4 y otro lo hace como segmento 17, cmo podra la subrutina Sqrt referenciarse a s
misma? Puesto que solamente hay una copia fsica de Sqrt, tiene que referenciarse a s misma de la
misma manera para ambos usuarios: tiene que tener un nmero de segmento nico. A medida que
crece el nmero de usuarios que comparten el segmento, tambin crece la dificultad de encontrar un
nmero de segmento aceptable.
Los segmentos de datos de slo lectura (sin punteros) pueden compartirse an usando
nmeros de segmento diferentes; lo mismo puede hacerse con segmentos de cdigo que no se
referencian directamente a s mismos, sino slo indirectamente. Por ejemplo, la bifurcacin
condicional que especifica la direccin de desplazamiento a partir del valor actual del contador de
programa o respecto a un registro que contiene el nmero de segmento actual, permite que el cdigo
no tenga que realizar una referencia al nmero de segmento actual.
El ordenador GE 645 utilizado con Multics tena 4 registros que contenan los nmeros de
segmento del segmento actual, del segmento de pila, del segmento de enlace y de un segmento de
datos. Los programas pocas veces hacen referencia directamente a un nmero de segmento, sino
siempre indirectamente a travs de estos cuatro registros de segmento. Esto permite que el cdigo
pueda compartirse libremente.
6.5.3.5 Fragmentacin
El sistema operativo tiene que encontrar y asignar memoria para todos los segmentos de un
programa de usuario. Esta situacin es similar a la paginacin, excepto en el hecho de que los
segmentos son de longitud variable; las pginas son todas del mismo tamao. Por tanto, como en el
caso de las particiones dinmicas, la asignacin de memoria es un problema de asignacin dinmica
de almacenamiento, resuelto probablemente mediante un algoritmo del mejor o primer ajuste.
La segmentacin puede ocasionar entonces fragmentacin externa, cuando todos los bloques
libres de memoria son demasiado pequeos para acomodar a un segmento. En este caso, el proceso
puede simplemente verse obligado a esperar hasta que haya disponible ms memoria (o al menos
huecos ms grandes), o puede utilizarse la compactacin para crear huecos mayores. Puesto que la
segmentacin es por naturaleza un algoritmo de reubicacin dinmica, podemos compactar la
memoria siempre que queramos.
En qu medida es mala la fragmentacin externa en un esquema de segmentacin ? La
respuesta a estas preguntas depende principalmente del tamao medio de segmento. En un extremo,
se podra definir cada proceso como un segmento; este esquema es el de las particiones dinmicas.
En el otro extremo, cada palabra podra situarse en su propio segmento y reubicarse por separado.
Esta disposicin elimina la fragmentacin externa. Si el tamao medio de segmento es pequeo, la
fragmentacin externa tambin ser pequea. (Por analoga, consideremos la colocacin de las
maletas en el maletero de un coche; parece que nunca encajan bien. Sin embargo, si se abren las
maletas y se colocan en el maletero los objetos sueltos, todo encaja). Puesto que los segmentos
individuales son ms pequeos que el proceso en conjunto, es ms probable que encajen en los
bloques de memoria disponibles.
23
24