Upload
alexander-pavlotzky-degano
View
227
Download
0
Embed Size (px)
DESCRIPTION
La memoria es un recurso compartido entre procesos en un mismo ordenador. En el caso de equipos que poseen más de un microprocesador o bien si tuviera solo uno pero con varios núcleos, es necesario administrar la memoria, tal que un microprocesador no “invada” el area de memoria que utiliza otro.
Citation preview
1
Administracion de Sistemas y Redes de Computadoras
Memoria
La memoria es un recurso compartido entre procesos en un mismo ordenador. En el caso de
equipos que poseen más de un microprocesador o bien si tuviera solo uno pero con varios
núcleos, es necesario administrar la memoria, tal que un microprocesador no “invada” el area
de memoria que utiliza otro.
Jerarquía de las memorias
+ velocidad , afecta al tiempo de acceso -
- capacidad, respecto del tamaño +
Las jerarquías entre los distintos tipo de memoria, se debe principalmente a su velocidad y
tamaño. Aquellas que se encuentran “mas cerca” del microprocesador son las más rápidas,
pero su capacidad de almacenamiento es menor.
Los registros internos y la memoria cache, están incorporados en la arquitectura del
microprocesador, son las más rápidas, pero a su vez son más caras en el proceso de fabricación
y elevan considerablemente el costo de los equipos.
Las memorias RAM se encuentran fuera del microprocesador, constituyen la memoria principal
del ordenador, pueden formar parte de la motherboard (memorias integradas) o bien las
identificamos como barras (sticks) que se conectan al mismo a través de los zócalos
correspondientes (bancos de memoria). Tienen mucha más capacidad que las cache´s pero son
mas lentas.
Por ultimo, las unidades auxiliares o de almacenamiento externo, son principalmente los
discos rígidos, unidades ópticas (DVD, CD).
Resaltamos la relación capacidad versus velocidad de los distintos dispositivos.
CPU
•Registros internos
•Cache L1 L2 L3
Memoria Principal
•RAM
Almacén Auxiliar
• HDD
•PenDrive
•Unidad optica
BUS de memoria BUS de E/S
2
El orden de búsqueda de un dato o valor por parte del CPU, es: primero regitros internos,
luego cache , pasando por los distintos niveles (L1, L2, L3), luego memoria RAM y por ultimo
unidades auxiliares.
Registros internos
Son los de mayor velocidad
De tamaño reducido , 8 16, 32 bits
Los hay de varios tipos: almacenamiento, contador, direcciones, propósito general
Caché
contiene copia de instrucción/dato
el objeto es que sean accedidos más rápido que el original.
Hacer los casos frecuentes eficientes,
Los caminos infrecuentes no importan tanto
Acierto de caché: se denomina así, cuando encuentra un ítem en una celda de memoria del
caché
Fallo de caché: se produce cuando no encuentra un dato en el caché y debe cargarlo desde la
memoria, lo que le insume más tiempo ya que debe hacer toda la operación completa de
lectura.
Esquema de acceso a caché: el CPU busca en el caché el I/D (instrucción/dato), si lo encuentra,
entonces de produce un acierto y retorna al CPU, sino se produce el fallo y accede a memoria
principal.
CPU Caché Memoria
I/D Fallo
Acierto
3
Siendo entonces, la memoria caché, como una memoria de alta velocidad, situada entre la
memoria principal y el procesador propiamente, que guarda copias de las páginas que van
siendo accesadas, partiendo del principio de la localidad de referencia:
Localidad temporal: Es probable que un recurso que fue empleado recientemente
vuelva a ser empleado en un futuro cercano.
Localidad espacial: La probabilidad de que un recurso aún no requerido sea accesado
es mucho mayor si fue requerido algún recurso cercano.
Localidad secuencial: Un recurso, y muy particularmente la memoria, tiende a ser
requerido de forma secuencial.
TAE : tiempo de acceso efectivo de caché
Cuando se utiliza la memoria caché, el cálculo de tiempo de acceso a una celda de memoria se
estima con la siguiente formula
TAE = p * ta + ( 1 –p) tf
p: probabilidad de acierto
(1 – p ) : probabilidad de fallo
ta : tiempo de acceso si hay acierto
tf: tiempo de acceso si hay fallo
I/D: instrucción / dato
Administración de memoria
Cuando se refiere a administración de memoria, se hace foco en particular en la memoria
RAM. Las tareas de un administrador de memoria son las siguientes:
Llevar un registro del estado de cada posición de memoria, si esta libre u ocupado
Recordar a quién, cuándo , cómo y dónde se va a usar
Que proceso hará el control de la memoria compartida
Considerar una técnica de asignación, cuando corresponda
Considerar una técnica de desasignación, para liberar memoria
4
ADMINISTRACIÓN DE MEMORIA
ASIGNACIÓN CONTIGUA SIMPLE
SPVR
////// PGM ////// /////////////////// ///////////////////
Fragmentación
Grafico: Memoria con asignación contigua simple
SPVR : supervisor
PGM: programa o proceso en memoria
Fragmentación: porción de memoria sin usar
Consideramos lo siguiente:
Para que un programa sea ejecutado, este debe estar totalmente cargado en memoria
El tamaño del programa debe ser < (menor) al tamaño de la memoria disponible
Al programa se le asigna toda la memoria, al finalizar el programa, la devuelve.
No requiere hardware en especial
No se puede utilizar la porción de memoria reservada al supervisor (SPVR), protección
con uso de registro base y desplazamiento.
Ventajas
Simplicidad
Desventajas
Gran fragmentación, no se utiliza la memoria en su totalidad
Cuando se presenta una operación de E/S, el CPU permanece ocioso, ya que
no se puede hacer uso de la memoria, ni del sistema
Existen muchos elementos o aplicaciones que están cargados en el área de
trabajo, los cuales ocupan lugar, pero no siempre son utilizados.
5
A
B
C D
E
F
/////// /////// /////// /////// /////// /////// ///////
/////// /////// /////// /////// ///////
/////// /////// /////// ///////
/////// ///////
/////// /////// /////// ///////
Tiempo t
Espacio de direcciones creadas por el usuario a través del tiempo. Para un mismo
espacio de memoria, se puede ver las áreas ocupados por los programas A, B, C, D, E y
F a través del tiempo y las que quedan libres sin usar. (se carga un programa a la vez)
DD
I/O AREA
W AREA
OPEN – CLOSE
ERROR
Esquema de distintos elementos cargados en el are de trabajo, como rutinas de apertura y
cierre de archivos, captura de errores, manejo de entradas y salidas.
M1 = 30 K M2 = 70 K
Aquí se muestran dos trabajos que están cargados en memoria, donde:
C1
I1
C2
I2
6
C: tiempo de CPU
I: tiempo de I/O
M: espacio que ocupa en memoria el trabajo
Ʃ I/O : tiempo total de espera por E/S
Tiempo de uso t = Ʃ I/O
Ʃ I/O + Ʃ CPU
CPU 1
CPU 2
I/O
T
Utilización del tiempo ocioso de CPU2, por otro proceso administrado por CPU1
ASIGNACIÓN PARTICIONADA
En este caso, la memoria se divide en n particiones, las cuales pueden ser de igual o de
distinto tamaño, una respecto de la otra.
Las particiones las identificamos como P1, P2, P3, etc., en cada partición se puede
alojar solamente un programa (PGM). El programa tiene como restricción que no
puede ocupar más de una partición, en síntesis, un programa no podrá cargarse si no
entra en una partición.
El espacio no ocupado por el programa dentro de la partición, es un espacio
desperdiciado, se lo denomina fragmentación interna.
SPVR
PGM 1 //////////
PGM 2 //////
PGM 3 /////////
PGM 4 ///////////////
Fragmentación
interna
7
Grafico: varias particiones de memoria, contiene cada uno un programa distinto, donde cada
uno de ellos tiene un tamaño diferente. El área sombreada, corresponde a la fragmentación de
cada partición. Las particiones tienen en este caso el mismo tamaño, pero también es válido
para particiones de diferente tamaño.
LINKAGE EDITOR: su nombre deriva del LINK, enlace, es considerado el punto de carga
o cargador, que se encarga de la vinculación entre programa y partición.
Existen dos clases distintas de linkage editor, estos pueden ser estáticos o dinámicos.
MMU: Manage Memory Unit, Unidad de Administración de Memoria ) se encarga de
administrar la memoria en base a diferentes métodos.
ASIGNACIÓN PARTICIONADA ESTÁTICO
Un cargado estático no permite cargar dos programas en una misma partición, de hecho, este
método de particionar la memoria, no permite colocar más de un programa en la misma
partición en forma simultánea.
Asignación: El cargador tiene la tarea de determinar que programa se carga y en que
partición, o sea que la asignación de un determinado programa a un área previamente
particionada, es responsabilidad del cargador como así también el criterio utilizado
para tomar la decisión. Si tenemos más de un programa en ejecución, estos deben
estar en particiones distintas.
Desasignación:, comprende la acción de marcar como disponible una partición a
efectos de poder ser utilizada posteriormente.
En un sistema de partición estático, la memoria se puede dividir en “n” particiones, las cuales
pueden ser todas del mismo tamaño, o bien pueden ser de tamaño diferente.
Estático con “n” particiones fijas de igual tamaño: Es el primer caso, donde todas las
particiones tienen el mismo tamaño, se ubicara o cargará el programa en la primer partición
libre. Si necesitamos cargar un programa que ocupa un tamaño mayor, entonces ante la
imposibilidad de carga, se genera un error.
Linkage editor
Estático
Dinámico
8
Estático con “n” particiones fijas de distinto tamaño: Sin embargo en el caso de tener
diferentes tamaños de particiones, puedo recorrer la tabla de particiones disponibles hasta
encontrar una del tamaño necesario para alojar el programa. Aquí se evalúan dos valores: el
tamaño y la disponibilidad.
Posición de comienzo
Longitud Estado
100 50 OCUPADO
150 20 LIBRE
170 80 LIBRE
250 90 OCUPADO
340 100 LIBRE
¿Que sucede si no logro encontrar una partición adecuada para cargar el programa?
Si en la primera recorrida de la tabla no encontramos una partición del tamaño necesario para
alojar el programa, se efectúa una segunda recorrida de la tabla, buscando dos (2) particiones
libres contiguas, tal que la suma de sus tamaños alcance para cargar el programa.
Al desasignar se controla si la partición superior o la inferior o ambas (son todas contiguas) a la
liberada, están libres. En ese caso se procede a compactar (compactación en asignación)
9
COMPACTACIÓN
El proceso de compactación o compactar, permite recuperar espacios sin usar de la memoria
y que se encuentran desperdiciados. Su recuperación permite disponer de más espacio para
una nueva partición de mayor tamaño, si se lo requiere. Además, el trabajar con espacios
contiguos de memoria, mejora el desempeño de las aplicaciones.
Los espacios fragmentados, objeto de compactación, corresponden a la denominada
fragmentación externa, ya que pertenecen a particiones liberadas o espacios de memoria sin
particionar. La fragmentación interna es la que se produce dentro de la partición y está
compuesto por el espacio resultante del tamaño total de la partición, menos el espacio que
ocupa un programa dentro de ella. La compactación no puede solucionar el problema de la
fragmentación interna.
SPVR
A
B
C
D /////////////////////// /////////////////////// ///////////////////////
Programas A,B, C y D en ubicados en zonas contiguas de memoria. El programa supervisor
SPVR, se encuentra en una partición protegida y no puede ser accedida por los programas.
Luego de concluído el proceso de los programas A y C, estos terminan y desaparecen,
generando una fragmentación de memoria.
SPVR ///////////////////////
B ///////////////////////
D /////////////////////// /////////////////////// ///////////////////////
Espacio contiguo de
memoria
Espacio libre que
anteriormente era
ocupado por los
programas A y C
contiguo de
memoria
10
En este grafico, son zonas libres (fragmentación) se presenta el problema que solo puedo
cargar nuevos programas en zonas contiguas. Debo desfragmentar la memoria, mediante el
método de compactación. Para ello, se debe “hacer lugar para el nuevo programa”, por lo que
tendremos que llevar el registro de dos tablas: de particiones en uso y de particiones libres.
Tabla de particiones en uso
Tabla de particiones libres
TABLA DE ESTADO DE PARTICION ASIGNADA
Nro. de Partición Posición (origen) Tamaño (longitud) Ocupado (Si/No)
1
2
3
4
…..
TABLA DE ESTADO DE AERAS NO ASIGNADAS
Nro. de Area Libre Tamaño Área Ubicación Área Estado
1 DISPONIBLE
2 ENTRADA LIBRE
3
4
…..
Estados: disponible y entrada libre, hacen referencia a que el área indica esta en condiciones
de ser asignada a un programa. La diferencia esta en que “Entrada Libre” indica que esa área
ha sido usada con anterioridad, por la tanto , el estado “Disponible” indica que esa área no fue
asignada nunca.
11
ASIGNACIÓN PARTICIONADA DINÁMICO
Se mantiene el concepto de carga de un programa por partición, como en partición estática, la
diferencia fundamental es que la creación de cada partición se hace por demanda.
Características principales:
Creación de particiones por demanda: Se van creando particiones en la medida que un
programa o proceso requiera cargase en memoria.
Dicha partición es del tamaño del programa que se intenta cargar. De esta manera
evitamos la fragmentación interna.
La creación de particiones se hace en zonas contiguas de memoria.
Pueden generarse particiones muy pequeñas, por el tamaño del programa que se
carga.
El manejo de la fragmentación externa generada por las particiones desasignadas, se
vuelve costoso si se trata de particiones de tamaño reducido. Se entiende que es
costoso en términos de tiempos de compactación respecto de cantidad de memoria
que se recupera.
Los métodos empleados para ubicar un nuevo programa o proceso en una partición existente,
son las siguientes:
1. FIRST FIT - primer ajuste
Es aquel que mantiene el orden de aparición de cada una de las particiones libre.
Recorre la tabla hasta que encuentra la primer partición en donde pueda cargarse el
programa.
2. BEST FIT - mejor ajuste
Hace un ordenamiento de forma creciente, (de menor a mayor) respecto del tamaño
de las particiones que están libres o disponibles para su asignación. Se asegura de esta
forma el mejor aprovechamiento del espacio de cada una de las particiones, teniendo
la menor fragmentación interna.
3. POOR FIT – peor ajuste
Comprende un ordenamiento decreciente respecto del tamaño de las particiones que
se encuentran libres para su asignación. En este caso, la asignación es inmediata, ya
que en la primera partición libre intentará cargar el programa, con altas probabilidades
de acierto.
12
EL ESPACIO DE MEMORIA DE UN PROCESO
Cuando un sistema operativo inicia un proceso, no se limita a volcar el archivo ejecutable a
memoria, sino que tiene que proveer la estructura para que éste vaya guardando la
información de estado relativa a su ejecución.
Sección de texto
Es el nombre que recibe la imagen en memoria de las instrucciones a ser ejecutadas.
Típicamente, la sección de texto ocupa las direcciones más bajas del espacio en
memoria.
Sección de datos
Espacio fijo preasignado para las variables globales. Este espacio es fijado en tiempo
de compilación, y no puede cambiar (aunque los datos que carga sí cambian en el
tiempo de vida del proceso)
Espacio de libres
(Heap) Espacio de memoria que se emplea para la asignación dinámica de memoria
durante la ejecución del proceso. Este espacio se ubica por encima de la sección de
datos, y crece hacia arriba.
Cuando el programa es escrito en lenguajes que requieren manejo manual de la
memoria (como C), esta área es la que se maneja a través de las llamadas de la familia
de malloc y free; en lenguajes con gestión automática, esta área es monitoreada por
los recolectores de basura (volveremos a estos conceptos más adelante).
Pila de llamadas
(Stack) Estructuras representando a la serie de funciones que han sido llamadas dentro
del proceso, con sus parámetros, direcciones de retorno, variables locales, etc. La pila
ocupa la parte más alta del espacio en memoria, y crece hacia abajo.
13
RESOLUCION DE DIRECCIONES
Un programa compilado no emplea nombres simbólicos para las variables o funciones que
llama4; el compilador, al convertir el programa a lenguaje máquina, las substituye por la
dirección en memoria donde se encuentra.
Ahora bien, en los sistemas actuales, los procesos requieren coexistir con otros, para lo cual las
direcciones indicadas en el texto del programa pueden requerir ser traducidas al lugar relativo
al sitio de inicio del proceso en memoria — Esto es, resueltas. Podemos hablar de las
siguientes tres estrategias de resolución:
En tiempo de compilación
El texto del programa tiene la dirección absoluta de los datos y funciones. Esto era
muy común en las computadoras previas al multiprocesamiento; en la arquitectura
compatible con PC, el formato ejecutable .COM es un volcado de memoria directo de
un archivo objeto con las direcciones indicadas de forma absoluta. Esto lo podemos
ver hoy principalmente en sistemas embebidos o de función específica.
En tiempo de carga
Al cargarse a memoria el programa y antes de iniciar su ejecución, el cargador
(componente del sistema operativo) actualiza las referncias a memoria dentro del
texto para que apunten al lugar correcto — Claro está, esto depende de que el
compilador indique dónde están todas las referencias a variables y funciones.
En tiempo de ejecución
El programa nunca hace referencia a una ubicación absoluta de memoria, sino que lo
hace siempre relativo a una base y un desplazamiento (offset). Esto permite que el
proceso sea incluso reubicado en la memoria mientras está siendo ejecutado sin tener
que sufrir cambios, pero requiere de hardware específico (como un MMU).
Esto es, los nombres simbólicos (por ejemplo, la variable llamada contador) para ser
traducidos ya sea a ubicaciones en la memoria, pueden resolverse en tiempo de compilación (y
quedar plasmada en el programa en disco con una ubicación explícita y definitiva: 510200), en
tiempo de carga (sería guardada en el programa en disco como inicio + 5986 bytes, y el
proceso de carga incluiría substituirla por la dirección resuelta a la suma del registro base,
504214, y el desplazamiento, 5986, esto es, 510200).
Por último, para emplear la resolución en tiempo de ejecución, se mantiene en las
instrucciones a ser ejecutadas por el proceso la etiqueta relativa al módulo actual, inicio +
5986 bytes, y es resuelta cada vez que sea requerido.
15
SEGMENTACIÓN
Al desarrollar un programa, el programador no ve a la memoria como un sólo arreglo plano, en
el que todas las direcciones son iguales (si bien está consciente de que la realidad es así).
El uso que damos a la memoria sigue una lógica de distintos segmentos: En vez de dar una
dirección lineal, damos al procesador una dirección de segmento y un desplazamiento dentro
de dicho segmento. Podemos tener segmentos de distintos tamaños presentes en memoria, y
la resolución de direcciones de cada uno de ellos se realizará por mecanismos análogos al
descrito en el apartado anterior (registro base y desplazamiento). Claro está, esto debe
también hacerse con apoyo del MMU.
La segmentación ayuda a incrementar la modularidad de un programa: Es muy común que las
bibliotecas ligadas dinámicamente estén representadas en segmentos independientes.
Una de las implementaciones más obvias y directas de un espacio de memoria segmentado es
asignar un segmento distinto a cada una de las secciones mencionadas en la sección espacio
en memoria de un proceso.
Una de las principales ventajas del uso de segmentación es que nos permite pedir al MMU que
cada uno de los segmentos tenga un distinto juego de permisos para el proceso en cuestión.
Permisos: El sistema operativo puede indicar, por ejemplo, que el segmento de texto (el
código del programa) sea de lectura y ejecución, mientras que la sección de datos es de lectura
y escritura. De este modo podemos evitar que un error en la programación resulte en que
datos proporcionados por el usuario o por el entorno modifiquen el código que está siendo
ejecutado. Es más, Incluso, dado que el acceso de ejecución está limitado a sólo los segmentos
cargados del disco por el sistema operativo, el atacante no podrá introducir código ejecutable
16
tan fácilmente, tendría que cargarlo como un segmento adicional con los permisos
correspondientes.
Intercambio parcial: Un uso muy común de la segmentación, particularmente en los sistemas
de los 1980s, era el de permitir que sólo ciertas regiones de un programa sean intercambiadas
al disco. Si un programa está compuesto por porciones de código que nunca se ejecutarán
aproximadamente al mismo tiempo en sucesión, puede separar su texto (e incluso los datos
correspondientes) en diferentes segmentos.
A lo largo de la ejecución del programa, algunos de sus segmentos pueden no emplearse por
largos periodos de tiempo. Estas páginas pueden ser enviadas al espacio de intercambio
(swap) ya sea a solicitud del proceso o por iniciativa del sistema operativo.
Rendimiento
Un proceso de intercambio completo resulta demasiado caro, cuando a tiempo se refiere.
Cuando hablamos de un espacio de memoria segmentado, y muy particularmente cuando
hablamos de bibliotecas de carga dinámica, la sobrecarga es mucho menor:
En primer término, podemos hablar de la cantidad de información que intercambiaremos: En
un sistema que sólo maneja regiones contiguas de memoria, intercambiar un proceso significa
mover toda su información al disco; cuando hablamos de intercambio en un sistema con
segmentación, puede enviarse a disco cada uno de los segmentos por separado, según el
sistema operativo lo juzgue necesario. Podría sacar de memoria a alguno de los segmentos,
eligiendo no necesariamente al que más estorbe (esto es, el más grande), sino el que más
probablemente no esté siendo utilizado: Emplear el principio de localidad de referencia para
intercambiar al segmento menos recientemente utilizado (LRU, Least Recently Used).
Además de esto, si hablamos de un segmento de texto (sea el código programa base o alguna
de las bibliotecas) y su acceso es de sólo lectura, una vez que éste fue copiado una vez al disco,
ya no hace falta volver a hacerlo: Tenemos la certeza de que no será modificado por el proceso
en ejecución, por lo que basta marcarlo como no presente en las tablas de segmentos en
memoria para que cualquier acceso ocasione que el sistema operativo lo traiga de disco.
Por otro lado, si la biblioteca en cuestión reside en disco (antes de ser cargada) como una
imagen directa de su representación en memoria, al sistema operativo le bastará identificar el
archivo en cuestión al cargar el proceso; no hace falta siquiera cargarlo en la memoria principal
y guardarlo al área de intercambio, puede quedar referido directamente al espacio en disco en
que reside el archivo.
Por supuesto que, el acceso a disco sigue siendo una fuerte penalización cada vez que un
segmento tiene que ser cargado del disco (sea del sistema de archivos o del espacio de
intercambio), pero este mecanismo reduce dicha penalización, haciendo más atractiva la
flexibilidad del intercambio por segmentos.
17
Estrategias empleadas por segmentación simple
La carga de procesos o programas se hace por demanda
Se trata de incorporar a los segmentos libres, los bloques de programa o de procesos
que necesitan cargarse en memoria
Cada proceso tiene su propia tabla de segmentos, la cual mantiene el estado de cada
uno de ellos. Aquellos que están libres pueden ser utilizados para una nueva carga.
El proceso de descarga consiste en marcar en la tabla de segmentos que el segmento
en cuestión está libre.
Validación de direccionamiento
El Sistema Operativo, se maneja con direcciones lógicas
El Sistema Operativo es el responsable que cada dirección lógica este dentro del rango
del segmento
El Sistema Operativo, emplea el uso de tablas de segmentos, como un arreglo de
registros base y limite para los segmentos
No hay correspondencia entre dirección lógica y dirección física
18
Esquema de verificación de que el desplazamiento, este dentro de un segmento y su
posterior cálculo de la dirección de memoria física.
S: segmento
D: desplazamiento
Base: dirección de memoria física del segmento
Base + d: dirección física
A modo de ejemplo (Finkel, p.79), un proceso puede tener la siguiente tabla de segmentos:
Segmento Inicio Tamaño Permisos Presente
0 13426 26 RWX sí
1 2309 00 R sí
2 1000 23 WX sí
3 - 95 W no
4 10000 100 RWX sí
En la columna de permisos, R se refiere a lectura, W a escritura y X a ejecución.
Un segmento que ha sido enviado al espacio de intercambio (en este caso, el 3), deja de estar presente en memoria y, por tanto, no tiene ya dirección de inicio registrada.
19
Veamos el resultado de entregar al MMU las siguientes direcciones y tipos de acceso:
Dirección Tipo de Dirección
virtual acceso Física
0-0 R 13426
2-17 W 1017
2-17 R Atrapada: Violación de seguridad
2-32 R Atrapada: Desplazamiento fuera de rango
3-72 W Atrapada: Segmento faltante
3-94 R Atrapada: Segmento faltante;
violación de seguridad
4-99 X 10099
7-25 X Atrapada: Segmento invalido
Cuando se atrapa una situación de excepción, el sistema operativo debe intervenir. Por ejemplo, la solicitud de un segmento inválido, de un desplazamiento mayor al tamaño del segmento, o de un tipo de acceso que no esté autorizado, típicamente llevan a la terminación del proceso, en tanto que una de segmento faltante (indicando un segmento que está en el espacio de intercambio) llevaría a la suspensión del proceso, lectura del segmento de disco a memoria, y una vez que éste estuviera listo, se permitiría continuación de la ejecución.
En caso de haber más de una excepción, como podemos verlo en la solicitud de lectura de la dirección 3-94, el sistema debe reaccionar primero a la más severa: Si como resultado de esa solicitud iniciara el proceso de carga del segmento, sólo para abortar la ejecución del proceso al detectarse la violación de tipo de acceso, sería un desperdicio injustificado de recursos.
20
PAGINACIÓN
La fragmentación externa y, por tanto, la necesidad de compactación pueden evitarse por
completo empleando la paginación. Esta consiste en que cada proceso esté compuesto por
una serie de páginas, dejando de requerir que la asignación sea de un área contigua de
memoria. Claro está, esto requiere de mayor especialización por parte del hardware, y mayor
información relacionada a cada uno de los procesos: No nos basta ya con indicar dónde inicia y
dónde termina el área de memoria de cada proceso, sino que debemos hacer un mapeo entre
la ubicación real (física) y la presentada a cada uno de los procesos (lógica). La memoria se
presentará a cada proceso como si fuera de su uso exclusivo.
La memoria física se divide en una serie de marcos (frames), todos ellos del mismo tamaño, y
el espacio cada proceso se divide en una serie de páginas (pages), del mismo tamaño que los
marcos. El MMU se encarga del mapeo entre páginas y marcos a través de tablas de páginas.
Las direcciones que maneja el CPU ya no son presentadas de forma absoluta, sino que como la
combinación de un identificador de página y un desplazamiento.
El tamaño de los marcos (y, por tanto, las páginas) debe ser una potencia de 2, de modo que el
MMU pueda discernir fácilmente la porción de una dirección de memoria que se refiere a la
página del desplazamiento.
Página y desplazamiento, en un esquema de direccionamiento de 16 bits y páginas de 512 bytes
Para poder realizar este mapeo, el MMU requiere de una tabla de páginas (page table), que resuelve la relación entre páginas y marcos, convirtiendo la dirección lógica (aquella que conoce el proceso) en la dirección física (la ubicación en que realmente se encuentra en la memoria del sistema).
21
Esquema del proceso de paginación, ilustrando el rol del MMU
Ejemplo (minúsculo) de paginación, con un espacio de direccionamiento de 32 bytes y páginas de 4 bytes
22
Podemos tomar como ejemplo para explicar este mecanismo el esquema presentado en el libro de Silberschatz, Galvin y Gagné. Este nos presenta un esquema minúsculo: Un espacio de direccionamiento de 32 bytes (5 bits), organizado en 8 páginas de 4 bytes cada una (esto es, la página es representada con los 3 bits más significativos de la dirección, y el desplazamiento con los 2 bits menos significativos).
El proceso que se nos presenta tiene una visión de la memoria como la columna del lado izquierdo: Le parece que existen 4 páginas, y tiene sus datos distribuidos en órden desde la dirección 00000 (0) hasta la 01111 (15), aunque en realidad en el sistema éstas se encuentren desordenadas y desperdigadas.
Cuando el proceso quiere referirse a la letra f, lo hace indicando la dirección 00101 (5). De esta dirección, los tres bits más significativos (001, 1 — Y recordemos que para la computadora, lo natural es comenzar a contar por el 0) se refieren a la página número 1, y los dos bits menos significativos (01, 1) indican al desplazamiento dentro de ésta.
El MMU verifica en la tabla de páginas, y encuentra que la página 1 corresponde al marco número 6 (110), por lo que traduce la dirección lógica 00101 (5) a la física 11001 (26). Podemos ver que la paginación resulta en una suerte de resolución de direcciones en tiempo de ejecución, pero con una base distinta para cada una de las páginas.
Capacidad de direccionamiento establecida de acuerdo al tamaño del registro interno de direcciones. Recordar para este calculo que la memoria esta representada como un arreglo.
1 celda de memoria = 1 byte = 1 palabra 1 párrafo = 16 bytes
Por ejemplo en 216, podemos direccionar un máximo de 65526 celdas de 1 byte cada una, lo que equivale a 64 K de memoria física. Cuanto mayor es mi registro de direcciones, entonces mayor será la memoria física a la cual se puede referenciar.