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).
usuario tiene de la misma. Un espacio de direcciones lgicas es una coleccin de segmentos. Cada
segmento tiene un nombre y una longitud. Las direcciones especifican tanto el nombre del segmento
como el desplazamiento dentro del segmento. Por lo tanto, el usuario especifica cada direccin
mediante dos cantidades: un nombre de segmento y un desplazamiento. (Comprese este esquema
con la paginacin, donde el usuario especificaba solamente una nica direccin, que el hardware
particionaba en nmero de pgina y desplazamiento, siendo todo ello invisible al programador).
Por simplicidad de implementacin, los segmentos estn numerados y se referencian por un nmero
de segmento en lugar de por un nombre. Normalmente el programa de usuario se ensambla (o
compila), y el ensamblador (o el compilador) construye automticamente segmentos que reflejan
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.
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