M3
lunes, 24 de mayo de 2021 14:40
3. Administración de la memoria
3.1. Conceptos básicos
3.2. Partición y reubicación
3.3. Multiprogramación, protección de memoria
3.4. Memoria virtual
3.4.1. Paginación
3.4.2. Políticas y algoritmos
ESPACIO DE DIRECCIONES
Cuando un programa accede directamente a la memoria física, se dice que no hay ninguna abstracción de memoria. Los programas se escriben referenciando directamente a direcciones físicas de
memoria, que serían celdas propiamente dichas de memoria. Bajo sin abstracción de memoria, un sistema solo puede ejecutar un proceso. Para ejecutar varios se guarda la información que un
determinado proceso está utilizando en algún archivo en disco, para liberar memoria y cargar un segundo proceso.
Abstracción de memoria
Para evitar inconvenientes debido a las referencias directas a la memoria física, se utiliza una abstracción de memoria denom inada de direcciones, el cual es asignado a cada programa y no hace
referencia directa a la memoria física. La forma más simple es usar: base y límite. Lo que el CPU hace cuando debe realizar alguna operación con la memoria es sumar la dirección base.
Particionamiento fijo
La memoria se divide en tamaño fijo que pueden ser asignados a diferentes procesos . Un proceso, entonces, requiere una región cuyo tamaño sea, mínimo, el que requiere. Si un proceso ocupa más
tamaño que la partición más grande, se deberá corregir mediante el uso de overlays en la etapa de programación. Desventaja es el desperdicio de espacio. Si un proceso requiere menos tamaño del
que ofrece una partición, el resto quedará inusable, que se denomina fragmentación interna. Es muy sencillo implementar esta para el sistema operativo.
Particionamiento dinámico
No existen particiones previas que ofrecer. El uso es más eficiente y, además, no existen fragmentaciones internas que se producen en el método anterior. Como desventaja la fragmentación externa,
implica que existen huecos de memoria, debido al intercambio.
Una técnica para eliminar la fragmentación externa es la compactación: de vez en cuando, el sistema operativo desplaza los pr ocesos en memoria, de forma que se encuentren contiguos y de este
modo toda la memoria libre se encuentra unida en un bloque .
La memoria como recurso
Para lidiar con el problema del agotamiento de la memoria RAM, existen: el intercambio y memoria virtual.
En lugar de utilizar espacio en la memoria RAM, el swap (intercambio) utiliza el disco duro para almacenar datos temporales, así se reduce el uso de la RAM . El uso combinado de memoria RAM y
swap crean una memoria virtual de mayor capacidad a la que trae el ordenador por defecto.
Reubicación
Un proceso puede ocupar diferentes particiones de memoria a lo largo de su vida. De esta manera las ubicaciones (de las instrucciones y datos) referenciadas por un proceso no son fijas , sino que
cambian cada vez que se intercambia o desplaza un proceso . Para resolver este problema, se realiza una distinción entre varios tipos de direcciones.
➢ Dirección lógica: Una posición de memoria independiente de la asignación actual de los datos de la memoria.
➢ Dirección relativa: Dirección calculada como un desplazamiento a partir de una dirección de base.
➢ Dirección física, Posición absoluta de una unidad de datos en la memoria.
Reubicación estática: cuando se carga un programa en la dirección x, se suma un valor constante x a todas las direcciones .
Cuando un proceso pasa a estado ejecutando, se carga un registro especial del procesador, denominado registro base, con la dirección más baja en la memoria principal del proceso. Existe también un
registro límite que indica la posición final del programa. A lo largo de la ejecución del proceso se encuentran direcciones relativas. Cada una de estas direcciones relativas pasa por 2 etapas de
manipulación en el procesador. En primer lugar, se suma el valor del registro base a la dirección relativa para obtener una dirección absoluta. Esta dirección absoluta obten ida se compara con el valor
del registro límite. Si la dirección está dentro de los límites, se puede proceder a la ejecución de la instrucción. En otro caso, se genera una interrupción del SO, que debe responder al error de algún
modo. Este procedimiento se conoce como carga dinámica en tiempo de ejecución y permite a los programas cargarse y descargarse de memoria a lo largo de su ejecución . También proporciona una
medida de protección: cada imagen de proceso está aislada por el contenido de los registros base y limite y es segura contra accesos no deseados por parte de otros procesos.
Ubicar procesos en memoria
Si se utilizó una parte de la memoria con tamaños iguales. Se selecciona cualquier sector libre para ubicar determinado proce so. Si está llena se realiza un intercambio, el planificador selecciona algún
sector cuyo proceso no se encuentra listo. Si se parte en sectores de diferentes tamaños, una opción consiste en ubicar un determinado proceso en el sector más chico posible, para evitar
desperdiciar recursos. Como desventaja es que pueden quedar sectores sin usar , debido a que el tamaño requerido por algún proceso es menor al tamaño de otro sector. Se soluciona con una única
cola de proceso, que selecciona el sector más chico posible o recurre a un intercambio de disco para hacer lugar . Cuando se utiliza el particionamiento dinámico, se requiere ubicar procesos de forma
eficiente. Para lograrlo existen tres algoritmos:
➔ Mejor ajuste(best-fit): busca el bloque de memoria que más se aproxime al tamaño requerido por el proceso.
➔ Primer ajuste(first-fit): comienza en el inicio de la memoria y se detiene cuando consigue un bloque tan grande como para cumplir con la solicitud del proceso.
➔ Siguiente ajustes(next-fit): comienza su búsqueda desde la última colocación y se detiene cuando consigue un bloque tan grande para la solicitud del proce so.
Otro algoritmo de colocación para el particionamiento dinámico es el de peor ajuste (worst -fit). En este caso, se utiliza el mayor bloque de memoria libre para un proceso.
PAGINACIÓN Y SEGMENTACIÓN
La paginación consiste en dividir los procesos en pequeñas partes, denominadas Páginas. Éstas tendrán asignada una porción de igual tamaño en la memoria principal , la que se denomina Marco de
página.
Ambos tamaños son iguales, ya que las particiones son de tamaño fijo, se elimina la fragmentación externa.
Estrategia de segmentación; se dividen en segmentos que, a diferencia de las páginas, son variables, algo que asemeja esta técnica con el particionamiento dinámico.
2A 2021 Page 1
(Paginación)
Tamaño de página
Es siempre potencia de 2, va desde los 512 bytes hasta ahora los 16 MB , según la arquitectura de la computadora. Al ser potencia de 2, se simplifica la traducción de una dirección lógica en un
número de página y desplazamiento. Si el tamaño de una dirección lógica es 2 elevado a la “n” y el tamaño de página es 2 elev ado a la “m” unidades de direccionamiento, entonces el bit de orden
superior “m-n” indica el número de página, mientras que el bit menos significativo de “n” indica el offset.
Tabla de página
Para ubicar las páginas dentro de la memoria principal, el SO usa una tabla de páginas por proceso. Por cada pág. se ubica el marco correspondiente ya que la relación es 1 a 1. Para traducir a una
dirección de memoria física, el procesador utiliza tablas de páginas. Dentro del programa, cada dirección lógica está formad a por un número de página y un desplazamiento dentro de la página.
Paginación Jerárquica: la propia tabla está también paginada
Tablas de páginas hash: el valor hash es el número de página virtual. Variante de este esquema que resulta más adecuada para los espacios de direcciones de 64 bits: tabla de páginas en clúster,
cada entrada de la tabla hash apunta a varias páginas.
Tablas de páginas invertidas: tienen una entrada por cada página real (o marco) de la memoria. Cada entrada está compuesta de la dirección virtual de la página almacenada en dicha ubicación
de memoria real, e incluye información acerca del proceso que posee dicha página.
Multiprogramación
Carga múltiples procesos dentro de una misma CPU para ser ejecutados en un determinado momento.
Protección de memoria
Para evitar que un proceso sobrescriba a otro en una implementación con paginación, se utiliza un bit de protección asociado a cada marco, los cuales normalmente se almacenan en tabla de
paginación.
Páginas compartidas
Todas las tablas de páginas de los diferentes procesos que usen la aplicación compartida harán referencia a los mismos marcos de memoria para el código, mientras que utilizarán marcos distintos
para la información propia.
2A 2021 Page 2
para la información propia.
Segmentación
No requieren espacios continuos de memoria principal , es una ventaja ya que permiten un uso eficiente de la memoria. Es posible dividir los programas en fragmentos más pequeños que las secciones
de un particionamiento dinámico, la fragmentación externa es, a priori, menor.
Se basa en la forma en que un programador ve la memoria: Conjunto de segmentos de tamaño variable, que no están necesariamente en orden . Entonces, en este tipo de gestión de memoria, las
direcciones especifican tanto el nombre de un segmento como su longitud . Este nombre, por razones de simplicidad, es tratado como un número. Se requiere un mecanismo que mapee estas
direcciones con dos variables en direcciones de una sola dimensión, que es como se identifican a las direcciones físicas de l a memoria principal. Se logra con una tabla de segmentos. Se identifican
en la tabla con un número de 0 a 4 y con dos dimensiones (base y límite) .
Los algoritmos locales corresponden de manera efectiva a asignar a cada proceso una fracción fija de la memoria . Los algoritmos globales asignan marcos de página de manera dinámica entre los
procesos ejecutables. En general, los algoritmos globales funcionan mejor, en especial cuando el tamaño del conjunto de trabajo puede variar durante el tiempo de vida de un proceso. Si se utiliza un
algoritmo local y el conjunto de trabajo crece, se producirá una sobrepaginación , aun cuando haya muchos marcos de página libres. Si el conjunto de trabajo se reduce, los algoritmos locales
desperdician memoria. Si se utiliza un algoritmo global, el sistema debe decidir en forma continua cuántos marcos de página asignar a cada proces o
MEMORIA VIRTUAL
Para que un proceso, pueda ejecutarse debe estar en la memoria principal. Resulta eficiente dejar datos o instrucciones no ne cesarios en la memoria secundaria y solicitarlos cuando el procesador los
requiere, que tener todo en la memoria principal y desperdiciar espacio que podría ser usado por un proceso que realmente deb e ser procesado. Lo que el SO debe evitar es el efecto thrashing
debido a que la cantidad de intercambios entre la memoria principal y secundaria, el sistema pasa más tiempo intercambiando q ue procesando.
Tablas de páginas
La dirección virtual se divide en un número de página virtual (bits de mayor orden) y en un desplazamiento (bits de menor ord en).
El propósito de la tabla de páginas es asociar páginas virtuales a los marcos de página.
Paginación en la memoria virtual
En una tabla de procesos, se indica si la página está en la memoria principal o secundaria. En caso que esté en la principal, se indicará el marco , al igual que en el caso de la real. Se utilizará un bit
adicional que indica si los datos de la entrada que contiene el bit fueron modificados cuando estuvieron en la principal. Como los procesos disponen de mucho espacio virtual, la cantidad de páginas
en una tabla puede ser muy grande. El problema sería que las tablas de página completas se almacenaran en la principal , porque gran parte de esa memoria estarían destinadas a almacenar
información de las tablas y no al almacenamiento de las instrucciones y de los datos. Se evita haciendo que una parte de las tablas de página también se almacene en la memoria virtual .
Caché: BÚFER DE MEMORIA utilizado para resolver la diferencia de velocidad entre la CPU y la memoria principal . Es uno de los recursos con los que cuenta una CPU (Unidad Central de
Procesamiento) para almacenar temporalmente datos recientemente procesados en una memoria auxiliar . Se trata de lo que se conoce como una memoria estática de acceso aleatorio (SRAM) muy
rápida y colocada cerca de la CPU. La principal función de la memoria caché es almacenar datos o instrucciones que la CPU va a necesitar en un futuro inmediato , de manera que se gana velocidad
en la ejecución de procesos, evitando que la CPU tenga que esperar y aumentando así el rendimiento del equipo.
Caché para tablas de páginas
Usar Memoria Virtual es ventajoso, pero podría introducir demoras si, por ejemplo, se requiere primero buscar primero la tabl a de páginas en disco como en la página propiamente dicha. Así como
existe una memoria caché entre la memoria principal y registros, hay una memoria muy rápida, llamada buffer de traducción anticipada (TLB) que se emplea para mantener aquellas tablas de páginas
usadas recientemente o con mayor frecuencia. Como el procesador intenta obtener los datos de la memoria caché, cuando tiene una dirección virtual lo primero que hace es consultar la TLB . Si la
entrada de página está en TLB, entonces se traduce en una dirección real. Si no hay acierto, el procesador debe buscar en la tabla de página del proceso. Hay dos opciones: Que la página está en la
memoria principal o virtual. En este último caso , el hardware ya no tiene más que hacer, y el SO el que deberá hacerse cargo de la situación y generar una solicitud de I/O para traer información
desde el disco hasta la memoria principal. En la comparación entre caché ubicada entre los registros y la memoria principal y la caché que guarda tablas de páginas, el procesador interactúa con
ambas. Una vez que se obtiene la dirección real a la lógica, el procesador debe consultar la caché para saber si puede obtene r la información desde allí, o si debe ir en busca de ella a la memoria
propia.
Si la página no está en la memoria principal, se produce un fallo de página, el fallo de página doble se produce cuando se de be traer desde memoria virtual tanto la tabla de páginas como la página
requerida.
Tamaño de página
Si es grande, habrá menos fragmentación interna. Si es chico, cada proceso necesitará muchas páginas , lo que hará aumentar el tamaño de la tabla y la memoria requerida para almacenar dicho
proceso. Si la memoria secundaria está compuesta por discos magnéticos, es más conveniente usar grandes para mejorar el rendimiento de las transferencias.
Segmentación en la memoria virtual
Se puede usar la técnica de segmentación. Se usan tablas de segmentos (una por proceso), pero más complejas que las utilizadas para la segmentación de la memoria real ya que debe indicarse si el
segmento está en la memoria virtual o real.
POLÍTICAS
Un proceso debe estar en la memoria principal para que pueda ser ejecutado por el procesador. Todos los procesos querrán esta r ahí todo el tiempo, pero no es posible. Para lograr el mejor
rendimiento posible, existen diferentes políticas que se encargan de traer páginas de la MV a la principal, definir dónde ubi carlas, reemplazarlas, limpiarlas y gestionar conjuntos residentes.
➔ De Recuperación: traer una página desde la memoria virtual a la principal. Hay dos alternativas: traer una pág. cuando es necesario, ya que ocurrió un fallo de la pág. (BAJO DEMANDA) o
hacerlo en forma proactiva (PREPAGING). Cuando la MV reside en un disco magnético, traer más páginas que las ocasionaron el fallo mejora el rendimiento, por el hecho de que un disco
magnético introduce grandes demoras simplemente debido a su mecanismo de funcionamiento, es decir, a la latencia rotacional y al tiempo de búsqueda.
➔ Ubicación: definir donde se ubican las porciones de memoria que utiliza un proceso. Cuando se utiliza la política de paginación o combinación de paginación y segmentación, no se necesita la
política de ubicación porque el mismo hardware se encarga de eso igual que con la eficiencia. Son útiles cuando se utiliza solo segmentación y es posible utilizar políticas de mejor ajuste o de
primer.
➔ De reemplazo: se produce un fallo de página, entonces se debe traer esa página desde la memoria virtual hasta la principal y eliminar otra pág. que actualmente se encuentra en la MP de tal
forma que se produzca espacio.
Existen diversos algoritmos para lograrlo:
❖ OPT óptimo: se reemplazará la página que se va a utilizar con menos frecuencia. No se puede implementar porque requiere conocer el futuro.
❖ LRU menos usado recientemente: aquella página que no ha sido referenciada por más tiempo será eliminada de la MP. La probabilidad de que la página menos usada vuelva justamente a
ser usada es baja, por lo que se acerca el algoritmo OPT. Las desventajas es la sobrecarga, ya que se debería mantener un registro del tiempo en el que se hizo referencia a cada página.
2A 2021 Page 3
ser usada es baja, por lo que se acerca el algoritmo OPT. Las desventajas es la sobrecarga, ya que se debería mantener un registro del tiempo en el que se hizo referencia a cada página.
❖ FIFO: funciona como Round-Robin, sencillo de implementar, ya que solo hace falta un puntero que recorra todos los marcos de página y que vaya eliminado páginas en forma circular. El
inconveniente es que si el proceso usa durante toda su vida ciertos sectores de datos, este se eliminará de todas formas, los eliminará de la MP y necesitará traerlos, lo cual resulta
ineficiente.
Segunda oportunidad: modificación del algoritmo FIFO evita el problema de descartar una página de uso frecuente al inspeccionar el bit R de la página más antigua. Si es 0, la página es
antigua y no se ha utilizado, por lo que se sustituye de inmediato. Si el bit R es 1, el bit se borra, la página se pone al final de la lista de páginas y su tiempo de carga se actualiza, como
si acabara de llegar a la memoria. Después la búsqueda continúa.
❖ Reloj: solución de compromiso a los anteriores. Requiere introducir un bit adicional a los marcos de páginas, se coloca en 1 la primera vez que una página es puesta en la memoria. Una
especie de buffer circular que puede estar orientado a un proceso o a todo la MP, en busca de marcos que tengan el bit en 0. El primer marco en ser encontrado es seleccionado para
reemplazo. Si el buffer encuentra marcos con bit en 1, pone en 0 y continúa la búsqueda. En el caso de que todo los marcos hayan estado en 1, entonces el puntero recorrerá todo el buffer
cambiándolos por 0 y seleccionará como reemplazarse al primero. La diferencia con FIFO es que se discrimina entre marcos que acaban de ser colocados en la memoria y aquellos que ya
llevan cierto tiempo en ella.
Funciona:
1. Posición actual del puntero, recorremos el buffer de marcos. Durante el recorrido, no se hace ningún cambio en el bit usado. El primer marco que se encuentre con (u=0; m=0) se
selecciona para reemplazo.
2. Si el paso 1 falla, el primer marco que se encuentra se seleccionará para reemplazo. Durante el recorrido, se pondrá el bit de usado a 0 en cada uno de los marcos que se vaya saltando.
3. Si el paso 2 falla, el puntero debe haber vuelto a la posición original y todos los marcos del conjunto tendrán el bit de usado a 0. Se repite el paso 1 y, si resulta, también el paso 2. Esta
vez se encontrará un marco para reemplazo.
En la primera vuelta del buffer, el algoritmo busca reemplazar la opción 00. Al no tener que escribir en el disco, esto mejora el rendimiento. Si no hay candidatos en su segunda vuelta,
buscará la combinación 01; se le da más valor al hecho de que la página probablemente no vuelva a ser usada, que a la demora que implica tener que escribir en el disco.
WSClock: algoritmo mejorado, basado en el del "reloj" pero que también utiliza la información del conjunto de trabajo.
Buffering
Permite que una página que deba ser reemplazada vaya a la lista de páginas modificadas o a la lista de no modificadas . La ventaja es que esa página permanece en la memoria principal.
Las políticas de planificación son:
FIFO (Primero en entrar primero en salir): Buen rendimiento si hay pocos procesos que requieren acceso y si muchas de las solicitudes son a sectores agrupados de un archivo. Sino mal
rendimiento (como si fuese aleatorio).
Prioridad: la planificación queda fuera del control del software de gestión de disco. Esta estrategia no está diseñada para optimizar la utilización del disco sino satisfacer otros objetivos del SO.
Favorece a los trabajos cortos, por los que los trabajos mayores pueden tener que esperar excesivamente. Poco favorable para sistemas de bases de datos.
LIFO (Ultimo en entrar, primero en salir): Puede producir inanición (un proceso o un hilo de ejecución se le deniega siempre el acceso a un recurso compartido). Buen rendimiento en los sistemas
de transacciones ya que conceder el dispositivo al último usuario acarrea pocos movimientos de brazos al recorrer un archivo secuencial.
Nota: las siguientes políticas tienen en cuenta la posición actual de la pista.
SCAN (subo hasta la última pista del disco y bajo): Favorece a los trabajos con solicitudes de pistas cercanas a los cilindros más interiores y exteriores; así como a los últimos trabajos en llegar. El
primer problema se puede evitar con C-SCAN, mientras el 2do con SCAN N pasos.
El sistema buddy es un compromiso razonable para eliminar las desventajas de ambos esquemas de particionamiento, fijo y varia ble, pero en los sistemas operativos contemporáneos, la memoria virtual
basada en paginación y segmentación es superior
2A 2021 Page 4