• No se han encontrado resultados

234 ADMINISTRACIÓN DE MEMORIA CAPÍTULO 3

N/A
N/A
Protected

Academic year: 2022

Share "234 ADMINISTRACIÓN DE MEMORIA CAPÍTULO 3"

Copied!
14
0
0

Texto completo

(1)

dole el problema. Después el paginador externo lee la página necesaria del disco y la copia a una porción de su propio espacio de direcciones. Después le indica al manejador de fallos en dónde es- tá la página. Luego, el manejador de fallos desasigna la página del espacio de direcciones del pagi- nador externo y pide al manejador de la MMU que la coloque en el espacio de direcciones del usuario, en el lugar correcto. Entonces se puede reiniciar el proceso de usuario.

Esta implementación no deja establecido dónde se va a colocar el algoritmo de reemplazo de páginas. Sería más limpio tenerlo en el paginador externo, pero hay ciertos problemas con este mé- todo. El problema principal es que el paginador externo no tiene acceso a los bits R y M de todas las páginas. Estos bits desempeñan un papel en muchos de los algoritmos de paginación. Por ende, se necesita algún mecanismo para pasar esta información al paginador externo o el algoritmo de reemplazo de páginas debe ir en el kernel. En el último caso, el manejador de fallos indica al pagi- nador externo cuál página ha seleccionado para desalojarla y proporciona los datos, ya sea asignán- dola al espacio de direcciones eterno del paginador o incluyéndola en un mensaje. De cualquier forma, el paginador externo escribe los datos en el disco.

La principal ventaja de esta implementación es que se obtiene un código más modular y una mayor flexibilidad. La principal desventaja es la sobrecarga adicional de cruzar el límite entre usua- rio y kernel varias veces, y la sobrecarga de los diversos mensajes que se envían entre las partes del sistema. En estos momentos el tema es muy controversial, pero a medida que las computadoras se hacen cada vez más rápidas, y el software se hace cada vez más complejo, a la larga sacrificar cier- to rendimiento por un software más confiable probablemente sea algo aceptable para la mayoría de los implementadores.

3.7 SEGMENTACIÓN

La memoria virtual que hemos analizado hasta ahora es unidimensional, debido a que las direccio- nes virtuales van desde 0 hasta cierta dirección máxima, una dirección después de la otra. Para mu- chos problemas, tener dos o más espacios de direcciones virtuales separados puede ser mucho mejor que tener sólo uno. Por ejemplo, un compilador tiene muchas tablas que se generan a medida que procede la compilación, las cuales posiblemente incluyen:

1. El texto del código fuente que se guarda para el listado impreso (en sistemas de procesa- miento por lotes).

2. La tabla de símbolos, que contiene los nombres y atributos de las variables.

3. La tabla que contiene todas las constantes enteras y de punto flotante utilizadas.

4. El árbol de análisis sintáctico, que contiene el análisis sintáctico del programa.

5. La pila utilizada para las llamadas a procedimientos dentro del compilador.

Cada una de las primeras cuatro tablas crece en forma continua a medida que procede la compila- ción. La última crece y se reduce de maneras impredecibles durante la compilación. En una memo- ria unidimensional, a estas cinco tablas se les tendría que asignar trozos contiguos de espacio de direcciones virtuales, como en la figura 3-31.

234 ADMINISTRACIÓN DE MEMORIA CAPÍTULO 3

(2)
(3)

cierto segmento necesita más espacio de direcciones para crecer, puede tenerlo, ya que no hay na- da más en su espacio de direcciones con lo que se pueda topar. Desde luego que un segmento se puede llenar, pero por lo general los segmentos son muy grandes, por lo que esta ocurrencia es ra- ra. Para especificar una dirección en esta memoria segmentada o bidimensional, el programa debe suministrar una dirección en dos partes, un número de segmento y una dirección dentro del segmen- to. La figura 3-32 ilustra el uso de una memoria segmentada para las tablas del compilador que vi- mos antes. Aquí se muestran cinco segmentos independientes.

236 ADMINISTRACIÓN DE MEMORIA CAPÍTULO 3

Tabla de símbolos

Texto fuente

Constantes

Árbol de análisis

sintáctico Pila de llamadas

Segmento 0

Segmento 1

Segmento 2

Segmento 3

Segmento 4 20K

16K

12K

8K

4K

0K

12K

8K

4K

0K 0K

16K

12K

8K

4K

0K

12K

8K

4K

0K

Figura 3-32. Una memoria segmentada permite que cada tabla crezca o se reduzca de manera independiente a las otras tablas.

Enfatizamos que un segmento es una entidad lógica, de la cual el programador está consciente y la utiliza como entidad lógica. Un segmento podría contener un procedimiento, o un arreglo, o una pila, o una colección de variables escalares, pero por lo general no contiene una mezcla de dis- tintos tipos.

Una memoria segmentada tiene otras ventajas además de simplificar el manejo de estructuras de datos que aumentan o reducen su tamaño. Si cada procedimiento ocupa un segmento separado, con la dirección 0 como su dirección inicial, la vinculación de procedimientos que se compilan por separado se simplifica de manera considerable. Después de que se han compilado y vinculado to- dos los procedimientos que constituyen un programa, una llamada al procedimiento en el segmen- to n utilizará la dirección en dos partes (n, 0) para direccionar la palabra 0 (el punto de entrada).

Si el procedimiento en el segmento n se modifica y recompila posteriormente, no hay necesi- dad de cambiar los demás procedimientos (ya que no se han modificado direcciones iniciales), aun si la nueva versión es más grande que la anterior. Con una memoria unidimensional, los procedi- mientos se empaquetan estrechamente, uno al lado del otro, sin espacio de direcciones entre ellos.

En consecuencia, al cambiar el tamaño de un procedimiento se puede afectar la dirección inicial de otros procedimientos (no relacionados). Esto a su vez requiere la modificación de todos los proce-

(4)

SECCIÓN 3.7 SEGMENTACIÓN 237 dimientos que llamen a cualquiera de los procedimientos que se movieron, para poder incorporar sus nuevas direcciones iniciales. Si un programa contiene cientos de procedimientos, este proceso puede ser costoso.

La segmentación también facilita la compartición de procedimientos o datos entre varios pro- cesos. Un ejemplo común es la biblioteca compartida. Las estaciones de trabajo modernas que ope- ran sistemas de ventanas avanzados tienen a menudo bibliotecas gráficas en extremo extensas que se compilan en casi todos los programas. En un sistema segmentado, la biblioteca gráfica se puede colocar en un segmento y varios procesos pueden compartirla, eliminando la necesidad de tenerla en el espacio de direcciones de cada proceso. Aunque también es posible tener bibliotecas compar- tidas en sistemas de paginación puros, es más complicado. En efecto, estos sistemas lo hacen me- diante la simulación de la segmentación.

Como cada segmento forma una entidad lógica de la que el programador está consciente, co- mo un procedimiento, un arreglo o una pila, los distintos segmentos pueden tener diferentes tipos de protección. Un segmento de procedimiento se puede especificar como de sólo ejecución, para prohibir los intentos de leer de él o almacenar en él. Un arreglo de punto flotante se puede especi- ficar como de lectura/escritura pero no como de ejecución, y los intentos de saltar a él se atraparán.

Dicha protección es útil para atrapar errores de programación.

El lector debe tratar de comprender por qué la protección es sensible en una memoria segmen- tada, pero no en una memoria paginada unidimensionalmente. En una memoria segmentada, el usuario está consciente de lo que hay en cada segmento. Por lo general, un segmento no contendría un procedimiento y una pila, por ejemplo, sino uno o el otro, no ambos. Como cada segmento con- tiene sólo un tipo de objeto, puede tener la protección apropiada para ese tipo específico. La pagi- nación y la segmentación se comparan en la figura 3-33.

El contenido de una página es, en cierto sentido, accidental. El programador ni siquiera está consciente del hecho de que está ocurriendo la paginación. Aunque sería posible poner unos cuan- tos bits en cada entrada de la tabla de páginas para especificar el acceso permitido, para utilizar es- ta característica el programador tendría que llevar registro del lugar en el que se encontraran los límites de página en su espacio de direcciones. La paginación se inventó para eliminar precisamen- te ese tipo de administración. Como el usuario de una memoria segmentada tiene la ilusión de que todos los segmentos se encuentran en memoria principal todo el tiempo (es decir, que puede direc- cionarlos como si estuvieran) puede proteger cada segmento por separado sin tener que preocupar- se con la administración por tener que superponerlos.

3.7.1 Implementación de segmentación pura

La implementación de segmentación difiere de la paginación de una manera esencial: las páginas tienen un tamaño fijo y los segmentos no. La figura 3-34(a) muestra un ejemplo de una memoria fí- sica que al principio contiene cinco segmentos. Ahora considere lo que ocurre si el segmento 1 se desaloja y el segmento 7, que es más pequeño, se coloca en su lugar. Obtendremos la configuración de memoria de la figura 3-34(b). Entre el segmento 7 y el 2 hay un área sin uso; es decir, un hue- co. Después el segmento 4 se reemplaza por el segmento 5, como en la figura 3-34(c), y el segmen- to 3 se reemplaza por el segmento 6, como en la figura 3-34(d).

(5)

Una vez que el sistema haya estado en ejecución por un tiempo, la memoria se dividirá en un número de trozos, de los cuales algunos contendrán segmentos y otros huecos. Este fenómeno, lla- mado efecto de tablero de ajedrez o fragmentación externa, desperdicia memoria en los huecos.

Se puede manejar mediante la compactación, como veremos en la figura 3-34(c).

3.7.2 Segmentación con paginación: MULTICS

Si los segmentos son extensos, puede ser inconveniente (o incluso imposible) mantenerlos comple- tos en memoria principal. Esto nos lleva a la idea de paginarlos, de manera que sólo las páginas que realmente se necesiten tengan que estar presentes. Varios sistemas importantes han soportado seg- mentos de páginas. En esta sección describiremos el primero: MULTICS. En la siguiente analiza- remos uno más reciente: el Intel Pentium.

MULTICS operaba en las máquinas Honeywell 6000 y sus descendientes; proveía a cada pro- grama con una memoria virtual de hasta 218segmentos (más de 250,000), cada uno de los cuales podría ser de hasta 65,536 palabras (36 bits) de longitud. Para implementar esto, los diseñadores de MULTICS optaron por considerar a cada segmento como una memoria virtual y la paginaron, com-

238 ADMINISTRACIÓN DE MEMORIA CAPÍTULO 3

Consideración Paginación Segmentación

¿Necesita el programador estar consciente

de que se está utilizando esta técnica? No

¿Cuántos espacios de direcciones

lineales hay? 1 Muchos

¿Puede el espacio de direcciones total

exceder al tamaño de la memoria física?

¿Pueden los procedimientos y los datos

diferenciarse y protegerse por separado? No

¿Pueden las tablas cuyo tamaño fluctúa

acomodarse con facilidad? No

¿Se facilita la compartición de

procedimientos entre usuarios? No

¿Por qué se inventó esta técnica? Para obtener un gran Para permitir a los espacio de direcciones programas y datos lineal sin tener que comprar dividirse en espacios de más memoria física direcciones lógicamente inde-

pendientes, ayudando a la compartición y la protección

Figura 3-33. Comparación de la paginación y la segmentación.

(6)
(7)
(8)
(9)
(10)
(11)
(12)
(13)

rio de páginas con una sola entrada: un apuntador a su única tabla de páginas. De esta manera, la sobrecarga por los segmentos cortos es sólo de dos páginas, en vez del millón de páginas que se ne- cesitarían en una tabla de páginas de un nivel.

Para evitar realizar referencias repetidas a memoria, el Pentium (al igual que MULTICS) tiene un pequeño TLB que asigna directamente las combinaciones Dir-Página de uso más reciente a la dirección física del marco de página. Sólo cuando la combinación actual no está presente en el TLB es cuando se lleva a cabo el mecanismo de la figura 3-42 y se actualiza el TLB. Mientras los fraca- sos del TLB sean raros, el rendimiento será bueno.

También vale la pena observar que si alguna aplicación no necesita segmentación pero está contenta con un solo espacio de direcciones paginado de 32 bits, ese modelo es posible. Todos los registros de segmento se pueden establecer con el mismo selector, cuyo descriptor tiene Base  0 y Límite establecido al máximo. Entonces el desplazamiento de la instrucción será la dirección li- neal, con sólo un espacio de direcciones único utilizado, en efecto, una paginación normal. De he- cho, todos los sistemas operativos actuales para el Pentium funcionan de esta manera. OS/2 fue el único que utilizó todo el poder de la arquitectura Intel MMU.

Con todo, hay que dar crédito a los diseñadores del Pentium. Dadas las metas conflictivas por implementar la paginación pura, la segmentación pura y los segmentos paginados, al tiempo que debía ser compatible con el 286, y todo esto había que hacerlo con eficiencia. El diseño resultante es sorprendentemente simple y limpio.

Aunque hemos cubierto en forma breve la arquitectura completa de la memoria virtual del Pen- tium, vale la pena decir unas cuantas palabras acerca de la protección, ya que este tema está estre- chamente relacionado con la memoria virtual. Al igual que el esquema de memoria virtual está modelado en forma muy parecida a MULTICS, el sistema de protección también lo está. El Pen- tium admite cuatro niveles de protección, donde el nivel 0 es el más privilegiado y el 3 el menos privilegiado. Éstos se muestran en la figura 3-43. En cada instante, un programa en ejecución se en- cuentra en cierto nivel, indicado por un campo de 2 bits en su PSW. Cada segmento en el sistema también tiene un nivel.

Mientras que un programa se restrinja a sí mismo a utilizar segmentos en su propio nivel, todo funcionará bien. Se permiten los intentos de acceder a los datos en un nivel más alto, pero los de acceder a los datos en un nivel inferior son ilegales y producen traps. Los intentos de llamar proce- dimientos en un nivel distinto (mayor o menor) se permiten, pero de una manera controlada cuida- dosamente. Para realizar una llamada entre niveles, la instrucción CALL debe contener un selector en vez de una dirección. Este selector designa a un descriptor llamado compuerta de llamada, el cual proporciona la dirección del procedimiento al que se va a llamar. Por ende, no es posible sal- tar en medio de un segmento de código arbitrario en un nivel distinto. Sólo se pueden utilizar pun- tos de entrada oficiales. Los conceptos de los niveles de protección y las compuertas de llamada se utilizaron por primera vez en MULTICS, en donde se denominaron anillos de protección.

Un uso común para este mecanismo se sugiere en la figura 3-43. En el nivel 0 encontramos el kernel del sistema operativo, que se encarga de la E/S, la administración de memoria y otras cues- tiones críticas. En el nivel 1 está presente el manejador de llamadas al sistema. Los programas de usuario pueden llamar procedimientos aquí para llevar a cabo las llamadas al sistema, pero sólo se puede llamar a una lista de procedimientos específicos y protegidos. El nivel 2 contiene procedi- mientos de biblioteca, posiblemente compartida entre muchos programas en ejecución. Los progra-

246 ADMINISTRACIÓN DE MEMORIA CAPÍTULO 3

(14)

Referencias

Documento similar

"No porque las dos, que vinieron de Valencia, no merecieran ese favor, pues eran entrambas de tan grande espíritu […] La razón porque no vió Coronas para ellas, sería

Cedulario se inicia a mediados del siglo XVIL, por sus propias cédulas puede advertirse que no estaba totalmente conquistada la Nueva Gali- cia, ya que a fines del siglo xvn y en

Sanz (Universidad Carlos III-IUNE): "El papel de las fuentes de datos en los ranking nacionales de universidades".. Reuniones científicas 75 Los días 12 y 13 de noviembre

De la Salud de la Universidad de Málaga y comienza el primer curso de Grado en Podología, el cual ofrece una formación generalista y profesionalizadora que contempla

Artículo 8. Las solicitudes de reconocimiento presentadas, en las que se aleguen créditos obtenidos en títulos universitarios oficiales de Graduado, para la convalidación de

En cuarto lugar, se establecen unos medios para la actuación de re- fuerzo de la Cohesión (conducción y coordinación de las políticas eco- nómicas nacionales, políticas y acciones

D) El equipamiento constitucional para la recepción de las Comisiones Reguladoras: a) La estructura de la administración nacional, b) La su- prema autoridad administrativa

b) El Tribunal Constitucional se encuadra dentro de una organiza- ción jurídico constitucional que asume la supremacía de los dere- chos fundamentales y que reconoce la separación