Está en la página 1de 11

Extra Resumen

Jerarquía de memoria:

• El administrador de memoria es la parte del S.O que administra la memoria (lleva registros de partes en uso y
asigna memoria a proceso).
Sin abstracción de memoria
• Abstracción de memoria más simple: sin abstracción. Conlleva a posible sobreescritura de memoria y error fatal
en S.O. Se ve la memoria física.
• Se puede ejecutar múltiples programas sin abstracción con la memoria dividida en sectores, cada proceso está
en un sector y para entrar a otro hace un trap para solicitar la llave de ese sector.
• Abstracción con espacio de direcciones: cada proceso tiene un inicio (base) y un tope (límite) de memoria para
utilizar. Las direcciones que usa el proceso se le suman el registro base para obtenerlas de su dirección física. La
suma gasta mucho tiempo.

Intercambio:

• Solución a sobrecarga: intercambio. Se carga proceso completo, se ejecuta por un tiempo, se regresa al disco.
Suele ocurrir con los procesos inactivos por mucho tiempo.
• Solución a sobrecarga: memoria virtual. Se ejecuta el programa aunque esté solo una parte en memoria.
• Compactación de memoria: se organiza la memoria para eliminar huequitos vacíos, lleva mucho tiempo.
• Administración de memoria: mapa de bits. Se divide en unidades de asignación, cada una tiene un bit donde 0 es
que está libre y 1 ocupada. Hay longitudes variables de unidades, buscar la de longitud adecuada es lento. Da la
idea de celdas, en donde se pueden necesitar muchas celdas seguidas para almacenar un proceso. Las listas
directamente son segmentos, entra o no entra y listo.
• Administración de memoria: listas ligadas. Son segmentos, ocupados o no ocupados. Si se el segmento queda
grande, lo que sobra es un nuevo segmento.
• Ajustes de listas: primer ajuste (el primero que encuentre donde quepa). Del siguiente ajuste (el primero que
encuentre pero desde donde terminó de buscar antes). Del mejor ajuste (mira todos y elige el más exacto). Del
pero ajuste( lo mete en el mas grande). Del ajuste rápido (separa listas para tamaños comunes).
Memoria Virtual
• Sobrepuestos (para varios programas en memoria, el programador dividia al programa para no tener que
cargarse todo en memoria, solía ser errativo).
• Memoria virtual (El programa tiene su espacio de direcciones que se divide en páginas).
• El proceso se carga por páginas, si se necesita una, se carga y se sigue con el proceso.

Paginación
• Se utiliza en la mayoría de sistemas. Las direcciones virtuales van al MMU (unidad de adminis. De memoria) que
las asocia con la dirección física.
• Las direcciones virtuales se dividen en páginas (de tamaño fijo). En memoria física se llaman marcos de página.
Siempre se carga o guarda una página completa.

• En el hardware real, hay un bit de presente/ausente para indicar si una página está en memoria. Si no es así y el
MMU la requiere, se hace un trap (llamado fallo de página) que carga la página y reinicia la instrucción en la que
se quedó el proceso.
• El número de página es el índice en la tabla de páginas. 1 bit de presencia, 3 de número de página y 12 de
desplazamiento.

Tabla de páginas
• La dirección virtual se divide en un número de página y un desplazamiento.
• En la tabla de páginas se encuentra el número de marco de páginas (si lo hay).
• La tabla de páginas es una función con el propósito de asociar páginas virtuales (argumento) con el número de
marco físico (resultado).
• Cada entrada de la tabla es de 32 bits (es el común).

Aceleración de la paginación
• La asociación de una dirección virtual a una física debe ser rápida.
• Si el espacio de direcciones es grande, la tabla de páginas será grande.
• Una sola tabla de páginas que sea un arreglo de registros de hardware veloces, con una entrada para cada
página virtual, indexada por número de página virtual. Para un proceso se cargarían los registros con la tabla de
páginas del proceso y no habría que acceder a referencias en memoria. Es muy simple, costoso y afecta al
rendimiento.
• Toda la tabla de páginas en memoria ppal. Solo se necesita un registro apuntando al principio de la tabla. Se
puede cambiar la asociación de direcciones fácilmente pero requiere referencias a memoria lo que es muy lento.

• BÚFERES DE TRADUCCIÓN ADELANTADA. Esquema para manejar paginación y espacios de direcciones virtuales
extensos. Se utiliza un TLB (Búfer de traducción adelantada) para asociar direcciones virtuales a direcciones
físicas sin pasar por la tabla de páginas. Tiene pocas entradas y cada una tiene campos que se corresponden con
los campos de la tabla de páginas.

• ADMINISTRACIÓN DE TLB MEDIANTE SOFTWARE. Las máquinas modernas administran las páginas mediante
software. Las entradas del TLB se cargan mediante el S.O., cuando no se encuentra la página en el TLB, la MMU
sólo genera un fallo y pasa el problema al S.O. Esto simplifica el TLB.
Para reducir fallos el S.O. precargar las entradas con más probabilidad de uso.
Hay dos tipos de fallos. Fallo suave (la página está en memoria y no en TLB). Fallo duro (la página está en el disco
solamente, lo que demora más en cargarse).

• TABLAS DE PÁGINAS PARA MEMORIAS EXTENSAS. Para lidiar con espacios extensos.
o Tablas de páginas multinivel. Una primera tabla (tabla superior) que te direcciona a las tablas del
segundo nivel con los 10 primeros bits de la entrada, ya en la tabla de segundo nivel hay 10 bits más
para la dirección, y 12 últimos bits de desplazamiento. En la primera tabla solo hay tres direcciones
accesibles, las demás producen fallo al intentar acceder.
o Tablas de páginas invertidas. Para direcciones de 64 bits. Una entrada por cada marco de página en
memoria real. Ahorra espacio pero es más lento porque la búsqueda se hace con cada referencia. Con
un TLB se pueden contener las de uso frecuente, y una búsqueda se haría por software.

Algoritmos de reemplazo de páginas


• Se tiene que hacer espacio para una página entrante, se elige una página y si se modificó, se escribe en el disco,
y se sobreescribe con la entrante.
• Algoritmos:
o De reemplazo de páginas óptimo. Fácil de describir pero imposible de implementar. Cada página tiene
un valor con la cantidad de instrucciones que faltan para que se use. A la que más le falte, sería la que se
elimine. El problema es que esto no se puede saber.
o No usadas recientemente. Se usa mediante hardware un bit R (ctdad veces referenciada en un pulso) y
otro M (ctdad total de veces escrita). Las páginas se dividen en 4 categorías según los bit y se reemplaza
alguna de la clase más baja.

o FIFO. Se anade una página al final y se elimina la que está al principio de la lista.
o Segunda oportunidad. Es un fifo con bit R que indica si ha sido utlizado para no descartarlo. Si todas las
páginas han sido utilizadas es un FIFO. Es ineficiente por mover constantemente sus páginas.
o Reloj. Un segunda oportunidad. Va inspeccionando uno por uno, desde el más antiguo, si tiene un R=1,
lo pone en 0 y pasa al siguiente. Si es R=0, lo desaloja.
o Menos usadas recientemente (LRU). Aproximación al optimo. Es contar cada vez que se usa una página
y descartar la que menos usos tiene. Es lento y costoso pero se puede hacer con hardware mediante un
contador C y cada entrada tiene que guardar el suyo. También mediante una máquina con una matriz
nxn bits según n marcos de página en donde la fila con menor binario es la de uso menos reciente.
o Simulación de LRU en software (NFU). Un contador en software para cada página en donde se agrega
un bit R al contador. Se desaloja al de menor valor, el problema es que nunca se olvida. Modificando que
cada uno de los contadores se desplace a la derecha un bit para después agregar R. Esto se conoce como
envejicimiento.
o Conjunto de trabajo. Forma más pura de paginación. Los procesos se inician sin sus páginas, con la
primera instrucción se cargan las páginas que se demanden según las variables que contengan. Esto es
paginación bajo demanda. La mayoría de procesos tienen una localidad de referencia, en donde en
cualquier fase de ejecución el proceso solo hace referencia sólo a una fracción relativamente pequeña
de sus páginas.
El conjunto de páginas que utiliza un proceso en un momento dado se conoce como conjunto de
trabajo. Si todo el conjunto está en memoria no habrá fallos.
Un programa que produce fallos cada pocas instrucciones está sobrepaginado (trashing).
Muchos sistemas tratan de tener el conjunto de trabajo en memoria antes que se ejecute el proceso.
Esto se conoce como modelo del conjunto de trabajo.
Cargar las páginas antes de permitir que el proceso se ejecute se llama prepaginación. Se puede predicir
las páginas que se necesitarán tras la ejecución para prepaginarlas antes de reanudar el proceso.
En un fallo de página, el contenido del registro de desplazamiento se podría extraer y ordenar; las
páginas duplicadas entonces pueden ser eliminadas.
La cantidad de tiempo de la CPU que ha utilizado en realidad un proceso desde que empezó se conoce
comúnmente como su tiempo virtual actual. El conjunto de trabajo de un proceso es el conjunto de
páginas a las que se ha hecho
referencia durante los últimos τ
segundos de tiempo virtual.
Para implementar este modelo es
necesario que el S.O. lleve la cuenta de
cuáles páginas están en el conjunto de
trabajo, esto también conduce a un
posible algoritmo de reemplazo de
páginas: cuando ocurra un fallo de
página, hay que buscar una página que
no se encuentre en el conjunto de
trabajo y desalojarla.

El desalojo se fija primero si ha sido usada en el último pulso de reloj (R=1), si R=0 entonces se fija la que
tenga mayor tiempo T (tiempo sin uso). Si todas las páginas tienen R=1 es al azar.

o Wsclock. El reloj mejorado que usa info del conjunto de trabajo, fácil y con buen rendimiento. Aparte de
R y M, tiene un campo de tiempo de último uso. En cada fallo se examina a la página donde apunta la
manecilla.
Cuestiones de diseno para los sistemas de paginación
Políticas de asignación local contra las de asignación global

Es importante ver como asignar memoria entre procesos en competencia.

Los algoritmos locales asignan una fracción fija de memoria, mientras que los globales asignan marcos de página
dinámicos a los procesos. Los globales suelen funcionar mejor puesto que el conjunto de trabajo varía con el tiempo y se
produce sobrepaginación o desperdicio de memoria.

Otra forma es tener un algoritmo para asignar marcos de página a los procesos. Se puede hacer equitativamente según
los procesos que haya, o se puede hacer en proporción al tamaño total de cada proceso.

Con un algoritmo global se puede asignar memoria proporcionalmente, pero también debe ser actualizada
dinámicamente, se puede hacer con un PFF (Frecuencia de Fallo de Páginas). Mediante el numero de fallo de paginas
por segundo de un proceso se puede determinar si hay sobrepaginación o si se puede achicar lo asignado. Ciertos
algoritmos pueden funcionar con una política de sustitución local o con una global (FIFO, LRU). En algunos casos la
elección entre local y global es independiente del algoritmo. Pero para los demás algoritmos, sólo tiene sentido una
estrategia local (conjunto de trabajo, WSClock).

Control de carga

El sistema se puede sobrepaginar, para esto hay que deshacerse temporalmente de algunos procesos para reducir el
número de procesos que compiten por memoria. Esto sería el intercambio visto más arriba.

También depende del grado de multiprogramación, no sólo se debe tomar en cuenta el tamaño del proceso y la
proporción de paginación al decidir qué proceso se debe intercambiar, sino también sus características.

Tamaño de página

Esto casi siempre lo puede elegir el S.O. No hay tamaño optimo


general. Si hay espacio vacío en las páginas, este se desperdicia. Cosa
que se conoce como fragmentación interna. Con n segmentos en
memoria y páginas de p bytes, se desperdician np/2 bytes. Un tamaño
grande suele hacer más desperdicio de página. Un tamaño chico hace
requerir más páginas, por lo que la tabla será más grande. Una página grande se transfiere casi en el mismo tiempo que
una chica.
Espacios separados de instrucciones y de datos

Se tiene espacios separados para instrucciones y datos, siendo espacio I y espacio D. Cada uno empieza de 0 hasta cierto
valor. El enlazador debe cuando se usan espacios separados. Con esto se consigue que se puedan paginar por separados.
Cada uno tiene su tabla de páginas.

Páginas compartidas

La compartición (común en multiprogramación) consiste en compartir páginas para evitar tener dos copias de la misma
(solo las de lectura se puede). Si se admiten espacios separados I y D, es sencillo ya que se puede compartir la tabla de
las I entre procesos.

Sin espacios separados se necesita saber cuales son las páginas compartidas. Una forma en un sistema paginado es
haciendo que dos procesos tengan cada uno su tabla, pero apunten a la misma dirección física. Cada página está en
modo lectura únicamente. Cuando uno escriba en una página, se hará un trap al violar la protección, y se creará una
copia en memoria para cada proceso así la página deja de ser compartida y es de lectura-escritura. Las que no se
modifican no se necesitan copiar. Este método se llama copiar en escritura y mejora el rendimiento.

Bibliotecas compartidas
En los sistemas modernos hay muchas bibliotecas extensas utilizadas por muchos procesos. Para ello se utiliza una
técnica común llamada bibliotecas compartidas DLLs o Bibliotecas de enlaces dinámicos.
Las funciones a las que se llame en los archivos objeto pero que no estén ahí se conocen como externas
indefinidas y se buscan en las bibliotecas.
Si un programa ya ha cargado una biblioteca compartida, no se necesita volver a cargar. En una biblioteca compartida se
carga de a una página a la vez según sea necesario.

Además de reducir espacio y tamaños, si la biblioteca corrige un error no hay que recompilar. Hay problema al reubicar
una biblioteca compartida por procesos al tener cada proceso una direcc virtual distinta. Para resolverlo se compilan las
bibliotecas compartidas con una bandera de compilador especial, para indicar al compilador que no debe producir
instrucciones que utilicen direcciones absolutas. Sólo se utilizan instrucciones con direcciones relativas. El código que
utiliza sólo desplazamientos relativos se conoce como código independiente de la posición.

Archivos asociados

Las bibliotecas compartidas son realmente un caso de una herramienta más general, conocida como archivos asociados
a memoria. Un proceso puede emitir una llamada al sistema para asociar un archivo a una porción de su espacio de
direcciones virtuales. Los archivos asociados proporcionan un modelo alternativo para la E/S. El archivo se puede
accesar como un gran arreglo de caracteres en la memoria. Si dos o más procesos se asocian al mismo archivo y al
mismo tiempo, se pueden comunicar a través de la memoria compartida.

Políticas de limpieza

La paginación funciona mejor con muchas páginas libres. Muchos sist. De paginación tienen un proceso en segundo
plano llamado demonio de paginación. Se despierta de forma periódica y si hay muy pocos marcos de página libres,
selecciona páginas para desalojar. Se guarda el contenido si ha sido modificado. Si antes de sobreescribirse, se necesita
esa página, se puede reclamar.

Este demonio asegura que los marcos libres estén limpios. Se usan dos manecillas del reloj, una para apuntar a una pag
sucia que la escribe en disco, y avanza. La segunda reemplaza las páginas.

Interfaz de memoria virtual

En algunos sist. Avanzados, los programadores pueden implementar un sistema de transmisión de mensajes de alto
rendimiento a través de la compartición de páginas.
También se puede hacer la memoria compartida distribuida, en donde varios procesos compartan a través de la red un
conjunto de páginas, posiblemente como un único espacio de direcciones lineal compartido.

Cuestiones de implementación
Los implementadores de los sistemas de memoria tienen que estar al tanto de varias cuestiones prácticas de
implementación, de problemas comunes y ciertas soluciones.

Participación del s.o. en la paginación

Hay 4 ocasiones en las que el S.O. tiene que realizar trabajo relacionado con la paginación:

● Cuando se crea un proceso: el S.O. tiene que determinar qué tan grandes serán el programa y los datos, y
crear una tabla de páginas para ellos. Se debe asignar espacio en memoria para la tabla y se tiene que inicializar,
asignar espacio en el área de intercambio en el disco e inicializarla.

● Al ejecutar un proceso (cuando se planifica para la ejecución): la MMU se tiene que restablecer para el nuevo
proceso y el TLB se vacía. La tabla de páginas del nuevo proceso se tiene que actualizar. Algunas o todas las
páginas del proceso se pueden traer a la memoria.

● Cuando ocurre un fallo de página: el S.O. tiene que leer los registros de hardware para determinar cuál
dirección virtual produjo el fallo. Calcula qué página se necesita y la localiza en el disco. Debe buscar un marco
de página disponible desalojando alguna página. Luego debe leer la página necesaria y colocarla en el marco de
página. Por último debe respaldar el contador de programa

● Cuando un proceso termina: el S.O. debe liberar su tabla de páginas, sus páginas y el espacio en disco que
ocupan las páginas cuando están en disco.

Manejo de fallos de página

1. Hardware hace un trap al kernel, guardando el contador de programa en la pila


2. Se inicia una rutina en código ensamblador para guardar los registros generales y demás información volátil. Esta
rutina llama al S.O. como un procedimiento.
3. El S.O. descubre que ha ocurrido un fallo de página y trata de descubrir cuál página virtual se necesita.
4. Una vez conocida la dirección virtual que produjo el fallo, el S.O. comprueba si esta dirección es válida y si la
protección es consistente con el acceso. De no ser así, el proceso recibe una señal o es eliminado. Si es válida y no ha
ocurrido un fallo de página, el sistema comprueba si hay un marco de página disponible. Si no hay, se ejecuta el
algoritmo de reemplazo de páginas
5. Si el marco de página seleccionado está sucio, la página se planifica para transferirla al disco y se realiza una
conmutación de contexto. El marco se marca como ocupado para evitar que se utilice para otro proceso.
6. Cuando el marco de página esté limpio, el S.O. busca la dirección en disco donde se encuentra la página necesaria, y
planifica una operación de disco para llevarla a memoria
7. Interrupción de disco indica que la página ha llegado, las tablas de páginas se actualizan y el marco se marca como en
estado normal
8. La instrucción fallida se respalda al estado en que tenía cuando empezó, el contador de programa se restablece
9. El proceso fallido se planifica y el S.O. regresa a la rutina que lo llamó
10. Esta rutina recarga los registros y demás información de estado, continúa la ejecución
Respaldo de instrucción

Al haber un fallo de página, se necesita saber en donde empezó la instrucción que originó el fallo.
Algunos modos de direccionamiento usan el autoincremento (efecto secundario de ejecutar una instrucción) o
autodecremento, lo que genera un problema.

Para solucionarlo, algunas CPU tienen un registro interno oculto que guarda el contador del programa justo antes de
ejecutar una instrucción, también puede haber un segundo registro que indique cuáles y en cuanto se han
autoincrementado o decrementado algunos registros. Si no se dispone de esto, el S.O debe averiguar que ocurrió y
como repararlo.

Bloqueo de páginas en memoria

La memoria virtual y la E/S interactúan en formas sutiles. Si el algoritmo de paginación es global, hay una pequeña
probabilidad de que la página que contiene el búfer de E/S sea seleccionada para eliminarla de la memoria. Al eliminarla
parte de los datos se escribirán en el búfer al que pertenecen y parte sobre la página que se acaba de cargar. Una
solución a este problema es bloquear las páginas (fijada (pinning))involucradas en operaciones de E/S en memoria, de
manera que no se eliminen. Otra solución es enviar todas las operaciones de E/S a búferes del kernel y después copiar
los datos a las páginas de usuario.

Almacén de respaldo

Sobre la paginación fuera de la memoria (en el disco). El algoritmo más sencillo es tener una partición de intercambio
especial en el disco, o tener un disco separado para eso. La mayoría de UNIX funcionan así. Se utilizan números de
bloques relativos al inicio de la partición.

Cuando inicia el sistema, la partición está vacía y se representa en memoria como una sola entrada. Esta partición se
administra como una lista de trozos libres.

Cada proceso tiene asociada la dirección en la partición de su área de intercambio. Esta información se mantiene en la
tabla de procesos. El problema es que los procesos pueden incrementar su tamaño antes de empezar. Por lo que podría
ser mejor reservar áreas de intercambio separadas para el texto, datos y la pila.

El otro extremo es no asignar nada por adelantado y asignar espacio en el disco para cada página cuando ésta se
intercambie hacia fuera de la memoria y desasignarlo cuando se vuelva a intercambiar hacia la memoria.

El área de intercambio en el disco es tan grande como el espacio de direcciones virtuales del proceso.

Una página en memoria no tiene copia en el disco.

No siempre es posible tener una partición de intercambio fija.

Separación de política y mecanismo

Se separa la política del mecanismo para administrar complejidad del sistema. En memoria se hace que la mayor parte
del administrador se ejecute en modo usuario. Se divide en dos partes:

1. Un manejador de la MMU de bajo nivel: es código dependiente de la máquina y tiene que volver a escribirse para
cada nueva plataforma, encapsula todos los detalles acerca del funcionamiento de la MMU.

También un manejador de fallos de página que forma parte del kernel: es código independiente de la máquina y
contiene la mayor parte del mecanismo para la paginación.

2. Un paginador externo que se ejecuta en espacio de usuario (política). Escribe los datos en el disco. No tiene acceso a
los bits R y M de todas las páginas.

Cuando se inicia un proceso, se notifica al paginador externo para poder establecer el mapa de páginas del proceso y
asignar el almacenamiento de respaldo en el disco. También se lo notifica cuando se asignan nuevos objetos en el
espacio de direcciones del proceso. Una vez que el proceso empieza a ejecutarse, puede obtener un fallo de página. El
manejador de fallos averigua cuál página virtual se necesita y envía un mensaje al paginador externo. - Ventaja de esta
implementación: se obtiene un código más modular y una mayor flexibilidad - Desventaja: sobrecarga adicional de
cruzar el límite entre usuario y kernel varias veces, y sobrecarga de los diversos mensajes que se envían entre las partes
del Sistema.

Segmentación
Tener dos o más espacios de direcciones virtuales separados puede ser mucho mejor que tener sólo uno.

Para liberar al programador de tener que administrar las tablas de expansión y contracción, se proporciona la máquina
con muchos espacios de direcciones completamente independientes, llamados segmentos. Cada segmento consiste en
una secuencia lineal de direcciones La longitud de cada segmento puede ser cualquier valor desde 0 hasta el valor
máximo permitido. Los distintos segmentos pueden tener distintas longitudes, las cuales pueden cambiar durante la
ejecución.

Debido a que cada segmento constituye un espacio de direcciones separado, los distintos segmentos pueden crecer o
reducirse de manera independiente, sin afectar unos a otros. Por lo general los segmentos son muy grandes.

Para especificar una dirección en una 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 segmento.

Un segmento es una entidad lógica de la cual el programador está consciente. No contiene una mezcla de tipos.

VENTAJAS: una memoria segmentada simplifica el manejo de estructuras de datos que aumentan o reducen su tamaño,
la vinculación de procedimientos se simplifica. Si el procedimiento del segmento n se modifica y recompila
posteriormente, no hay necesidad de cambiar los demás procedimientos. También facilita la compartición de
procedimientos o datos entre varios procesos.

Los distintos segmentos pueden tener distintos tipos de protección, la cual es útil para atrapar errores de programación.
La protección es sensible en una memoria segmentada, pero no en una memoria paginada unidimensionalmente. Como
cada segmento contiene sólo un tipo de objeto, puede tener la protección apropiada para ese tipo específico.

Como el usuario de una memoria


segmentada tiene la ilusión de que todos
los segmentos se encuentran en memoria
principal todo el tiempo, puede proteger
cada segmento por separado sin tener que
preocuparse con la administración por
tener que superponerlos.

Implementación de segmentación pura

Las páginas tienen tamaño fijo y los


segmentos no.

La fragmentación externa o efecto de


tablero de ajedrez es cuando, ya en
ejecución, la memoria se divide en un
número de trozos donde habrá segmentos y huecos, por estos huecos desperdiciados se le da el nombre.

Segmentación con paginación: MULTICS

Si un segmento es muy largo tiene que estar todo en memoria, por esto, se lleva la idea de paginarlos así no cargar todo
el segmento. MULTICS soportaba esta técnica.
MULTICS proveía a cada programa con una memoria virtual de hasta 2 18 segmentos, cada uno de los cuales podría ser
de hasta 65536 palabras (36 bits) de longitud. Se optó por considerar a cada segmento como una memoria virtual y la
paginaron, combinando las ventajas de la paginación (tamaño de página uniforme y no tener que mantener todo el
segmento en la memoria si sólo se utiliza parte de él) con las ventajas de la segmentación (facilidad de programación,
modularidad, protección, compartición).

Cada programa de MULTICS tiene una tabla de segmentos, con un descriptor por segmento. Dicha tabla es en sí un
segmento y se pagina. Un descriptor de segmentos contiene una indicación acerca de si el segmento está en memoria
principal o no. El descriptor también contiene el tamaño del segmento, los bits de protección y unos cuantos elementos
más.

Cada segmento es un espacio de direcciones virtual ordinario que se pagina. El tamaño normal de página es de 1024
palabras.

Una dirección en MULTICS consta de dos partes: el segmento y la dirección dentro del segmento. La dirección dentro del
segmento se divide aún más en un número de página y en una palabra dentro de la página. Al ocurrir referencia a
memoria:

1. El número de segmentos se utiliza para encontrar el descriptor de segmentos


2. Se realiza una comprobación para ver si la tabla de páginas del segmento está en la memoria. Si lo está, se localiza; si
no, ocurre un fallo de segmento
3. La entrada en la tabla de páginas para la página virtual solicitada se examina. Si no está en memoria, se dispara un
fallo de página.
4. El desplazamiento se agrega al origen de la página para obtener la dirección de memoria principal
5. Se lleva a cabo la operación de lectura o almacenamiento
Este algoritmo es lento, por lo que el hardware de MULTICS contiene un TLB de 16 palabras para buscar una llave en sus
entradas en paralelo.
Con una dirección, se revisa que esté en el TLB, si cumple se obtiene el número de marco de página directamente.
Las direcciones de las 16 páginas con referencia más reciente se mantienen en el TLB. Si la página no está en el TLB, se
hace referencia al descriptor y las tablas de páginas para encontrar la dirección del marco, el TLB se actualiza y la página
de uso menos reciente se descarta.
Segmentación con paginación: INTEL PENTIUM

El Pentium tiene 16 K segmentos independientes, cada uno de los


cuales contiene hasta un mil millones de palabras de 32 bits.
Entre mayor sea el tamaño del segmento será más importante. El
corazón de su memoria virtual consiste en dos tablas: - LDT (Tabla
de Descriptores Locales) - GDT (Tabla de Descriptores Globales).

Cada programa tiene su propia LDT, pero hay una sola GDT
compartida. La LDT describe los segmentos locales para cada
programa, mientras que la GDT describe los segmentos del
sistema, incluyendo el S.O. en sí.

Para acceder a un segmento, un programa primero carga un selector para ese segmento. Durante la ejecución, el
registro CS contiene el selector para el segmento de código y el DS para el segmento de datos. Cada selector es un
número de 16 bits. El descriptor 0 está prohibido, produce un trap si se utiliza.

Al cargar un selector en un registro de segmento, el descriptor correspondiente se obtiene de la LDT o GDT y se


almacena en registros de microprograma, por lo que se puede acceder con rapidez.
Un par (selector, desplazamiento) se convierte en una dirección física. Tan pronto como el microprograma sabe cuál
registro de segmento se está utilizando, puede encontrar el descriptor completo que corresponde a ese selector en sus
registros internos.

Después el hardware utiliza el campo Límite para comprobar si el desplazamiento está más allá del final del segmento,
en cuyo caso se produce un trap. Si el campo Gbit (granularidad) es 0, el campo Límite es el tamaño de segmento exacto.
Si es 1, el campo Límite proporciona el tamaño del segmento en páginas, en vez de bytes. El tamaño de página del
Pentium está fijo en 4 KB, por lo que 20 bits son suficientes para segmentos de hasta 2 32 bytes.

Suponiendo que el segmento está en memoria y que el desplazamiento está en el rango, suma el campo Base en el
descriptor al desplazamiento para formar lo que se conoce como una dirección lineal. El campo Base tiene 24 bits y se
divide en 3 partes, además permite que cada segmento empiece en un lugar arbitrario dentro del espacio de direcciones
lineal. Si se deshabilita la paginación, la dirección lineal se
interpreta como la dirección física y se envía a la
memoria para la lectura o escritura (segmentación pura).
Pero si la paginación está habilitada, la dirección lineal se
interpreta como una dirección virtual y se asigna a la
dirección física usando tablas de páginas, en forma muy
parecida a los ejemplos anteriores. Cada programa en
ejecución tiene un directorio de páginas que consiste en
1024 entradas de 32 bits. Cada entrada apunta a una
tabla de páginas que también contiene 1024 entradas de
32 bits. Las entradas en la tabla de páginas apuntan a
marcos de página:

Dirección lineal dividida en 3 campos:

- Dir: se usa para indexar en el directorio de páginas y localizar un apuntador en la tabla de páginas apropiada
- Página: se usa como índice en la tabla de páginas para buscar la dirección física del marco de página
- Desplazamiento: se suma a la dirección del marco de página para obtener la dirección física del byte o palabra
requerida.
Cada tabla de páginas tiene entradas para 1024 marcos de página de 4 KB, por lo que una sola tabla de páginas maneja 4
MB de memoria. Para evitar realizar referencias repetidas a memoria, se 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.

La protección tiene una forma muy parecida a MULTICS. El Pentium admite 4 niveles de protección, donde el nivel 0 es
el más privilegiado y el 3 el menos privilegiado. En cada instante, un programa en ejecución se encuentra en cierto nivel,
indicado por un campo de 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. Acceder
a los datos en un nivel inferior es ilegal y produce un trap. Los intentos de llamar procedimientos en un nivel distinto se
permiten, pero de manera controlada cuidadosamente. Para realizar llamadas entre niveles, la instrucción CALL debe
contener un selector en vez de una dirección. El cual designa a un descriptor
llamado compuerta de llamada, que proporciona la dirección del procedimiento al
que se va a llamar (en MULTICS se llaman anillos de protección).

- Nivel 0: kernel del S.O. - Nivel 1: manejador de llamadas al sistema - Nivel 2:


procedimientos de biblioteca - Nivel 3: programas de Usuario.

Los traps y las interrupciones utilizan un mecanismo similar a las compuertas de


llamadas. También hacen referencia a los descriptores en vez de direcciones
absolutas, y estos descriptores apuntan a los procedimientos específicos que se
van a ejecutar.

También podría gustarte