Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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.
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
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
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.
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.
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.
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.
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.
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.
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:
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.
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:
- 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).