Sistemas Operativos I - Tema 4

  • June 2020
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View Sistemas Operativos I - Tema 4 as PDF for free.

More details

  • Words: 6,006
  • Pages: 12
Gestión de la memoria |1

4. GESTIÓN DE LA MEMORIA Si se pretende que los procesos estén preparados para su ejecución es necesario cargarlos en la memoria principal, ya que ningún proceso se puede activar antes de que se le asigne el espacio de memoria que requiere. La utilización de los recursos del sistema, y en general, del rendimiento del sistema va a estar condicionado por la eficacia en la gestión de la memoria. Uno de los factores más importantes es la organización y gestión de la memoria principal. El ciclo típico de ejecución de una instrucción incluye las acciones siguientes: · Búsqueda de la instrucción en la memoria · Decodificación de la instrucción · Posible búsqueda de operandos en la memoria · Almacenamiento del resultado de la operación realizada

4.1 Sistemas elementales de gestión de la memoria El esquema de gestión más simple que se puede considerar es aquel que no tiene ningún gestor. El usuario tiene un control completo sobre el espacio total de memoria. Ventajas: 1) Máxima flexibilidad para el usuario 2) Máxima simplicidad y coste mínimo 3) No es necesario disponer de un computador específico ni tan siquiera del SO Este sistema tiene sus limitaciones, ya que no da ningún servicio. El usuario tiene acceso a todos los recursos del computador, pero el SO no tiene control sobre las interrupciones, no hay un monitor residente para procesar las llamadas al sistema o para el tratamiento de errores. El siguiente esquema se obtiene al dividir la memoria en dos secciones: una para el proceso del usuario y otra para la parte del sistema operativo que debe de estar residente en memoria (monitor). En el MS-DOS para el PC de IBM, la memoria está dividida en tres zonas: la parte inferior, que está destinada al SO; la parte central, dedicada al único programa de usuario y la parte superior, en ROM, para los controladores de dispositivos (más conocido como BIOS). A partir de ahí se ha utilizado la multiprogramación, por varias razones: 1) Facilitar la programación de una aplicación al dividirla en varios procesos 2) Poder dar servicio interactivo a varios usuarios al mismo tiempo u optimizar el tiempo del procesador cuando un proceso está a la espera de una operación de E/S.

4.2 Gestión de la memoria con particiones fijas El tamaño de las particiones se puede fijar o bien con anterioridad a la ejecución de los programas de usuario o efectuarse dinámicamente en la fase de ejecución. La asignación de memoria con particiones fijas se denominó MFT (Multiprograming with a Fixed number of Tasks). La división de ésta se ha realizado con anterioridad a la ejecución de los programas de usuario, pudiendo hacerla el operador o administrador del sistema de forma manual, al iniciar una sesión con la máquina. El número y tamaño de las particiones se determinan teniendo en cuenta: 1) Capacidad de la memoria física disponible y el grado de multiprogramación (nº máximo de procesos activos en el sistema) 2) Tamaños típicos de los procesos ejecutados más frecuentemente

Gestión de la memoria |2 4.2.1 Principio de operación a) Cuando llega una tarea, ésta se pone en una cola de tareas b) El planificador de tareas tiene en cuenta los requerimientos de memoria de cada una de ellas y las particiones de memoria disponible c) Si una tarea tiene espacio disponible en memoria, se ubica en una partición, y puede competir por el uso de la CPU d) Cuando se termina una tarea, se libera la partición de memoria que ocupa, pudiendo el planificador de tareas asignar esta partición a otra tarea de la cola de tareas Hay diferentes tipos de organizaciones posibles para la asignación de memoria a las tareas, por ejemplo, clasificarlas todas según sus requerimientos de espacio. Así cada partición tendrá una cola de tareas y cada tarea se incluye en la cola de partición de memoria que mejor se adapta. La planificación de cada cola se hace por separado y, como cada cola tiene su propia partición, no hay competencia entre las colas por la memoria. Otro tipo de organización consiste en mantener todas las tareas en una sola cola. El planificador selecciona la próxima tarea para ser ejecutada y espera hasta que se disponga de una región de memoria del tamaño requerido.

4.2.2 Intercambio Otro esquema en el uso de la memoria. Hace referencia a las operaciones de eliminar de la memoria principal procesos suspendidos, llevarlos al disco y cargar del disco a la memoria principal procesos para su ejecución. Responsabilidades del intercambiador: - Selección de los procesos que hay que eliminar de la memoria principal - Selección de los procesos que hay que cargar en la memoria principal - Asignación y gestión del espacio de intercambio La selección de los procesos en la memoria principal que hay que intercambiar se hace entre aquellos que ocupan particiones suficientemente grandes para los procesos que se les debe asignar espacio en memoria, considerando: a) Prioridad. Son más aptos aquellos con baja prioridad. b) Estado de espera. Procesos que esperan sucesos lentos tienen mayor probabilidad de ser suspendidos durante un tiempo suficientemente grande. c) Tiempo de permanencia en memoria. Y si se ha ejecutado mientras ha estado en memoria. La elección de los procesos que hay sin cargar en la memoria se basan en: 1) Tiempo que ha permanecido en memoria secundaria 2) Prioridad 3) Satisfacción del tiempo mínimo de residencia en disco desde la descarga

4.2.3Archivo de intercambio Un proceso se prepara para su ejecución y se envía al SO en la forma de un archivo que contiene un programa en versión ejecutable y sus correspondientes datos. Este archivo puede contener atributos del proceso. Un proceso ejecutado parcialmente tiene una imagen en tiempo de ejecución diferente de la inicial almacenada en el disco. En general, la parte modificable del estado del proceso consiste en los contenidos de sus datos y posiciones de la pila, así como de los registros del procesador. El contenido de una porción considerable (o el espacio de direcciones entero) se debe copiar a disco durante el intercambio. Como la imagen del proceso estático se utiliza para la activación inicial, la imagen modificada en tiempo de ejecución no debe sobrescribir a la imagen del proceso estático sobre el disco. Hay dos opciones básicas para diseñar el archivo de intercambio: 1) Un único archivo de intercambio para el sistema completo 2) Diferentes archivos de intercambio dedicados a cada uno de los procesos

Gestión de la memoria |3 El espacio de intercambio para cada proceso susceptible de poderse transferir está generalmente reservado, y asignado estáticamente en el momento de creación del proceso. Para un único archivo de intercambio, se crea un solo archivo, generalmente en el curso de la inicialización del sistema, para tratar los requerimientos de intercambio de todos los procesos. El archivo se suele situar en un disco rápido (para reducir tiempos de intercambio). El tamaño del archivo de intercambio afecta al número de procesos que están activos en el sistema. Un proceso se activa si se le puede reservar suficiente espacio de intercambio. Los fallos que se producen al reservar el espacio de intercambio en el tiempo de creación del proceso pueden llevar a graves errores en tiempo de ejecución. La alternativa es tener archivos de intercambio dedicados a cada uno de los procesos intercambiables del sistema. Pueden ser creados dinámicamente en el tiempo de generación del proceso o estáticamente en el tiempo de preparación del programa. Ventajas: se elimina el problema de dimensionamiento del archivo de intercambio y los errores de sobrepasar la capacidad, no se impone restricción sobre el número de procesos activos. Desventajas: necesidad de más espacio de disco para intercambio, acceso más lento y direccionamiento más complicado. Los algoritmos para la gestión del espacio disponible en el archivo de intercambio son los mismos que los usados para la gestión de la memoria principal.

4.2.4 Reubicación y protección Al mantener diversas tareas activas aparecen dos problemas: la reubicación y la protección. Reubicable: Posibilidad de cargar y ejecutar un programa dado en un lugar arbitrario de memoria. La solución al problema de la reubicación pasa por considerar dos tipos de reubicaciones: a) Reubicación estática: Implica que ésta se realiza antes o durante la carga del programa en memoria, mediante un enlazador o cargador reubicable. b) Reubicación dinámica: Implica que la asignación del espacio de direcciones virtuales al espacio de direcciones físicas se realiza en tiempo de ejecución, con ayuda de dispositivos físicos específicos destinados a tal fin. Cuando el proceso se está ejecutando, todas sus referencias a direcciones de memoria se recalculan durante la ejecución de la instrucción antes de acceder a la memoria física. Esto se realiza mediante registros base especializados. Ventaja: Un programa se puede trasladar de una partición de memoria a otra mientras se encuentra en ejecución. En ambos esquemas queda por resolver el problema de la protección, ya que un programa de forma mal intencionada, puede construir una dirección física que se salga fuera de la partición asignada. Una solución es considerar un registro límite que se cargaría con la longitud de la partición. Otro esquema de protección hardware es considerar registros bordes para cada partición, los cuales se cargan con las direcciones físicas de comienzo y final de la partición.

4.2.5 Selección del tamaño de la partición: fragmentación de la memoria La decisión inicial generalmente se basa en una suposición razonable de los requerimientos de los programas de entrada. Cuando el sistema está operando, se puede considerar la información sobre el número y tamaño de las tareas que se están ejecutando, para optimizar el tamaño de las particiones. La mayor dificultad con las particiones fijas es encontrar un buen compromiso entre los tamaños de las particiones y la memoria requerida por los trabajos.

Gestión de la memoria |4 Hay dos tipos de desaprovechamiento de la memoria: 1) Fragmentación interna. Parte de la memoria que no se está usando pero que es interna a una partición y no se puede aprovechar. 2) Fragmentación externa. Cuando una partición disponible no se emplea porque es muy pequeña para cualquiera de las tareas que esperan. La selección de los tamaños de las particiones es un compromiso entre estos dos casos de fragmentación.

4.3 Gestión de la memoria con particiones variables 4.3.1 Principio de operación El SO mantiene una tabla que indica qué partes de la memoria están disponibles y cuales están ocupadas. Cuando llega una tarea que requiere memoria, se busca un bloque disponible suficientemente grande. Si se encuentra, se asigna sólo la cantidad que se necesita. En general, en cualquier instante de tiempo hay libres un conjunto de bloques de memoria, de varios tamaños, repartidos a lo largo de la memoria. Mientras se puedan mover todos los procesos hacia la parte superior es posible combinar todos los bloques libres en uno solo. Esta técnica se conoce como compactación de la memoria. Generalmente no se realiza porque consume mucho tiempo de CPU. Un punto importante, es la cantidad de memoria que se le asigna a un proceso recién creado o intercambiado. Si los procesos se crean con un tamaño fijo invariante, se les asigna exactamente la memoria que necesitan. El problema aparece cuando los segmentos de datos de algunos procesos pueden crecer. Si hay una partición libre adyacente al proceso, ésta se le puede asignar. Pero si el proceso que crece es adyacente a otro proceso, debe ser desplazado a una partición libre lo suficientemente grande, o se tendrán que intercambiar uno o más procesos para crear una partición libre adyacente.

4.3.2 Sistemas de registro del uso de la memoria El registro de las particiones libres y ocupadas debe ser eficiente, tanto en tiempo para la asignación, como en aprovechamiento de la memoria. Hay varias formas: Mapa de bits. La memoria se divide en unidades de asignación. A cada unidad le corresponde un bit en el mapa de bits (0=libre y 1=ocupado). Ventaja: Ocupa poco espacio en memoria. Inconveniente: Sistema de gestión de memoria lento. Listas enlazadas. De las particiones libres y asignadas. Cada proceso tiene dos vecinos: dos procesos, un proceso y una partición libre y dos particiones libres. En este caso las estrategias más comunes para la asignación de memoria son: 1) Primero en ajustarse: estrategia más simple y rápida. El bloque encontrado se divide en dos partes, una se asigna al proceso y la otra se introduce en la lista como libre. Se produce fragmentación externa. 2) Mejor en ajustarse: busca en toda la lista y asigna el bloque más pequeño que es suficientemente grande. Produce restos más pequeños y es más lento. Produce mayor desperdicio de memoria que los otros dos algoritmos. 3) Peor en ajustarse: Suprime el efecto de particiones muy pequeñas. Produce restos más grandes, pero se ha demostrado que no tiene mejor rendimiento que los otros dos algoritmos. 4) Sistema de los asociados: Aprovecha el hecho de trabajar con direcciones binarias para hacer más rápida la fusión entre particiones libres adyacentes. El bloque de

Gestión de la memoria |5 memoria se va dividiendo en mitades según el requerimiento de los procesos. Un procedimiento ocupa la potencia de 2 (128Kb, 256Kb…) que está más cerca del redondeo de la memoria que necesita el proceso. Las fusiones se producen entre los bloques adyacentes previamente divididos cuando están libres.

4.4 Paginación Uno de los principales inconvenientes de los anteriores sistemas de gestión es la fragmentación externa. Este problema tiene dos soluciones generales: 1) Compactación de memoria. No se suele usar por su coste en tiempo. 2) Paginación. Permite que la memoria de un programa no sea contigua, de forma que siempre que se disponga de espacio, aunque éste no sea adyacente, se pueda asignar a un programa.

4.4.1 Principio de operación La memoria se divide conceptualmente en un número de bloques de tamaños fijos, los marcos de página. El espacio de direcciones virtuales de un proceso también se divide en bloques de tamaño fijo, páginas, del mismo tamaño que los marcos de página. La asignación de memoria consiste en encontrar un número suficiente de marcos de página sin usar para cargar las páginas de los procesos solicitadas. La dirección lógica se descompone en dos campos: el número de página y el desplazamiento relativo dentro de esta página.

4.4.2 Implementación de las tablas de páginas El objetivo de las tablas de páginas es asociar a las páginas un marco de página. Plantean dos cuestiones importantes: 1) El tamaño de la tabla de páginas, que puede ser demasiado grande. 2) El tiempo de asignación, que debe ser rápido. El acceso y búsqueda en estas tablas tiene que ser lo suficiente rápido para no ser un cuello de botella en funcionamiento del computador. La realización más sencilla es tener una sola tabla de páginas estructurada como un conjunto de registros dedicados. La CPU cargará estos registros cada vez que cargue los otros registros del programa. Es un método directo, sólo usa una referencia a memoria durante la asociación. Su desventaja es el coste de la circuitería asociada cuando las tablas de páginas son grandes. La utilización de registros específicos para la tabla de páginas es adecuada si la tabla de páginas es razonablemente pequeña. En sistemas con tablas de páginas grandes el sistema no es rentable. Se requiere más de una referencia a memoria para leer las entradas de la tabla de páginas durante la ejecución de cada instrucción. La solución es disponer de un pequeño dispositivo especial, la memoria asociativa. La mayoría de los programas tienden a hacer un gran número de referencias a un número pequeño de páginas y no al revés. Cada entrada tiene: 1) Número de página 2) Marco físico donde se localiza la página 3) Código de protección 4) Bit de modificación Se suele añadir un bit más que indica si la entrada se está utilizando o no. Cuando se presenta una dirección lógica, se verifica que el número de página lógica se encuentra en la memoria asociativa. Si el acceso no viola los bits de protección, el marco de

Gestión de la memoria |6 página se toma directamente de la memoria asociativa, si se viola la protección se genera un fallo de página. El porcentaje de veces que un número de página se encuentra en memoria asociativa (razón de encuentros) está relacionado con el número de registros de la memoria asociativa. Con una memoria de 16 registros se puede tener una razón de encuentros del 80% o 90%. Hay que tener en cuenta si el sistema es multiprogramado. Cada proceso tiene su propia tabla de páginas y es necesario dar mecanismos para que al ejecutarse un nuevo proceso no utilice los marcos de página de otro proceso. Dos soluciones: a) Proporcionar una instrucción máquina que invalide la memoria asociativa b) Realiza la memoria asociativa con un campo id_proceso

4.4.3 Compartición de páginas y protección Una de las ventajas de la paginación es la posibilidad de compartir código. Para ser compartible, el código debe ser reentrante (no automodificable, no cambia nunca durante la ejecución). Dos o más procesos pueden ejecutar el mismo código a la vez, manteniendo copia de sus registros y de sus datos, ya que estos varían de un proceso a otro. La protección de la memoria se realiza mediante bits de protección asociados a cada una de las páginas. Estos bits se encuentran en la tabla de página y definen la página como de lectura/escritura o de sólo lectura.

4.5 Segmentación El usuario prefiere ver a la memoria como un conjunto de diferentes tamaños, sin una ordenación específica entre ellos. Segmentación: Sistema de gestión de la memoria que soporta esta visión. El espacio de direcciones lógicas es un conjunto de segmentos, con diferentes nombres y tamaños. Las direcciones especifican el nombre del segmento y el desplazamiento dentro del segmento. Este esquema es muy diferente al de la paginación. Un segmento puede tener una determinada estructura de datos, o un procedimiento o módulo, pero normalmente no va a contener una mezcla de varios.

4.5.1 Principio de operación El programa de usuario se compila y el compilador construye automáticamente los segmentos de acuerdo a la estructura del programa. El cargador tomará todos estos segmentos y le asignará números de segmento. Cada uno de los segmentos se compila comenzando por su propia dirección lógica 0. Es necesario disponer de un mecanismo que convierta las direcciones lógicas bidimensionales en su dirección física equivalente. Esta asignación se efectúa mediante una tabla de segmentos. En la tabla se mantienen registrados los descriptores de cada segmento: la base, correspondiente a la dirección física en que comienza el segmento y el tamaño del mismo. El número de segmento se emplea como un índice dentro de la tabla de segmentos. La dirección física se obtiene añadiendo el desplazamiento a la base del segmento. El desplazamiento no debe sobrepasar el tamaño máximo del segmento.

Gestión de la memoria |7

Una tabla de segmentos que se mantiene en registros especiales puede ser referenciada muy rápidamente; la suma a la base y la comparación con el tamaño se puede hacer simultáneamente. Cuando el número de segmentos crece, la tabla de segmentos se deja en memoria; un registro base de la tabla de segmentos apunta a la tabla de segmentos. Modo de proceder: 1) Se comprueba que el número de segmento es correcto 2) Se suma el número de segmento al valor del registro base de la tabla de segmentos para obtener la dirección de memoria para la entrada de la tabla de segmentos 3) Esta entrada se lee de memoria y se procede como antes (se comprueba que el desplazamiento no rebasa la longitud del segmento y se calcula la dirección física). Esto requiere dos referencias a memoria por dirección lógica, provocando una disminución en la velocidad del computador. Solución: disponer también de una memoria asociativa para retener las entradas de la tabla de segmentos usadas más recientemente. La segmentación no produce fragmentación interna, pero sí externa, cuando todos los bloques de memoria libres son muy pequeños para acomodar un segmento.

4.5.2 Protección y compartición Como todas las entradas al segmento se usan de la misma manera, los segmentos de código se pueden definir de sólo lectura, mientras que un segmento de datos se puede definir de lectura/escritura. También facilita la compartición de código o datos entre varios procesos. Ejemplo: las librerías compartidas.

4.5.3 Sistemas combinados de paginación-segmentación Características: a) El programador no necesita saber que se está utilizando la paginación; pero si se dispone de segmentación sí necesita saberlo. b) La paginación sigue un sistema lineal, la segmentación proporciona un espacio bidimensional con muchos espacios de direcciones. c) La paginación no distingue el código de los datos. La segmentación sí. d) La segmentación facilita la compartición de código y datos, así como el uso de estructuras de datos de tamaños fluctuantes. e) El espacio total de direcciones de ambas puede exceder el tamaño de la memoria física. Esto permite desarrollar el concepto de memoria virtual. No se puede decir que una técnica sea mejor a la otra, por ello hay muchos sistemas que combinan los dos métodos. Una técnica muy extendida consiste en usar la segmentación desde el punto de vista usuario, pero dividiendo cada segmento en páginas de tamaño fijo. Es adecuada en el caso de que los

Gestión de la memoria |8 segmentos sean muy grandes. Así se elimina la fragmentación externa y hace más fácil el problema de la ubicación.

Cada segmento tiene su propia tabla de páginas. El tamaño de la tabla de páginas no tiene que ser el máximo, sino un tamaño en función de la longitud del segmento. Se ha eliminado la fragmentación externa, pero introduciendo fragmentación interna y aumentando el espacio de tablas.

4.6 Memoria virtual Memoria virtual: Permite que el espacio de direcciones virtuales de un proceso activo sea mayor que la memoria física disponible.

4.6.1 Principio de operación Demanda de página: sistemas más comunes. Similar a un sistema de paginación con intercambio. Los procesos se inician sin ninguna página en memoria; cuando se intenta ejecutar la primera instrucción se produce un fallo de página que provocará que el SO tenga que cargar en la memoria principal la página que contiene esta instrucción. Un fallo de página se produce cuando en la tabla de páginas del proceso no hay asociado un marco de página a la página a la que se quiere acceder. Cuando se produce un fallo: 1) Se verifica si la dirección es válida. 2) Si es una referencia válida, pero no se ha traído la página a la memoria principal, el SO detecta un fallo de página y determina la página virtual requerida para traerla. La instrucción queda interrumpida y se guarda el estado. 3) Se selecciona un marco libre. Si no existe uno, se tendría que ejecutar un algoritmo de sustitución de página. 4) Si el marco de página está ocupado, el planificador transfiere la página al disco y se produce un cambio de contexto; se suspende el proceso causante del fallo y se permite la ejecución de otro. El marco queda marcado como ocupado. 5) Cuando el marco queda limpio, el SO examina la dirección en el disco donde se encuentra la página necesaria y planifica una operación de lectura de la misma. Mientras se carga la página, el proceso que produjo el fallo continúa suspendido y se permite ejecutar otro proceso. 6) Cuando se completa la lectura del disco, la tabla de páginas se actualiza para indicar que ya se dispone de la página en la memoria.

Gestión de la memoria |9 7) La instrucción que produjo el fallo regresa al estado de comienzo y se planifica su ejecución. La circuitería para soportar demanda de página es la misma que para la paginación e intercambio. También se tiene que imponer algunas restricciones sobre la arquitectura, siendo esencial la posibilidad de continuar cualquier instrucción después de un fallo de página.

4.6.2 Conceptos de memoria virtual Una gestión de la memoria basada en el mecanismo de demanda de página tiene un considerable efecto sobre el rendimiento del computador. La probabilidad de que ocurra un fallo de página debe de ser menor al 0,001%, evidentemente, hay que mantener la razón de fallos de página muy baja para que la ejecución de un programa no se haga extremadamente lenta. Muchos procesos no usan todas sus páginas (páginas de dato o código que no se usan, de tratamiento de errores…), por tanto no hay que traerlas todas, pudiéndose ejecutar más procesos. En esta situación puede ocurrir el efecto de la sobreasignación de la memoria. Se necesita un sistema de sustitución de páginas que permita mantener un alto nivel de multiprogramación. El SO debe elegir una página para retirarla de memoria y dejar espacio para la página que se solicita. La memoria virtual mediante paginación supone mantener una tabla de páginas por cada uno de los procesos activos. Estas tablas pueden ser mucho más grandes en un sistema virtual que en uno de paginación real, ya que el espacio de direcciones virtuales de un proceso puede exceder la capacidad de la memoria real. Se deben tener políticas de: a) Asignación de memoria real a cada uno de los procesos activos. b) Búsqueda y lectura del disco de los correspondientes elementos. c) Sustitución de elementos en memoria principal por los nuevos elementos que se traen del disco. d) Ubicación de los nuevos elementos.

4.7 Políticas de sustitución de páginas 4.7.1 Algoritmo de sustitución FIFO: First In, First Out A cada página se le asocia el tiempo que ha permanecido en la memoria y al sustituir una página, se elige la que más tiempo lleva en la memoria. No es necesario guardar el tiempo de entrada, ya que se puede crear una cola con todas las páginas de memoria que van entrando. Su funcionamiento no es siempre el adecuado y no es el que se suele usar. A pesar de que una página se usa muy frecuentemente, según este algoritmo se seleccionaría para ser sustituida, aunque se acabara de usar. Sufre la “anomalía de Belady” (aumentan los fallos de páginas al aumentar el número de marcos de páginas para asignación).

4.7.2 Algoritmo de sustitución óptimo Tiene que producir menos fallos de páginas que cualquier otro algoritmo. Además, no debe de presentar la anomalía de Belady.

G e s t i ó n d e l a m e m o r i a | 10 El algoritmo óptimo se puede enunciar así: “Sustituir aquella página que tardará más en volverse a utilizar”. El problema de este algoritmo es que es irrealizable, ya que el SO no sabe a priori que páginas se referenciarán en el futuro. Sirve como medida para los demás algoritmos.

4.7.3 Algoritmo de sustitución LRU: Least Recently Used Es una buena aproximación al algoritmo óptimo. Se considera que las páginas usadas más frecuentemente en las últimas instrucciones son las que con más probabilidad se usarán próximamente. Este algoritmo asocia a cada página el tiempo de la última vez que se utilizó. Cuando una página debe ser sustituida, se elige aquella que no ha sido utilizada durante un mayor periodo de tiempo. Necesita un considerable apoyo de recursos de la máquina. Hay dos posibles realizaciones: 1) Mediante una pila que mantiene los números de página. Cada vez que una página se referencia, su número se elimina de la pila y se coloca en la cumbre. La eliminación de una página y su colocación en la cumbre supone tener que modificar un número x de punteros, lo que puede consumir mucho tiempo. 2) Mediante registros contadores. En la CPU hay un contador que se incrementa cada vez que se hace una referencia a la memoria. Cada vez que se hace referencia a una página, se copia el contador en el registro con el tiempo en el que se usó la página. Cuando hay que hacer una sustitución se busca el registro con el valor más pequeño. Los dos métodos necesitan de una circuitería especial de la que no siempre se dispone. Así, muchos sistemas proporcionan un bit de referencia por cada una de las páginas. El SO pone a 0 estos bits y, cuando se referencia una página, el bit se pone a 1. Se sabe qué páginas se han referenciado, pero no el orden en el que se ha hecho. Se puede tener más información registrando regularmente estos bits (por ejemplo, una tabla con registros de ocho bits por cada página). Periódicamente el SO desplazará a la derecha los bits de estor registros y situará en el bit de orden superior el bit de referencia. En el caso extremo se puede mantener sólo el bit de referencia, sin ningún bit de historia. Esto da lugar al algoritmo de la segunda oportunidad.

4.7.4 Algoritmo de sustitución de la segunda oportunidad Es una modificación del algoritmo FIFO. La modificación consiste en examinar el bit de referencia de las páginas que se seleccionan para sustituir. Si es 0, la página no se ha utilizado además de ser antigua. Si es 1, entonces se pone a 0 y la página se coloca al final de la cola. La segunda oportunidad busca una página antigua que NO se haya referenciado.

4.7.5 Otros algoritmos de sustitución A muchos de ellos se les puede considerar aproximaciones del LRU. Si además del bit de referencia se considera un bit de modificación, que se activa cuando se escribe una palabra en la página. El SO asigna un valor 0 a los dos bits, de forma periódica, el bit de referencia se pone a 0 para distinguir las páginas que no tienen referencias recientes de las que sí. Cuando hay un fallo de página, el SO se encontrará cuatro categorías de páginas, según los bits: 0= (0,0) no ha sido referenciada ni modificada 1= (0,1) no ha sido referenciada, pero sí modificada 2= (1,0) ha sido referenciada, pero no modificada 3= (1,1) ha sido referenciada y modificada El algoritmo sustituye una página de la clase más baja que no esté vacía.

G e s t i ó n d e l a m e m o r i a | 11

Se puede construir el algoritmo LRU mediante un programa. Se conoce como el algoritmo de uso no frecuente (NFU). Necesita una variable tipo contador asociada a cada página, con valor inicial 0. Cuando ocurre un fallo de página, se elige la página con el valor mínimo del contador. El problema es que este algoritmo no olvida, así que páginas que fueron utilizadas con mucha frecuencia hace tiempo, mantienen el valor del contador alto y no son sustituidas. Hay una clase de algoritmos que nunca presentan la anomalía de Belady, los algoritmos de pila. Es un algoritmo para el que se puede demostrar que el conjunto de páginas en memoria para n marcos es un subconjunto del conjunto de páginas que se tendrían con n+1 marcos.

4.8 Políticas de asignación Las políticas de asignación intentar ser un compromiso entre distintos requerimientos conflictivos. El número mínimo de marcos por proceso viene fijado por la propia arquitectura del computador, mientras que el número máximo es definido por la cantidad de memoria física disponible. La elección del número de marcos para cada proceso se hará entre estos dos límites. Para sistemas con capacidad de multiproceso, la sustitución de páginas se pueden clasificar en dos categorías: local y global. Las globales permiten que para un proceso se seleccione un marco para sustitución del conjunto de todos los marcos. En las locales para cada proceso se seleccionan sólo marcos asignados a él. Con políticas de sustituciones locales, el número de marcos de un proceso no cambia, mientras que con sustituciones globales puede ocurrir que un proceso seleccione sólo marcos asignados a otros procesos. El problema para la sustitución global es que los programas no pueden controlar su propia razón de fallos de páginas, depende también de los fallos de páginas de los demás procesos. En cambio, para políticas locales, el conjunto de páginas de un proceso depende sólo del comportamiento del mismo.

4.8.1 El modelo del conjunto de trabajo Al aumentar el grado de multiprogramación se podría esperar que la utilización del procesador también aumentase. Generalmente éste es el caso mientras el grado de multiprogramación se mantenga por debajo de un cierto nivel, que depende del tamaño de la memoria disponible. Si el grado de multiprogramación excede ese límite, entonces se provoca un marcado aumento en el intercambio de páginas entre la memoria principal y el disco, acompañado por una inesperada disminución en la utilización del procesador. La explicación es que con el alto de multiprogramación es imposible que todos los procesos mantengan suficientes páginas en memoria para que no se generen un gran número de fallos de página. Se satura el canal de transferencia con el disco, se bloquean muchos procesos esperando un intercambio de páginas y el procesador está infrautilizado. Esto se conoce como catástrofe (thrashing). La catástrofe se puede limitar mediante el empleo de algoritmos de sustitución locales, ya que si un proceso comienza un fenómeno de catástrofe, no puede coger marcos de otro proceso y extender la catástrofe a los otros procesos. Para prevenir la catástrofe se debe suministrar a los procesos tantas páginas como necesiten. El conjunto de páginas utilizadas en un determinado momento por el proceso se denomina conjunto de trabajo. Para evitar la catástrofe, el grado de multiprogramación no debe ser mayor que el que permite que los conjuntos de trabajo de todos los procesos se puedan tener simultáneamente en la memoria.

G e s t i ó n d e l a m e m o r i a | 12 El problema se reduce a determinar que páginas constituyen el conjunto de trabajo de un proceso. Para ello se hace uso del principio de localidad: “Las referencias de los programas tienden a agruparse en pequeñas zonas del espacio de direcciones, y estas localizaciones tienden a cambiar solo intermitentemente” En las políticas de sustitución y asignación se debe seguir la siguiente regla genérica: Ejecutar un proceso solamente si el conjunto de trabajo está por completo en memoria principal, y no eliminar una páginas que es parte del conjunto de trabajo de un proceso.

4.9 Aspectos de diseño para los sistemas de paginación Cuestiones que un diseñador de SO debe tener en cuenta al efectuar la gestión de la memoria.

4.9.1 Tamaño de página En general, las páginas se eligen de tamaños que son potencias de 2. Un tamaño pequeño supone un menor desperdicio de la memoria. Si las páginas son pequeñas las tablas de páginas tienen que ser grandes, y como cada proceso tiene su propia copia de la tabla de páginas sería recomendable tablas pequeñas, lo que supone páginas grandes. Otro problema es el tiempo necesario para leer y escribir una página. Este tiempo está compuesto por un periodo de latencia y por el propio tiempo de transferencia. El tiempo de transferencia depende del tamaño de la página, es proporcional a la cantidad de información transferida. Hay otros factores, como la relación entre el tamaño de página y el tamaño de los sectores del disco; pero no hay una respuesta satisfactoria global.

4.9.2 Prepaginación Cuando un proceso se arranca inicialmento o despés de haber sido suspendido, tiene que traer a memoria todas las páginas que necesita para su ejecución. Se pueden traer de una sola vez a memoria todas las páginas que se precisan (técnica de prepaginación). El problema es saber si el coste de la paginación es menor que el coste de servir fallos de páginas.

4.9.3 Frecuencia de fallos de páginas El modelo del conjunto de trabajo es útil para realizar la prepaginación, pero no es el más adecuado para manejar el control de la catástrofe. Se pueden establecer límites entre los cuales se desea mantener el porcentaje de fallos de páginas. La política a seguir será mantener el número de fallos de páginas entre estos límites. Si en algún momento existe un número elevado de procesos en memoria, que no permiten mantener la razón de fallos de páginas por debajo del límite superior, entonces se retira un proceso y se reparten sus marcos de páginas entre los otros.

Related Documents