TEORÍA DE LOS SISTEMAS OPERATIVOS 1 GESTIÓN Y ADMINISTRACIÓN DE LA MEMORIA REAL. INTRODUCCIÓN. La memoria real se puede nombrar de distintas maneras: memoria principal, memoria primaria, memoria interna, memoria física, etc., sin embargo todos estos nombres tienen un significado equivalente. En un sistema monoprogramado, la memoria principal esta dividida en dos partes: una para el sistema operativo y otra para el programa que se está ejecutando en ese momento. En un sistema multiprogramado, la parte de memoria utilizada por el usuario, debe subdividirse aun más, para hacer sitio a varios procesos. La tarea de subdivisión la realiza el sistema operativo dinámicamente y toma el nombre de gestión de memoria. La organización y administración de la memoria principal, tiene una importancia vital para mantener la actividad del procesador, por lo tanto, debe ser uno de los factores más importante a considerar en el diseño de los sistemas operativos. En este tema se plantea un enfoque de la tecnología, que se puede aplicar a la organización y administración de memoria, considerando los distintos esquemas de gestión que se pueden utilizar, partiendo de la necesidad de que un programa, para que se pueda ejecutar, tiene que estar cargado en la memoria principal. La gestión de memoria consiste principalmente, en la asignación de una parte de la memoria física, que tiene una capacidad finita, a los procesos que la soliciten, ya que ningún proceso puede ser activado, antes de que una cierta cantidad de memoria real le haya sido asignada. Una segunda función de la gestión de memoria consiste en que los procesos que están temporalmente inactivos, pueden ser retirados de la memoria, con objeto de dejar espacio libre a otros procesos. En conjunto, la utilización de los recursos así como otros criterios de ejecución de un sistema informático, son afectados por la actuación del modulo de gestión de memoria. La coexistencia de múltiples espacios de direcciones, pertenecientes a los procesos residentes en la memoria principal, requiere algunos procedimientos de protección, para evitar que los accesos a ellos realizados, equivocadamente o intencionadamente, puedan destruir contenidos de sus espacios de direcciones. Al mismo tiempo, procesos que cooperan entre sí, deben de estar provistos de algún medio de compartir datos comunes. Una buena gestión de memoria, en un entorno de multiprogramación, debe soportar ambas protecciones simultáneamente, es decir, aislamiento para separar los espacios de direcciones y uso compartido, permitiendo que los procesos que cooperan entre sí, puedan acceder a áreas comunes de memoria. Se analizarán los distintos esquemas para la gestión de memoria, basados en la asignación de espacio contiguo, es decir, la asignación de memoria es llevada a cabo de tal manera, que cada objeto lógico colocado en memoria, ocupa un conjunto de posiciones consecutivas. A continuación se analizarán los esquemas para la gestión de memoria no contigua, en los cuales la memoria se asigna de tal modo, que las partes de un solo objeto lógico, pueden ser colocadas en áreas no contiguas de la memoria física. APUNTES DE SISTEMAS OPERATIVOS ANGEL GLEZ. DEL ALBA 2 GESTIÓN Y ADMINISTRACIÓN DE LA MEMORIA REAL Una manera muy común de abordar la asignación de espacio contiguo, consiste en dividir la memoria física disponible en particiones y posteriormente satisfacer las peticiones de memoria, asignando las particiones libres si existen. Cuando un proceso residente en la memoria termina, su partición es liberada y queda disponible para ser asignada a otro peticionario. Las particiones de memoria pueden ser definidas estáticamente durante la generación del sistema o dinámicamente en respuesta a las demandas del usuario. Cuando el particionamiento es estático, se produce un desaprovechamiento de la memoria, cuando se carga un objeto de menor tamaño que la partición y al espacio que se desaprovecha, se le denomina fragmentación interna. El particionamiento dinámico, elimina este problema, haciendo cada partición tan grande como sea necesario para ajustarse al objeto dado, por lo tanto, cuando se lleva un objeto fuera de la memoria, la partición ocupada por él, se devuelve a la reserva de espacio libre. Después de algún tiempo de funcionamiento, el particionamiento dinámico produce una dispersión de espacio libre en áreas discontinuas, que son de un tamaño insuficiente para albergar otro objeto. A este tipo de desaprovechamiento de la memoria, se le denomina fragmentación externa. Respecto a la manera de abordar la asignación de memoria no contigua, se pueden utilizar las dos técnicas siguientes: La Paginación. La Segmentación. En la Paginación, la memoria principal se divide en un conjunto de marcos de página de igual tamaño y cada proceso se divide en una serie de páginas del mismo tamaño, que los marcos de página en que se ha dividido la memoria principal. El proceso se cargará situando todas sus páginas en los marcos libres, que no necesariamente serán contiguos. La utilización de la Paginación, elimina la fragmentación externa, pero puede producirse una pequeña fragmentación externa en la última página de un proceso. En la Segmentación los programas se dividen en módulos y cada módulo se convierte en un segmento durante la compilación del programa. Un proceso se cargará, situando todos sus segmentos, en particiones dinámicas, que no necesariamente tienen que ser contiguas. La utilización de la Segmentación, elimina totalmente la fragmentación interna, pero puede producirse fragmentación externa, que se elimina con la compactación. Independientemente del tipo de asignación de la memoria que se utilice, la posible eficacia de un gestor de memoria, es mayor en sistemas donde los programas son reubicables, es decir, que puedan ser cargados en las distintas áreas de memoria, disponibles en un momento dado. Con objeto de proporcionar unas bases comunes, para la evaluación de cada esquema analizado, se establecen los siguientes criterios de medida: Memoria desaprovechada. Complejidad en el tiempo. Procesos suplementarios de acceso a memoria. La memoria desaprovechada se considera que es la fracción de memoria física sin usar, que un esquema de gestión de memoria dado, es incapaz de asignar, cuando procesa una secuencia de peticiones de memoria. APUNTES DE SISTEMAS OPERATIVOS ANGEL GLEZ. DEL ALBA TEORÍA DE LOS SISTEMAS OPERATIVOS 3 La complejidad en el tiempo, se refiere a la dificultad del cálculo que es preciso realizar, para la asignación o desasignación de la memoria, utilizado por un esquema determinado de gestión de la memoria. Los procesos suplementarios de los accesos a memoria, se refieren a la duración de las operaciones adicionales, llevadas a cabo por un esquema de gestión de memoria dado, cuando accede a la memoria. Una definición más amplia de la memoria desaprovechada, consiste en la posibilidad de mantener residentes en memoria, múltiples copias de un único objeto común, debido a un deficiente o restringido uso compartido. Un gestor de memoria ideal debe: Minimizar: La memoria desaprovechada. La complejidad en el tiempo. Los procesos suplementarios de acceso a memoria. Proporcionar: Una buena protección de memoria. Un uso compartido flexible. Estos requerimientos no son realizables simultáneamente, por los esquemas de gestión de memoria que se van a describir, por lo tanto, un diseñador de un sistema operativo, tendrá que identificar y establecer la prioridad de un diseño particular, para crear un esquema de gestión de memoria apropiado a los requerimientos del sistema dado. REQUISITOS PARA LA GESTIÓN DE MEMORIA. Al realizar un estudio de los diversos mecanismos y políticas relacionadas con la gestión de memoria, conviene tener presente los requisitos que se deben satisfacer, en el diseño de un módulo de gestión de memoria: Reubicación. Protección. Compartición. Organización lógica. Organización física. Respecto a la reubicación, se podría decir que en un sistema multiprogramado, la memoria disponible se encuentra compartida por varios procesos y además en ciertos momentos, será preciso poder cargar y descargar los procesos activos, que se encuentran en la memoria principal, para maximizar el uso del procesador, manteniendo una gran reserva de procesos listos para ejecutarse. Cuando un proceso haya sido descargado al almacenamiento secundario, será preciso conocer, si cuando ese proceso vuelva a ser cargado, debe situarse en la misma región de memoria principal, en la que estaba situado anteriormente o bien, puede situarse en posiciones diferentes a las que tenía en el instante en que fue descargado. Esta situación plantea algunos asuntos técnicos relativos al direccionamiento, tal y como se expresa, en la figura que representa la imagen de un proceso. Sin duda alguna, el sistema operativo tiene que conocer, la ubicación de la información de control del proceso y de la pila de ejecución, así como el punto de partida para comenzar la ejecución del proceso. APUNTES DE SISTEMAS OPERATIVOS ANGEL GLEZ. DEL ALBA 4 GESTIÓN Y ADMINISTRACIÓN DE LA MEMORIA REAL Puesto que el sistema operativo, gestiona la memoria y es el responsable de traer el proceso a la memoria principal, todas las direcciones necesarias para la ejecución del proceso deben ser fáciles de conseguir, por lo tanto, el hardware del procesador y el software del sistema operativo, deben ser capaces de traducir las referencias a la memoria lógica encontradas en el código del programa, a las direcciones físicas reales, que reflejen la posición actual del programa en memoria principal. PUNTO DE ENTRADA AL PROGRAMA CÓDIGO DATOS CIMA ACTUAL DE LA PILA PILA BLOQUE DE CONTROL DE PROCESO B.C.P Durante ejecuciones diferentes de un mismo programa, pueden ser asignadas direcciones de carga diferentes, por tanto, es preciso distinguir, una dirección lógica o virtual, que es la que percibe el usuario, de una dirección física o real, que es el lugar de la memoria, donde el programa y sus datos son almacenados, durante una determinada ejecución. Más específicamente, podríamos decir, que las direcciones lógicas o virtuales son identificaciones usadas para referenciar la información, dentro del espacio de direcciones de un proceso, mientras que las direcciones físicas, designan la posición actual de la memoria real, donde los elementos de información son almacenados en tiempo de ejecución. Dependiendo de cuando y como tiene lugar, la proyección desde el espacio de direcciones lógicas o virtuales, hacia el espacio de direcciones físicas o reales, en un esquema de gestión de memoria dado, la reubicación del programa, puede ser considerada como estática o dinámica. La reubicación estática implica, que la reubicación es llevada a cabo, durante la carga del programa en memoria, por un programa que se denomina cargador reubicable. El programa traductor normalmente prepara él modulo objeto, suponiendo que la dirección física cero, es la dirección de comienzo del programa. Cuando el programa es cargado en la memoria por el módulo del sistema operativo denominado cargador, todas las posiciones del programa, que necesitan reubicación, son modificadas de acuerdo con la dirección física de la memoria, que le ha sido asignada al proceso. Una vez que el proceso está en memoria los valores que necesitan reubicación, no se distinguen de aquellos que no la necesitan, por lo tanto, los valores de reubicación se pierden después de la carga y un programa reubicable estáticamente, ejecutado en parte en un área de memoria, no puede ser trasladado a otra y esperar que continúe ejecutándose correctamente. En consecuencia, en sistemas con reubicación estática, un proceso que fue descargado dinámicamente, debe ser cargado, en la misma partición de memoria, donde estaba situado, antes de que se realizara la descarga dinámica. La reubicación dinámica, implica que la proyección del espacio de direcciones lógicas o virtuales, en el espacio de direcciones físicas o reales, es llevado a cabo en tiempo de ejecución, normalmente con alguna asistencia del hardware de la maquina. APUNTES DE SISTEMAS OPERATIVOS ANGEL GLEZ. DEL ALBA TEORÍA DE LOS SISTEMAS OPERATIVOS 5 Los procesos imagen en sistemas con reubicación dinámica, se preparan también, suponiendo que la dirección de comienzo es la dirección lógica o virtual cero y se cargan en la memoria sin ninguna modificación debida a la reubicación. Cuando dichos procesos son ejecutados, todas sus referencias a memoria son reubicadas durante la ejecución de las instrucciones, antes de que se acceda a la memoria física o real. Este proceso es implementado, por medio de un registro base, que contiene la dirección física de la memoria, donde está cargado el proceso y este valor se obtiene del correspondiente Bloque de Control de Proceso (BCP). Cada referencia a memoria generada por la ejecución del proceso, se convierte en la correspondiente dirección física, con solo sumarle el contenido del registro base. 1.000 100 CPU 1.100 + DIRECCIÓN LÓGICA 1.000 DIRECCIÓN FÍSICA P IMAGEN MEMORIA Un proceso imagen preparado suponiendo que la dirección de comienzo es la dirección lógica o virtual cero, se mantendrá inalterada, antes y después de ser cargado en la memoria. La reubicación dinámica, hace posible mover un proceso parcialmente ejecutado en un área de memoria a otra, sin que se produzcan inconvenientes de direccionamiento, en los accesos a las instrucciones y datos en el nuevo espacio. Esta característica es muy provechosa para mantener la descarga dinámica, sin tener que ligar los procesos a las particiones y por tanto, podrá ser utilizado en el particionamiento dinámico, que estudiaremos posteriormente. Respecto a la protección, no hay duda de que cada proceso debe protegerse contra las interferencias no deseada de otros procesos, tanto las que se produzcan de forma accidental como las intencionadas. De esta manera, el código de un proceso no puede hacer referencia a posiciones de memoria de otros procesos sin la debida autorización. Hasta cierto punto, satisfacer las exigencias de reubicación aumenta la dificultad de satisfacer las exigencias de protección, puesto que se desconoce la ubicación de un proceso en la memoria principal y es imposible comprobar las direcciones absolutas durante la compilación, para asegurar la protección. Todas las referencias a memoria generadas por un proceso, deben comprobarse durante la ejecución, para asegurar que solo hacen referencia al espacio de memoria destinado a dicho proceso y como se verá posteriormente, los mecanismos que respaldan la reubicación, también forman parte básica del cumplimiento de las necesidades de protección. Las exigencias de protección de memoria pueden ser satisfechas por el procesador (hardware) en lugar de por el sistema operativo (software) para ello es preciso extender el sistema de protección establecido anteriormente para el sistema operativo, es decir, colocar un bit de protección en cada posición de memoria, a un sistema multiprogramado, en el cual sería necesario APUNTES DE SISTEMAS OPERATIVOS ANGEL GLEZ. DEL ALBA 6 GESTIÓN Y ADMINISTRACIÓN DE LA MEMORIA REAL colocar más de un bit. Este problema se podría resolver estableciendo la protección por áreas de memoria de 1 K, 2 K, 4K, etc. APUNTES DE SISTEMAS OPERATIVOS ANGEL GLEZ. DEL ALBA TEORÍA DE LOS SISTEMAS OPERATIVOS 7 0 MONITOR 200.000 TRABAJO 1 300.000 REG. BASE = 300.000 TRABAJO 2 500.000 REG, LIMITE = 200.000 TRABAJO 3 800.000 REG. BASE PROCESADOR REG. BASE + TAMAÑO. SI SI < NO NO ERROR DE DIRECCIÓN M E M O R I A ERROR DE DIRECCIÓN Respecto a la compartición, es preciso considerar, que cualquier mecanismo de protección que se implemente, debe tener la flexibilidad necesaria, para permitir el acceso de varios procesos a la misma zona de memoria principal, ya que si varios procesos están ejecutando el mismo programa, lo normal es, que todos ellos puedan acceder a la misma copia del programa, del mismo modo, si varios procesos tienen que cooperar en la misma tarea, deberán poder acceder a unas estructuras de datos comunes. Por ejemplo en un sistema de uso compartido, utilizado fundamentalmente para el desarrollo de programas. Si consideramos que una media de 20 usuarios, están editando sus programas y el editor ocupa 50 Kb de memoria, sin la utilización del uso compartido, estos usuarios estarán ocupando 1 Mb de memoria para situar las 20 copias del editor, sin embargo, utilizando el uso compartido, con una única copia del editor sería suficiente. El sistema de gestión de memoria debe permitir accesos controlados a las áreas compartidas de la memoria, sin comprometer la protección básica y de nuevo será preciso repetir, que los mecanismos empleados para respaldar la reubicación, forman parte de las capacidades de compartición. Respecto a la organización lógica se puede decir, que actualmente la mayoría de los programas se organizan en módulos, alguno de los cuales no son modificables, es decir, que son de solo lectura, solo ejecución, etc. Otros en cambio, contienen datos que se pueden modificar. MÓDULO PRINCIPAL MÓDULO 1 ESTRUCTURAS DE DATOS MÓDULO 2 MÓDULO 3 APUNTES DE SISTEMAS OPERATIVOS ANGEL GLEZ. DEL ALBA 8 GESTIÓN Y ADMINISTRACIÓN DE LA MEMORIA REAL Si el sistema operativo y el hardware del computador, pueden tratar de forma efectiva los programas de usuario y los datos que necesitan en forma de módulos de algún tipo, se conseguirán las siguientes ventajas: Los módulos se pueden escribir y compilar independientemente, mientras que el sistema operativo resuelve durante la ejecución, todas las referencias de un módulo a otro. Con un escaso coste adicional, pueden otorgarse varios grados de protección a los distintos módulos, es decir, solo lectura, solo ejecución, etc. Es posible introducir mecanismos, mediante los cuales, los procesos puedan compartir módulos y la ventaja de ofrecer compartición a nivel módulo es que esto se corresponde con la visión del problema que tiene el usuario y por lo tanto, es fácil para el usuario especificar la compartición que desea. El método que más fácilmente satisface estas necesidades es la segmentación, que es una de las técnicas de gestión de memoria, que se analizarán a continuación. Respecto a la organización física, es preciso recordar que la memoria del computador se organiza en al menos dos niveles: La memoria principal. La memoria secundaria. La memoria principal es pequeña, ofrece un acceso rápido con un coste relativamente bajo y es volátil, es decir, no proporciona almacenamiento permanente, por lo tanto, solo será capaz de mantener los programas y los datos de uso actual. La memoria secundaria es más lenta y más económica que la memoria principal, pero proporciona un almacenamiento de gran capacidad, que permite mantener los programas y los datos durante un largo tiempo En este esquema de dos niveles, la organización del flujo de la información entre la memoria principal y la secundaria, debe ser resuelto, por el sistema operativo. La asignación de la responsabilidad de este flujo al programador seria impracticable debido a dos razones. La memoria principal disponible para un programa y sus datos, puede ser insuficiente, por lo tanto, el programador tendría que aplicar una técnica, que se conoce con el nombre de superposición (overlay), en la cual el programa y los datos se organizan de tal forma, que puede haber varios módulos que se asignen a la misma región de la memoria, con un programa principal responsable del intercambio de los módulos según se necesite. En un entorno multiprogramado, el programador no conoce durante la codificación cuanto espacio habrá disponible o donde estará este espacio. Estas dos razones nos indican con toda claridad, que la tarea de mover la información entre estos dos niveles de memoria, debe ser responsabilidad del sistema operativo y corresponderá lógicamente al módulo de gestión de memoria. CARGA DE PROGRAMAS EN LA MEMORIA PRINCIPAL. La tarea central de cualquier sistema de gestión de memoria, será la de incorporar los programas a la memoria principal para su ejecución en el procesador, utilizando para ello los métodos de asignación de memoria ya citados anteriormente: Asignación contigua. Asignación no contigua. APUNTES DE SISTEMAS OPERATIVOS ANGEL GLEZ. DEL ALBA TEORÍA DE LOS SISTEMAS OPERATIVOS 9 Para la asignación de espacio contiguo, las técnicas que se han venido utilizando, en los sistemas operativos tradicionales, consisten en dividir el espacio de memoria disponible en particiones: Particiones fijas o estáticas. Particiones variables o dinámicas. Para la asignación espacio no contiguo, las técnicas que se utilizan normalmente, son la Segmentación simple y la Paginación simple, que generalmente no se usan en solitario, sino más bien en combinación con la utilización de la memoria virtual. No obstante el estudio de la memoria virtual resultará más sencillo si se consideran estas dos técnicas sin tener en cuenta la memoria virtual. A continuación se trata de analizar con detalle todas estas técnicas, que se han ido utilizando en los distintos sistemas operativos tradicionales, para la gestión de la memoria contigua y no contigua y posteriormente nos introduciremos en el estudio de los sistemas de gestión de memoria virtual, que son los que se utilizan en la actualidad. MONITOR DE PROCESO ÚNICO. MONITOR RESIDENTE. Los primeros sistemas informáticos, solo permitían la utilización de la maquina a un usuario, por lo tanto, todos los recursos incluida la memoria, estaban a su disposición y no existían, los sistemas operativos actuales. A este concepto de utilización se le denomina maquina desnuda. Para facilitar el trabajo de los distintos usuarios, se estableció un código común para todos los usuarios, en el que se implementó el sistema de control de E/S (IOCS), que fue el comienzo del concepto actual de los sistemas operativos. 0 MONITOR RESIDENTE BORDE DE LA MEMORIA ÁREA DE PROCESOS TRANSITORIOS MAX TECHO DE LA MEMORIA El monitor de proceso único, fue el origen de los sistemas monoprogramados y es la manera más simple de realizar la gestión de memoria y en ella la memoria se divide en dos áreas contiguas: Una de ellas esta permanentemente asignada al sistema operativo, que debe estar residente en memoria (Monitor). La otra es asignada a los procesos transitorios, los cuales son cargados de uno en uno, en respuesta a las órdenes del usuario. Tanto los procesos de usuario, como las partes del sistema operativo, que no están residentes en memoria, deben ejecutarse en el área de los procesos transitorios. Esta forma de gestión de memoria, fue utilizada por los primeros sistemas operativos, fundamentalmente, en los microcomputadores u ordenadores personales de proceso único que en la actualidad han desaparecido, ya que el rendimiento obtenido es muy bajo. APUNTES DE SISTEMAS OPERATIVOS ANGEL GLEZ. DEL ALBA 10 GESTIÓN Y ADMINISTRACIÓN DE LA MEMORIA REAL Básicamente el sistema operativo necesitaba guardar siempre, la primera y última posiciones transitorias: La primera es la inmediatamente siguiente al monitor residente y se denominaba borde de la memoria. La última estaba determinada por la capacidad de la memoria instalada en una configuración determinada y se denominaba techo de la memoria. Para poder suministrar un área contigua de memoria libre a los procesos transitorios, el sistema operativo estaba situado en uno de los extremos de la memoria. La elección de un extremo de la memoria, es decir, la parte alta o la baja, estaba normalmente influenciada, por la posición del área del vector de interrupciones para el hardware subyacente. Para proteger estos datos vitales del sistema, el vector de interrupciones se considera como parte del sistema operativo, por lo tanto, este estará situado en el mismo extremo de la memoria, donde reside el vector de interrupciones. Otras partes del sistema operativo, tales como el cargador o bien el interprete de órdenes del usuario, pueden estar situados en el extremo opuesto de la memoria, dejando así una única área contigua de memoria libre en el centro. Cuando el proceso que se está ejecutando en el área de procesos transitorios finaliza, el sistema operativo carga otro proceso de los que están en la cola de espera. En un monitor de proceso único, no existe protección entre procesos, ya que solo puede haber un proceso residente en memoria, sin embargo, será preciso proteger el sistema operativo de posibles destrucciones, por parte del proceso transitorio en ejecución. Los mecanismos de protección utilizados son los ya expuestos anteriormente, que consistían en la utilización de registros base y registros limite, así como la utilización de los bits de protección, que permiten distinguir, entre la ejecución de un proceso del sistema operativo (Modo Supervisor) o un proceso de usuario (Modo Usuario). Otro método de protección de la memoria, consiste en asociar a cada posición de memoria un bit de protección, quedando dividida la memoria en dos zonas de tamaño arbitrario, en una de las zonas los bits de protección están a cero y en la otra a uno. El uso compartido de programas y datos en memoria, no tiene mucho sentido en un entorno de proceso único. Con una asignación de memoria sencilla y con la ausencia de las complejidades de la multiprogramación, un monitor de proceso único es relativamente sencillo de diseñar, no obstante, de la falta de un soporte de multiprogramación, se obtiene generalmente como resultado un bajo rendimiento, tanto en el procesador como en la memoria: El procesador es desaprovechado al no existir más que un proceso, por lo tanto, el procesador quedará inactivo, cuando se produzca una interrupción del sistema. La memoria es utilizada por debajo de sus posibilidades debido a que, una porción de ella, la comprendida entre el espacio final del espacio de direcciones del proceso y el final del área de procesos transitorios, es desaprovechada. SUPERPOSICIONES. (OVERLAYS). Puesto que todo el espacio lógico de direcciones de un proceso, debe encontrarse en la memoria física antes de ejecutar el proceso, la dimensión del proceso esta limitada por el tamaño de la memoria física. APUNTES DE SISTEMAS OPERATIVOS ANGEL GLEZ. DEL ALBA TEORÍA DE LOS SISTEMAS OPERATIVOS 11 Teniendo en cuenta, que las capacidades de la memoria, comenzaron siendo muy pequeñas y han ido creciendo con el avance de la electrónica, para que un proceso pueda ser mayor, que la cantidad de memoria física que se le asigna, se utiliza la técnica denominada superposiciones (Overlays). Esta técnica consiste en conservar en memoria, solamente aquellas instrucciones y datos, que se necesitan de una manera permanente, el resto de las instrucciones, que solo son necesarias en determinados momentos de la ejecución, se pueden cargar en un área común cuando el proceso las requiera. Para que esta técnica se pueda utilizar, será preciso dividir la zona de memoria asignada en tres partes: Una zona para las instrucciones que se necesitan de una manera permanente. Una zona pequeña donde residirán las instrucciones necesarias para gestionar las superposiciones. Una zona común donde se cargaran las instrucciones que no son necesarias de forma permanente. Por ejemplo, supongamos que tenemos un programa, que tiene un módulo principal que controla la total ejecución de un programa, que realiza dos funciones consecutivas, necesitando la ejecución de dos módulos independientes, el programa se ejecutará en dos pasos sucesivos. SISTEMA OPERATIVO PARA CARGAR LA TOTALIDAD DEL PROGRAMA SERÍAN NECESARIAS 200 K 50K MÓDULO PRINCIPAL 10K GESTIÓN DE SUPERPOSICIONES 90K 70 K MÓDULO 1 80 K MÓDULO 2 ZONA COMÚN ASIGNACIÓN POR INTERCAMBIO. (SWAPPING). Realmente se podría decir que un intercambio (Swapping), es una compartición asíncrona de la memoria, ya que se sabe que para que un proceso pueda ejecutarse necesita estar en la memoria principal, sin embargo, un proceso puede intercambiarse temporalmente, saliendo de la memoria principal, para situarse en el almacenamiento secundario y regresar posteriormente a la memoria principal para continuar su ejecución. S.O. SWAP-0UT (SALIDA) P1 P1 P2 SWAP-IN (ENTRADA) P3 P5 P4 APUNTES DE SISTEMAS OPERATIVOS ANGEL GLEZ. DEL ALBA 12 GESTIÓN Y ADMINISTRACIÓN DE LA MEMORIA REAL Si suponemos un entorno de multiprogramación en una memoria restringida, con un algoritmo circular para la asignación del procesador, es decir, un sistema de tiempo compartido. Cuando un cuanto expira, el gestor de memoria comenzará a intercambiar el proceso que acaba de terminar, para incorporar otro proceso al espacio de memoria que acaba de liberarse, mientras tanto, el planificador del procesador asignará un nuevo cuanto a otro proceso en memoria y cada vez que un proceso finalice su cuanto, se intercambia con otro. Es preciso que el gestor de memoria pueda intercambiar los procesos con la velocidad suficiente, para que siempre haya procesos en memoria listos para ejecutarse, cada vez que el planificador del procesador desee introducir un nuevo proceso. El tiempo establecido para un cuanto, debe ser suficiente, para que se efectúen las operaciones necesarias, para la realización de un intercambio. Para algoritmos basados en prioridades, se emplea también esta política de intercambio. Si llega un proceso de mayor prioridad y desea ejecutarse, el gestor de memoria puede intercambiarlo con un proceso de menor prioridad, para así cargar y ejecutar el de mayor prioridad. Cuando este proceso de mayor prioridad termina, puede devolver el proceso de menor prioridad y continuar su ejecución. Esta variante de intercambios se denomina salida y entrada por intercambios, es decir, Swap-out y Swap-in. Normalmente un proceso que sale de un intercambio, regresará al mismo espacio de memoria que antes ocupaba, aunque como veremos posteriormente, esta restricción la determina el tipo de reubicación: Si la reubicación es estática, el direccionamiento se lleva a cabo durante la carga, el proceso, por lo tanto, no podrá moverse a otras localidades de memoria. Si la reubicación es dinámica, el direccionamiento se lleva a cabo durante la ejecución, entonces si será posible intercambiar un proceso a un espacio de memoria distinto. Los intercambios requieren un espacio en el almacenamiento secundario, situado generalmente en un disco de la mayor velocidad de acceso posible o en un tambor magnético y debe tener la capacidad suficiente, para contener copias de la imagen de todos los procesos de usuario ofreciendo acceso a esta imagen. El sistema mantiene una cola de procesos listos para ejecutarse, que consiste en el almacenamiento de la información de control, de los procesos cuya imagen de memoria se encuentra en el almacenamiento secundario o en la memoria principal. Cuando el planificador del procesador, decide ejecutar un proceso, comprueba si el siguiente proceso de la cola esta en memoria, si no está y no se dispone de una región de memoria libre, el planificador intercambia un proceso en memoria con el proceso deseado, obviamente el tiempo de cambio de contexto en un sistema de este tipo es bastante alto. Para obtener una utilización eficiente del procesador, el tiempo de ejecución para cada proceso debe ser mayor que el tiempo de intercambio. Ejemplo: Se supone que un proceso de usuario, tiene un tamaño de 512 Kb y el almacenamiento secundario es un disco con una velocidad de transferencia de 1 Mb/seg. La transferencia del proceso de 512 Kb, de la memoria o bien hacia ella durará: 512 Kb / 1024 Kb = 1 / 2 seg. = 500 msg. Suponiendo un tiempo de posicionamiento de 8 msg. y un tiempo de latencia de 2 msg. El tiempo de intercambio es de 510 msg. Ahora bien, como el intercambio debe ser de salida y entrada, el tiempo total de intercambio es de 1020 msg. APUNTES DE SISTEMAS OPERATIVOS ANGEL GLEZ. DEL ALBA TEORÍA DE LOS SISTEMAS OPERATIVOS 13 La mayor parte del tiempo de intercambio se invierte en la transferencia y el tiempo de transferencia total es directamente proporcional a la cantidad de memoria que se intercambia. Por lo tanto, si tenemos unos datos de tipo medio: Longitud media de los programas = 256K. Tiempo de posicionamiento = 8 msg. Tiempo de latencia media = 2 msg. Ratio de transferencia = 1024K / sg. S.O MEMORIA DISCO 10 msg. + 256 K / 1.024 k = 260 msg. 10 msg. + 256 k / 1.024 K= 260 msg. T. INTERCAMBIO = 260 + 260 = 520 MSG. Una forma de disminuir el tiempo necesario para la realización de un intercambio, consiste en solapar la ejecución y el intercambio mediante la creación de tres zonas de memoria o buffers: Una dedicada a contener el programa que esta ejecutando actualmente. Otra para el programa que se acaba de ejecutar y que se debe transferir al soporte externo. La última para almacenar el programa que debe ser ejecutado a continuación. El programa que tiene el control de la CPU, estará situado en la memoria, para de esta manera, continuar con el proceso descrito. La cola activa esta compuesta por todos los programas incluidos en la memoria y en condiciones de ser ejecutados y requiere de un planificador a medio plazo que tendrá la misión de seleccionar el próximo programa a ejecutar, entregando el control al distribuidor para localizarlo, bien en la memoria o bien en el soporte y a continuación efectuar el cambio, de la manera que se expresa en la figura. Esta técnica se denomina Swapping a través de buffers y se representa a continuación: PRIMERA FASE PROGRAMA DEL USUARIO EN EJECUCIÓN MEMORIA BUFFER 2 PROGRAMA A EFECTUAR A CONTINUACIÓN BUFFER 1 PROGRAMA QUE ACABA DE EJECUTARSE DISCO SISTEMA OPERATIVO SEGUNDA FASE BUFFER 2 BUFFER 1 SE AJUSTAN LOS CONTENIDOS DE LAS DIFERENTES ZONAS DE MEMORIA PARA LA SIGUIENTE ETAPA DEL SWAP SISTEMA OPERATIVO APUNTES DE SISTEMAS OPERATIVOS ANGEL GLEZ. DEL ALBA 14 GESTIÓN Y ADMINISTRACIÓN DE LA MEMORIA REAL Existen otras restricciones para los intercambios, ya que si se quiere intercambiar un proceso, debe asegurarse que este completamente inactivo, pues cualquier solicitud de E/S que este pendiente tiene una importancia especial. Supongamos que la operación de E/S esta en una cola porque el dispositivo estaba ocupado. Si se intercambia por ejemplo el proceso P1 que esta en la memoria con el proceso P2 que está en el almacenamiento secundario, la operación de E/S que tenia pendiente el proceso P1, podría intentar usar la memoria que ahora pertenece al proceso P2. Las dos soluciones para resolver este problema son: Nunca intercambiar un proceso con operaciones de E/S pendientes. Ejecutar las operaciones de E/S, solo en los buffers del sistema operativo. ASIGNACIÓN ESTATICA DE LA MEMORIA PARTICIONADA. En la mayoría de los esquemas de gestión de memoria, se puede suponer que el sistema operativo ocupa una parte fija de la memoria principal y el resto de la memoria está disponible para ser usado por varios procesos. El esquema más sencillo de gestión de la memoria disponible es dividirla en particiones con límites fijos. Las particiones pueden ser del mismo o de distinto tamaño, pero generalmente serán de distinto tamaño. PARTICIONES DEL MISMO TAMAÑO S.O PARTICIONES DE DISTINTO TAMAÑO S.O 128 K 512 K 256 K 512 K 512 K 512 K 1.024 K 512 K Si las particiones son del mismo tamaño, la ubicación de un proceso en la memoria es trivial, ya que mientras haya una partición libre, puede cargarse un proceso en esa partición. Cuando todas las particiones están ocupadas por procesos que no están listos para ejecutarse, uno de esos procesos debe sacarse y hacer sitio para un nuevo proceso. Si las particiones son de distinto tamaño, hay dos maneras posibles de asignar los procesos a las particiones: La forma más simple es asignar cada proceso a la partición más pequeña en la que quepa, es decir, solo en la que mejor se adapte, para lo cual es preciso conocer la cantidad máxima de memoria, que necesitaría cada uno de los procesos y realmente esta información no siempre se conocerá. En este caso, será necesaria una cola de planificación para cada partición, que albergue los procesos listos para ejecutarse, cuyo destino es esa partición. La ventaja de este enfoque es que los procesos están siempre asignados de forma que se minimiza la memoria desaprovechada dentro de cada partición. Este enfoque que parece óptimo desde el punto de vista de una partición individual, no lo es, desde el punto de vista del sistema global, ya que si tenemos particiones grandes y los APUNTES DE SISTEMAS OPERATIVOS ANGEL GLEZ. DEL ALBA TEORÍA DE LOS SISTEMAS OPERATIVOS 15 procesos que van llegando son todos pequeños, las colas de las particiones grandes permanecerán sin usar, incluso aunque algún proceso más pequeño pudiera haber sido asignado a las mismas. Una solución mejor sería emplear una sola cola para todos los procesos y cuando se va a cargar un proceso en memoria principal, se selecciona la partición más pequeña disponible que pueda albergar al proceso. Si todas las particiones están ocupadas, se debe tomar una decisión de intercambio y puede darse preferencia al intercambio de la partición más pequeña, que pueda contener el proceso entrante. También es posible considerar otros factores, tales como, prioridades y preferencia para descargar procesos bloqueados antes que procesos listos. El uso de particiones de distinto tamaño proporciona cierto grado de flexibilidad a las particiones fijas, además, ambos tipos de esquema de partición fija son relativamente simples y exigen un software del sistema operativo sencillo y una sobrecarga de procesamiento mínima. UNA COLA DE PROCESOS POR CADA PARTICIÓN UNA COLA DE PROCESOS ÚNICA S.O. S.O. 128 K 128 K 256 K 256 K 512 K 512 K 1.024 K 1.O24 K El particionamiento fijo consiste en la asignación estática de la memoria particionada, que es una forma de hacer posible la multiprogramación, dividiendo la memoria física disponible en varias particiones, cada una de las cuales puede ser asignada a diferentes procesos. Dependiendo de como y cuando son creadas y modificadas esas particiones, el particionamiento de la memoria, puede ser estático o dinámico. A continuación vamos a estudiar el particionamiento estático y posteriormente analizaremos el particionamiento dinámico. PARTICIONAMIENTO ESTÁTICO. El particionamiento estático se realiza durante el proceso de generación del sistema, estableciendo él numero de particiones fijas y el tamaño de cada una de ellas, teniendo en cuenta la capacidad de la memoria física disponible, además el grado de multiprogramación deseado y el tamaño típico de los procesos más frecuentemente utilizados en la instalación. Esto tendrá que realizarse en función de las estadísticas recogidas durante el funcionamiento real del sistema. APUNTES DE SISTEMAS OPERATIVOS ANGEL GLEZ. DEL ALBA 16 GESTIÓN Y ADMINISTRACIÓN DE LA MEMORIA REAL Un ejemplo de memoria particionada esta representado en la siguiente figura: 0K SISTEMA OPERATIVO 100 K LIBRE 400 K P1 500 K P2 750 K P3 900 K 1.000 K LIBRE De las seis particiones en que esta dividida la memoria, una de ellas, se supone que esta ocupada por el sistema operativo, otras tres por procesos de usuario y las dos particiones restantes, están libres y disponibles para la asignación. Una vez que las particiones están definidas, el sistema operativo necesita guardar información de su estado, tal como, si la partición esta libre, o bien está asignada, para posteriormente utilizar esta información en el momento de la asignación. El estado actual y los atributos de las particiones, están recopilados en una estructura de datos, denominada Tabla de Descripción de Particiones (PDT), Partition-Description Table. Tal y como se indica en dicha tabla, cada partición esta descrita por su dirección de comienzo (Base), su tamaño y su estado. Cuando una partición estática es usada, en la PDT solo variara el campo correspondiente al estado, ya que los restantes campos son estáticos y contienen los valores establecidos en el momento de la definición de las particiones. TABLA DE DESCRIPCIÓN DE LAS PARTICIONES Nº DE PARTICIÓN BASE TAMAÑO ESTADO 0 0K 100 K ASIGNADA 1 100 K 300 K LIBRE 2 400 K 100 K ASIGNADA 3 500 K 250 K ASIGNADA 4 750 K 150 K ASIGNADA 5 900 K 100 K LIBRE Cuando un proceso va a ser creado o activado, el sistema operativo intenta asignarle una partición de memoria libre de tamaño suficiente, consultando las entradas en la PDT, si la encuentra, el campo correspondiente a la entrada seleccionada, es marcado como asignada y el proceso imagen es cargado en la partición correspondiente. El formato descrito para la PDT, no nos proporciona ninguna indicación de cual es el proceso que esta ocupando una partición dada, por lo tanto la identidad de la partición asignada debe ser establecida en el bloque de control del proceso (PCB). APUNTES DE SISTEMAS OPERATIVOS ANGEL GLEZ. DEL ALBA TEORÍA DE LOS SISTEMAS OPERATIVOS 17 Cuando el proceso termina o bien es descargado dinámicamente, la información del bloque de control de proceso, será utilizada para localizar la partición correspondiente y actualizar la PDT, cambiando su estado de asignada a libre. Con objeto de implementar estas ideas básicas, necesitamos solucionar dos problemas: Estrategia a utilizar para la asignación de una partición. Que ocurre cuando no hay ninguna partición adecuada disponible para ser asignada. Las estrategias a utilizar para la asignación de una partición, se fundamentan en los siguientes criterios: Primera en adaptarse, First-Fit (FF). La que mejor se adapte, Best-Fit (BF). El primer criterio consiste, en asignar la primera partición libre suficientemente grande, para contener el proceso que esta siendo creado. El segundo criterio consiste, en asignar la partición libre más pequeña, capaz de satisfacer los requerimientos del proceso. Cuando se va a decidir entre estos dos métodos, se debe hacer una elección entre velocidad de ejecución y utilización de la memoria. Ambos métodos deben explorar la PDT, para identificar una partición libre de tamaño adecuado, sin embargo, el primero termina en el momento que encuentra la primera partición, que cumple los requerimientos y el segundo debe analizar todas las entradas de la PDT, para identificar la que mejor se ajuste. El resultado que se obtiene es el siguiente: El primer método obtiene mayor rapidez. El segundo método consigue una mejor utilización de la memoria. Como ejemplo de como trabajar las dos estrategias de asignación de particiones, considerando la PDT anterior, queremos crear un proceso de 70 Kb y la situación de la PDT es la expresada anteriormente: El primer método le asignaría la partición 1 y se produciría una fragmentación interna de 230 Kb, que no podrán ser utilizadas hasta que el proceso termine o bien sea descargado dinámicamente. El segundo método, tendrá que analizar algunas entradas más de la PDT y asignaría la partición 5, resultando una fragmentación interna de 30 Kb, que no podrán ser utilizadas. Si él número de particiones fijas es pequeño, las diferencias en tiempo de ejecución entre los dos métodos, no será significativo. En general la demanda de particiones debe proceder de dos fuentes principales: La creación de nuevos procesos. La reactivación de procesos que anteriormente fueron descargados dinámicamente. El módulo de gestión de memoria intenta satisfacer estas peticiones, con la reserva de particiones libres, sin embargo, hay ciertas situaciones en las que el gestor no puede hacerlo así: Ninguna partición es suficientemente grande para contener el proceso entrante. Todas las particiones están asignadas. APUNTES DE SISTEMAS OPERATIVOS ANGEL GLEZ. DEL ALBA 18 GESTIÓN Y ADMINISTRACIÓN DE LA MEMORIA REAL Algunas particiones están libres, pero ninguna de ellas, es suficientemente grande para contener el proceso entrante. Si el proceso que va a ser creado es demasiado grande, para encajar en cualquiera de las particiones del sistema, se emitirá un mensaje de error. Esta situación es básicamente un error de diseño, que puede ser remediado volviendo a definir las particiones de una manera más adecuada. Otra opción es reducir los requerimientos de memoria por parte del programa, codificándolo de nuevo o también utilizando la técnica de superposición. El caso de que todas las particiones estén asignadas, se puede resolver aplazando la carga del proceso, hasta que una partición adecuada, le pueda ser asignada. Una alternativa podría ser, forzar a un proceso residente en memoria a abandonarla, para dejar disponible una partición suficientemente grande, para almacenar el proceso. Ambos, aplazamiento y descarga dinámica, son también aplicables para resolver el tercer caso, donde hay particiones libres pero son inadecuadas. APUNTES DE SISTEMAS OPERATIVOS ANGEL GLEZ. DEL ALBA TEORÍA DE LOS SISTEMAS OPERATIVOS 19 Si optamos por el aplazamiento, el rendimiento en cuanto a la utilización de la memoria será alto, si el sistema operativo continua asignando particiones a otros procesos, que están en la cola de espera y cuyos requerimientos de memoria son menores, sin embargo, haciendo esto se puede violar el orden de activación de procesos, propuesto por el algoritmo de planificación y posteriormente puede afectar al funcionamiento del sistema. Las situaciones descritas ilustran la estrecha relación e interacción entre la gestión de memoria y la planificación de los procesos, por parte del sistema operativo. En estos sistemas con particionamiento estático de la memoria, él número de particiones establece, él limite mayor de procesos residentes en memoria y por lo tanto, el grado de multiprogramación. Dentro del límite, la utilización de la CPU puede ser mejorada incrementando la proporción entre procesos disponibles y residentes, esto puede ser llevado a cabo, retirando de la memoria los procesos bloqueados temporalmente, cuando existan procesos listos para ser cargados en las particiones ocupadas por aquellos. Un proceso retirado es normalmente guardado en el almacenamiento secundario, hasta que todos los recursos que necesita para su ejecución, excepto la memoria y la CPU, puedan serle asignados. DESCARGA DINÁMICA. Consiste en retirar de la memoria los procesos que están bloqueados y su subsiguiente regreso, cuando los recursos que necesita para su ejecución, a excepción de la memoria y la CPU, le son concedidos. La descarga dinámica, se utiliza para implementar la multiprogramación, en sistemas con una memoria restrictiva, también puede ser provechosa para mejorar la utilización de la CPU, en entornos de memoria particionada, incrementando la proporción entre procesos preparados y residentes. Cuando el planificador decide admitir un nuevo proceso, para el cual no se ha podido encontrar una partición adecuada, se produce la descarga dinámica de uno de los procesos bloqueados, que ocupe una partición suficientemente grande, para satisfacer las necesidades del proceso entrante. Para realizar la elección del proceso, que abandonará la memoria y pasará al almacenamiento secundario, se tendrá en cuenta, además de la capacidad de la partición, la prioridad del proceso, que recursos que está esperando, ya que si el recurso que le mantiene en espera, es un recurso lento, existe una cierta probabilidad de que este proceso este suspendido, durante un periodo de tiempo más largo. Otra consideración que se deberá tener en cuenta, en la elección del proceso que abandonará la memoria, será el tiempo que lleva ese proceso en la memoria, con objeto de evitar la retirada de la memoria de un proceso inmediatamente después de su admisión. Un proceso está típicamente preparado para la ejecución y sometido al sistema operativo en forma de archivo, que contiene un programa en formato ejecutable y los datos relacionados con él, además de la pila necesaria para guardar las direcciones de las llamadas y regresos a los distintos procedimientos que componen el programa. APUNTES DE SISTEMAS OPERATIVOS ANGEL GLEZ. DEL ALBA 20 GESTIÓN Y ADMINISTRACIÓN DE LA MEMORIA REAL Este proceso puede también contener, atributos del proceso tales como: prioridad, requerimientos de memoria, etc. que figuran en el bloque de control del espacio denominado proceso imagen. El archivo de descarga del sistema se crea en el momento de la creación del proceso y esta situado en un soporte del almacenamiento secundario, que utiliza el sistema operativo y que normalmente suele ser el más rápido, para reducir así el tiempo de intercambio. Independientemente del tipo de archivos de descarga utilizados, la necesidad de acceder a la memoria secundaria, hace que la descarga dinámica sea una operación lenta, si es comparado, con el tiempo de ejecución de una instrucción por parte de la CPU. Así por ejemplo, la descarga de un proceso de 256 KB, utilizando un disco con un tiempo de posicionamiento medio de 8 msg, un tiempo de latencia medio de 2 msg. La velocidad de transferencia es de 5Mb/seg, consume por termino medio 10 msg en posicionar las cabezas de lectura/escritura para comenzar la transferencia que tardará al menos 50 msg en completarla. 5 * 2 20 --------- 1000 msg 256 * 2 10 ------ x= 2 8 * 2 10 * 1000 1000 50msg 20 5 * 2 20 x La carga de otro proceso de 256 Kb en la partición vacía, puede llevar otros 60 msg. El tiempo total será de 120 msg. Durante este tiempo, al menos, 256 Kb de memoria principal están inactivos, por tanto, será preciso tenerlo en cuenta, cuando se decide realizar una descarga dinámica. Un asunto importante en los sistemas que soportan la descarga dinámica, es si la relación entre el proceso y la partición es estática o dinámica, es decir, si un proceso que fue descargado, puede ahora ser cargado, solo en la partición especifica desde la que fue retirado o por el contrario, en cualquier partición del tamaño adecuado. En general, esta relación es estática en los sistemas con particionamiento estático de la memoria, independientemente de que la descarga dinámica sea soportada o no. En los procesos que no están permanentemente ligados a una partición especifica, son mucho más flexibles y tienen mayor capacidad para hacer un uso eficiente de la memoria. REUBICACIÓN DE MEMORIA. El concepto de reubicación de memoria, se refiere a la capacidad de cargar y ejecutar un programa dado, en un lugar arbitrario de la memoria. Durante ejecuciones diferentes de un mismo programa, pueden ser asignadas direcciones de carga diferentes, por tanto, es preciso distinguir, una dirección lógica o virtual, que es la que percibe el usuario, de una dirección física o real, que es el lugar de la memoria, donde el programa y sus datos son almacenados, durante una determinada ejecución. Más específicamente, podríamos decir, que las direcciones lógicas o virtuales son identificaciones usadas para referenciar la información, dentro del espacio de direcciones de un proceso, mientras que las direcciones físicas, designan la posición actual de la memoria real, donde los elementos de información son almacenados en tiempo de ejecución. Dependiendo de cuando y como tiene lugar, la proyección desde el espacio de direcciones lógicas o virtuales, hacia el espacio de direcciones físicas o reales, en un esquema de reubicación dado, la reubicación del programa, puede ser considerada como estática o dinámica. La reubicación estática implica, que la reubicación es llevada a cabo, durante la carga del programa en memoria, por un programa que se denomina cargador reubicable. APUNTES DE SISTEMAS OPERATIVOS ANGEL GLEZ. DEL ALBA TEORÍA DE LOS SISTEMAS OPERATIVOS 21 El programa traductor normalmente prepara él modulo objeto, suponiendo que la dirección física cero, es la dirección de comienzo del programa. Cuando el programa es cargado en la memoria por el módulo del sistema operativo denominado cargador, todas las posiciones del programa, que necesitan reubicación, son modificadas de acuerdo con la dirección física de la memoria, que le ha sido asignada al proceso. Una vez que el proceso está en memoria los valores que necesitan reubicación, no se distinguen de aquellos que no la necesitan, por lo tanto, los valores de reubicación se pierden después de la carga y un programa reubicable estáticamente, ejecutado en parte en un área de memoria, no puede ser trasladado a otra y esperar que continúe ejecutándose correctamente. En consecuencia, en sistemas con reubicación estática, un proceso que fue descargado dinámicamente, debe ser cargado, en la misma partición de memoria, donde estaba situado, antes de que se realizara la descarga dinámica. La reubicación dinámica, implica que la proyección del espacio de direcciones lógicas o virtuales, en el espacio de direcciones físicas o reales, es llevado a cabo en tiempo de ejecución, normalmente con alguna asistencia del hardware de la maquina. Los procesos imagen en sistemas con reubicación dinámica, se preparan también, suponiendo que la dirección de comienzo es la dirección lógica o virtual cero y se cargan en la memoria sin ninguna modificación debida a la reubicación. Cuando dichos procesos son ejecutados, todas sus referencias a memoria son reubicadas durante la ejecución de las instrucciones, antes de que se acceda a la memoria física o real. Este proceso es implementado, por medio de un registro base, que contiene la dirección física de la memoria, donde está cargado el proceso y este valor se obtiene de la correspondiente tabla de descripción de particiones (PDT). Cada referencia a memoria generada por la ejecución del proceso, se convierte en la correspondiente dirección física, con solo sumarle el contenido del registro base. 1.000 100 CPU 1.100 + DIRECCIÓN LÓGICA 1.000 DIRECCIÓN FÍSICA P IMAGEN MEMORIA Un proceso imagen preparado suponiendo que la dirección de comienzo es la dirección lógica o virtual cero, se mantendrá inalterada, antes y después de ser cargado en la memoria. La reubicación dinámica, hace posible mover un proceso parcialmente ejecutado en un área de memoria a otra, sin que se produzcan inconvenientes de direccionamiento, en los accesos a las instrucciones y datos en el nuevo espacio. Esta característica es muy provechosa para mantener la descarga dinámica, sin tener que ligar los procesos a las particiones y por tanto, podrá ser utilizado en el particionamiento dinámico, que estudiaremos posteriormente. APUNTES DE SISTEMAS OPERATIVOS ANGEL GLEZ. DEL ALBA 22 GESTIÓN Y ADMINISTRACIÓN DE LA MEMORIA REAL PROTECCIÓN Y USO COMPARTIDO. La integridad o la protección de un sistema de multiprogramado, depende entre otras cosas, del aislamiento de los distintos espacios de direcciones, es decir no solamente, el sistema operativo debe ser protegido de intromisiones no autorizadas por parte de los procesos de usuario, sino que cada proceso, debe estar prevenido contra los accesos que accidentalmente o intencionadamente se puedan realizar en áreas de memoria asignadas a otros procesos. El acceso incontrolado al espacio de memoria de un proceso, además de causar frecuentes problemas en el funcionamiento del sistema, se pueden producir interacciones no deseadas entre procesos que están intermitentes y que son difíciles de detectar, ya que las consecuencias pueden manifestarse mucho tiempo después, de que el proceso deteriorado haya abandonado el sistema, produciendo de esta manera, errores en otros procesos. Estas consideraciones nos indican que las operaciones multiusuario, no deberían ser proporcionadas en sistemas que no dispongan de un adecuado sistema de protección de memoria. Normalmente, para un sistema de particionamiento estático, la protección de memoria puede estar implementada por los mecanismos generales de protección por software, basados en la utilización de registros base y registros límite, que proporcionan el debido aislamiento de los espacios de direcciones existentes, tanto al sistema operativo como a los restantes procesos. Otro método de protección es por hardware, que consiste en grabar los derechos de acceso en el propio espacio de la propia memoria. El método de un bit por cada dirección de memoria, ya descrito anteriormente, no es apropiado para los sistemas de multiprogramados, porque se pueden separar solamente dos espacios de direcciones distintos. Este problema puede ser resuelto, añadiendo más bits para designar la identidad de cada dirección de memoria, pero esto sería muy costoso. Una versión más económica, consiste en asociar varios bits a la protección de grandes bloques de memoria, así por ejemplo, algunos sistemas utilizan cuatro bits, denominados clave de protección, por cada bloque de memoria de 1 Kb, 2 kb, 4 kb, etc. De esta manera, cuando el proceso es cargado en memoria, su identidad es grabada en los bits de protección de los bloques que ocupa. La validación de las referencias de memoria es establecida en tiempo de ejecución, comparando la identidad del proceso que se está ejecutando, con el contenido de los bits de protección del bloque de memoria, que está siendo accedido, por lo tanto si no coinciden, el acceso se considerará ilegal. Al sistema operativo se le asigna una clave maestra única, es decir cero, que le da acceso sin ninguna restricción a todos los bloques de memoria. La manera más fácil de implementar el uso compartido, es confiar los objetos compartidos al sistema operativo, ya que la utilización del sistema operativo para controlar el acceso a los recursos compartidos y el mecanismo para invocar los servicios del sistema operativo, no necesitan incorporar ningún suministro adicional, para soportar el uso compartido. Esta forma tan simple de abordar esta cuestión, no es muy conveniente por las razones que exponen a continuación: Estimula el crecimiento del sistema operativo. El código adicional que se incorpora al sistema operativo, consigue el mismo nivel de fiabilidad y privilegio que tiene el núcleo, cuyo comportamiento es sumamente fiable. El fragmento de código que se obtiene, veda todas las reglas del desarrollo, prueba y mantenimiento de la programación. APUNTES DE SISTEMAS OPERATIVOS ANGEL GLEZ. DEL ALBA TEORÍA DE LOS SISTEMAS OPERATIVOS 23 Normalmente la mayoría de los sistemas, permiten la incorporación de rutinas escritas por el usuario dentro del sistema operativo, pero solamente durante el proceso de generación del sistema, por lo tanto, no siendo de esta manera, el uso compartido en los sistemas de particionamiento fijo de la memoria es bastante difícil, por la utilización de los mecanismos de protección expuestos anteriormente, basados fundamentalmente en el aislamiento de los distintos espacios de direcciones. Una solución sencilla del problema pero altamente costosa, es tener una copia física de los objetos compartidos, en cada espacio de direcciones de los procesos que los utilizan, de esta manera, no hay accesos comunes, es decir, cada proceso se ejecuta usando su proyección local de los objetos compartidos, por lo tanto, cuando se hace una modificación en el objeto compartido, esta debe ser propagada por todas las copias, para guardar la consistencia entre ellas. El sistema operativo se encarga de copiar los datos compartidos, desde el espacio de direcciones del proceso en ejecución a todas las particiones que participan. Realmente esta solución no tiene mucho sentido, ya que no proporciona ningún ahorro de memoria. ASIGNACIÓN DINÁMICA DE LA MEMORIA PARTICIONADA. La fragmentación interna y otros problemas atribuibles al particionamiento estático de la memoria, como pueden ser la introducción de procesos de gran tamaño, pueden ser solucionados definiendo las particiones dinámicamente, de acuerdo con los requerimientos de cada proceso. Partiendo del estado inicial del sistema, las particiones deben ser creadas dinámicamente, para adaptarse a las necesidades de cada proceso solicitante, por lo tanto, cuando un proceso termina o es descargado dinámicamente, el gestor de memoria devuelve el espacio desocupado al área de memoria libre, desde la cual se realizan las asignaciones de memoria a los procesos que la van solicitando. En principio, ni el tamaño ni el número de particiones de memoria asignadas dinámicamente, necesita ser limitado en tiempo de generación del sistema o en cualquier otro momento y prácticamente, el gestor de memoria, puede seguir creando y asignando particiones a los procesos que lo solicitan, hasta que toda la memoria física este ocupada o bien hasta que se haya alcanzado el grado máximo de multiprogramación. Este último limite, debe ser establecido en algunos sistemas, por las restricciones en el diseño de la longitud de las colas en el bloque de control de trabajo (PCB) y otras estructuras de datos utilizadas por el sistema operativo. PARTICIONAMIENTO DINÁMICO. Con objeto de determinar la especificación de las estructuras de datos necesarias, para soportar la definición y asignación dinámica de las particiones, se estudiará brevemente la naturaleza de las operaciones, que un gestor de memoria de este tipo tiene que realizar. Cuando el gestor de memoria recibe la orden de cargar un proceso imagen, el módulo de gestión de memoria del sistema operativo, intenta crear una partición de memoria adecuada, para asignársela al proceso en cuestión. El primer paso en esta actividad, es localizar un área contigua de memoria libre, si la hubiera, de tamaño igual o mayor al del proceso que la solicita. Si esta área libre es encontrada, el módulo de gestión de memoria obtiene de esta zona, una partición del tamaño exacto dictado por las necesidades del proceso y se introduce su base, tamaño y estado en la tabla de descripción de particiones (PDT). APUNTES DE SISTEMAS OPERATIVOS ANGEL GLEZ. DEL ALBA 24 GESTIÓN Y ADMINISTRACIÓN DE LA MEMORIA REAL El sistema operativo controla el espacio disponible en memoria, mediante una estructura de datos, denominada lista de fragmentos disponibles, que consiste en una tabla en la que en cada entrada se almacenan la dirección física de comienzo y él número de posiciones libres. Cuando un proceso residente en la memoria termina o es descargado dinámicamente, el sistema operativo libera la partición asociada a él y devuelve el espacio ocupado por la partición a la lista de fragmentos disponibles. Teniendo en cuenta la relación que existe entre la PCB (Bloque de control de procesos) y la (Tabla de Descripción de Particiones), para determinar la situación de un proceso, cuando el proceso es descargado dinámicamente, el sistema operativo anula el campo de la PCB, donde normalmente es guardada la identidad de la partición asignada. PDT Supongamos que tenemos un espacio de 2.500 Kb de memoria disponible y un sistema operativo residente de 400 Kb. Esta situación reflejada en la figura (a), deja 2.100 Kb para los procesos de usuario, que están situados en una cola de entrada como la que se expresa a continuación: Procesos P1 P2 P3 P4 P5 Memoria Tiempo de CPU 600 Kb 1.000 Kb 300 Kb 700 Kb 500 Kb 10 5 20 8 15 A partir de la cola de entrada expresada anteriormente y con una planificación de trabajos FCFS, podemos asignar memoria de inmediato a los procesos P1, P2 y P3 y nos quedará un espacio de 200 Kb, que no es suficiente para contener ninguno de los procesos restantes de la cola de entrada. Esta situación queda reflejada en la figura (b). 0K 0K S. O. 400 K 0K S. O. 400 K 0K S. O. 0K S. O. 0K S. O. 400 K 400 K 400 K 400 K P1 1000 K P1 1000 K Libre 1000 K 900 K S.O. P5 P1 1000 K P2 2000 K Libre 2000 K P3 2300 K 2500 K 2500 K (a) Libre (b) P4 1700 K 2000 K P3 2300 K 2500 K (c) Libre 2300 K 2500 K (d) Libre P3 Libre 1700 K 2000 K 2300 K 2500 K (e) 1000 K Libre P4 Libre P4 1700 K Libre 2000 K P3 P3 2300 K Libre 2500 K Libre (f) Utilizando un algoritmo de planificación circular de la CPU, con un cuanto de una unidad de tiempo, el proceso P2 terminará en el instante 14, por haber consumido 5 unidades de tiempo, liberando su asignación de memoria. Esta situación está representada en la figura (c), volviendo a la cola de trabajos iniciamos el proceso P4, obteniendo la situación de la figura (d). El proceso P1 terminará en el instante 28, cuando cumpla las 10 unidades de tiempo y producirá la situación (e), en cuyo momento, se iniciará el proceso P5, que da como resultado la situación (f). APUNTES DE SISTEMAS OPERATIVOS ANGEL GLEZ. DEL ALBA TEORÍA DE LOS SISTEMAS OPERATIVOS 25 Este ejemplo ilustra varios puntos, ya que en cualquier momento hay un conjunto de espacios de distintos tamaños y dispersos por toda la memoria. La tabla de segmentos disponibles tiene que reflejar los espacios disponibles correspondientes a cada una de las situaciones anteriormente citadas: SITUACIÓN DIRECCIÓN FÍSICA DE COMIENZO POSICIONES LIBRES (a) 400 2100 (b) 2300 200 (c) 1000 2300 1000 200 (d) 1700 2300 300 200 (e) 400 1700 2300 600 300 200 (f) 900 1700 2300 100 300 200 Cuando llega un proceso y necesita memoria, buscamos en ese conjunto, un espacio con el tamaño suficiente para el proceso. Si el espacio es demasiado grande, se divide en dos y una parte se le asigna al proceso que llega y la otra queda libre, en la tabla de fragmentos disponibles. Cuando termina un proceso, libera su espacio de memoria, el cual pasa a la tabla de fragmentos disponibles. Si el espacio que queda libre, es adyacente a otros espacios libres, se fusionan formando un espacio mayor y a esta operación se la denomina combinación. Cuando se realiza una combinación, es preciso comprobar si hay procesos esperando memoria, que puedan ser introducidos en ese espacio. Para la asignación dinámica de almacenamiento, el sistema operativo selecciona el más adecuado en función de las siguientes estrategias: Primer ajuste Mejor ajuste Peor ajuste First-Fit. Best-Fit. Worst-Fit. El primer ajuste, consiste en asignar el primer espacio disponible al proceso que lo solicita. El mejor ajuste, consiste en asignar el espacio más pequeño, que tenga el tamaño suficiente para albergar el proceso. Para ello es preciso recorrer toda la tabla de fragmentos disponibles, a menos que dicha tabla esté ordenada por tamaño. El peor ajuste, consiste en asignar el espacio más grande. En este caso también será necesario recorrer la tabla completa. Las simulaciones han demostrado, que tanto el primer ajuste como el mejor ajuste, son mejores que el peor ajuste, en cuanto a la reducción del tiempo y de la utilización del almacenamiento. APUNTES DE SISTEMAS OPERATIVOS ANGEL GLEZ. DEL ALBA 26 GESTIÓN Y ADMINISTRACIÓN DE LA MEMORIA REAL Ni el primer ajuste ni el mejor ajuste son definitivamente superiores, uno respecto al otro, en relación con la utilización del almacenamiento, pero por lo general, el primer ajuste es el más rápido. Estos algoritmos producen fragmentación externa conforme los procesos se cargan y se extraen de la memoria, el espacio de memoria se divide en pequeñas partes. Dependiendo de la cantidad total de memoria y del tamaño promedio de los procesos, la fragmentación externa puede ser un problema mayor o menor. Así por ejemplo el análisis estadístico del primer ajuste revela que, incluso con cierto perfeccionamiento, dados N bloques asignados, se perderán 0,5 bloques debido a la fragmentación, es decir, un tercio de la memoria puede estar utilizada. A este estudio estadístico se le conoce con el nombre de regla del 50 por ciento. TABLA DE DESCRIPCIÓN DE PARTICIONES SITUACIÓN Nº DE PARTICIÓN BASE TAMAÑO ESTADO (b) 0 1 2 3 4 0 400 1000 2000 2300 400 600 1000 300 200 ASIGNADA ASIGNADA ASIGNADA ASIGNADA LIBRE (c) 0 1 2 3 4 0 400 1000 2000 2300 400 600 1000 300 200 ASIGNADA ASIGNADA LIBRE ASIGNADA LIBRE (d) 0 1 2 3 4 5 0 400 1000 1700 2000 2300 400 600 700 300 300 200 ASIGNADA ASIGNADA ASIGNADA LIBRE ASIGNADA LIBRE (e) 0 1 2 3 4 5 0 400 1000 1700 2000 2300 400 600 700 300 300 200 ASIGNADA LIBRE ASIGNADA LIBRE ASIGNADA LIBRE (f) 0 1 2 3 4 5 6 0 400 900 1000 1700 2000 2300 400 500 100 700 300 300 200 ASIGNADA ASIGNADA LIBRE ASIGNADA LIBRE ASIGNADA LIBRE La fragmentación interna se produce normalmente en la asignación estática de la memoria, pero en ciertas ocasiones, también se puede producir en la asignación dinámica de la memoria. Supongamos que en un momento determinado la situación de la memoria es la siguiente: S. O. P1 ESPACIO DE 20.375 BYTES P2 APUNTES DE SISTEMAS OPERATIVOS ANGEL GLEZ. DEL ALBA TEORÍA DE LOS SISTEMAS OPERATIVOS 27 Si consideramos que la siguiente solicitud es de 20.370 Bytes, tendremos que al asignar dicha solicitud, en el espacio existente, quedaría un espacio de 5 Bytes libres. APUNTES DE SISTEMAS OPERATIVOS ANGEL GLEZ. DEL ALBA 28 GESTIÓN Y ADMINISTRACIÓN DE LA MEMORIA REAL El sistema operativo interpreta que el procesamiento adicional necesario para asignar ese espacio ocuparía un espacio mayor que el propio espacio que está libre, además de la dificultad de encontrar una solicitud de un espacio tan pequeña. La estrategia general que utiliza el sistema operativo, consiste en asignar ese espacio tan pequeño a la solicitud anterior, por lo tanto, en ciertas situaciones puede ocurrir que la memoria asignada sea algo mayor que la memoria solicitada y producir así una pequeña fragmentación interna que no se usará. Resumiendo podríamos decir, que según van entrando los procesos en el sistema, se van colocando en una cola de entrada, en espera de que el planificador a largo plazo, teniendo en cuenta los requisitos de memoria de cada proceso y la cantidad de memoria disponible, determine a que procesos se les asigna. Cuando a un programa se le asigna espacio, se carga en memoria, se relocaliza si es necesario y de esta manera puede competir por la asignación del procesador. Lógicamente, el Planificador a largo plazo puede ordenar la cola de entrada de acuerdo con algún algoritmo de planificación. Con este esquema de gestión de memoria, se elimina en la mayor parte de los casos la fragmentación interna, ya que las particiones se crean con el tamaño solicitado por el proceso, sin embargo, si podemos tener fragmentación externa. Examinando el conjunto de asignaciones anteriormente expuesto, podemos ver dos situaciones de este tipo: En la situación (b) se presenta una fragmentación externa de 260 K, un espacio demasiado pequeño para satisfacer los requisitos de alguno de los procesos restantes P4 y P5. En la situación (d), sin embargo, tenemos una fragmentación externa total de 560 K, es decir, (300 K + 260 K), este espacio sería suficiente para ejecutar el proceso P5, que requiere 500 K, pero esta memoria libre no es contigua, ya que está fragmentada en dos partes, ninguna de la cuales tiene el tamaño suficiente para satisfacer la solicitud del proceso P5. Este problema de fragmentación puede ser grave, ya que se puede tener un bloque de memoria libre entre cada dos procesos. La selección de la estrategia de primer ajuste y mejor ajuste, puede afectar a la cantidad de fragmentación. COMPACTACIÓN. Una solución para el problema de la fragmentación externa es la compactación, que tiene por objeto desplazar el contenido de la memoria hacia uno de los extremos para que toda la memoria libre se sitúe en un solo espacio de gran tamaño. Por ejemplo, en el conjunto de asignaciones expresado anteriormente, en la situación (f), puede compactarse la memoria de la forma que se expresa a continuación: 0K 0K S. O. S. O. 400 K 400 K P5 P5 900 K 900 K 100 K P4 1000 K P4 1600 K COMPACTACIÓN 1700 K P3 300 K 1900 K 2000 K P3 2300 K APUNTES DE SISTEMAS OPERATIVOS 600 K ANGEL GLEZ. DEL ALBA TEORÍA DE LOS SISTEMAS OPERATIVOS 29 200 K 2500 K 2500 K Los espacios de 100 K, 300 K y 200 K pueden compactarse en un espacio de 600 K. La compactación no siempre es posible, ya que para mover los procesos P3 y P4 y que posteriormente, estos puedan ejecutarse en las nuevas posiciones, hay que reubicar todas las direcciones internas. Si la reubicación es estática, es decir, se realiza en el momento de la carga, la compactación no puede realizarse, solamente será posible si la reubicación es dinámica y se efectúa por lo tanto, en el momento de la ejecución. Si las direcciones se reubican dinámicamente, solo será necesario trasladar el programa y los datos y después cambiar el registro base para situar la nueva dirección de carga. Cuando la compactación es posible, el algoritmo más sencillo consiste en mover todos los procesos hacia un extremo de la memoria y todos los espacios libres se mueven en sentido contrario, produciendo un gran espacio de memoria. Este esquema de compactación puede ser bastante costoso, por tanto vamos a estudiar una forma de realizar la compactación de menor coste con un ejemplo: 0K 0K S. O. 300 K 0K S.O. 300 K P1 500 K 0K S.O. S.O. 300 K P1 500 K 300 K P1 P1 500 K 500 K P2 600 K P2 600 K 400 K P2 600 K P3 P2 600 K P4 800 K 1000 K 1000 K P3 1200 K P4 1200 K 900 K P3 1200 K 300 K 1500 K 1500 K P4 900 K 900 K P4 1900 K 1900 K 200 K 2100 K P3 2100 K ASIGNACIÓN ORIGINAL 2100 K SE MUEVEN 600 K 2100 K SE MUEVEN 400 K SE MUEVEN 200 K También se puede combinar el intercambio con la compactación, ya que un proceso puede descargarse de la memoria principal al almacenamiento secundario y reincorporarse más tarde. Cuando el proceso se descarga, se libera su memoria y quizá el espacio se pueda utilizar para otro proceso. Cuando el proceso tiene que reincorporarse por intercambio, pueden aparecer varios problemas: APUNTES DE SISTEMAS OPERATIVOS ANGEL GLEZ. DEL ALBA 30 GESTIÓN Y ADMINISTRACIÓN DE LA MEMORIA REAL Si se utiliza la reubicación estática, el proceso debe reincorporarse exactamente a las mismas posiciones de memoria que ocupaba anteriormente, esta restricción puede requerir, que todos los demás procesos se descarguen para liberar esa memoria. Si se emplea reubicación dinámica, entonces el proceso se puede reincorporar a una localidad cualquiera de la memoria. APUNTES DE SISTEMAS OPERATIVOS ANGEL GLEZ. DEL ALBA TEORÍA DE LOS SISTEMAS OPERATIVOS 31 Una estrategia que se puede utilizar para la compactación, consiste en descargar los procesos que hay que mover y reincorporarlos a localidades de memoria diferentes. Si los intercambios o la técnica de descargar y reincorporar los procesos, ya forma parte del sistema, el código adicional para la compactación puede ser mínimo. PROTECCIÓN Y USO COMPARTIDO. El problema principal que se produce, con el esquema de particiones de tamaño variable es la fragmentación externa. Una forma de reducir la fragmentación externa, consiste en dividir en varias partes la memoria que necesita un proceso, de esta manera cada parte, es menor que la memoria ocupada por el proceso completo, por lo tanto, siempre será más fácil de acomodar en la memoria. Para utilizar esta estrategia hay que proporcionar varios pares de registros base y registros límite, con un mecanismo apropiado, para traducir las direcciones lógicas a direcciones físicas. Una forma de lograr esto, consiste en dividir la memoria en dos partes disjuntas y el sistema establecerá dos pares de registros base y limite, para ello, la memoria se divide por la mitad utilizando el bit de dirección de orden superior. La memoria baja, se puede relocalizar y limitar, usando el par cero de registros base y límite, la memoria alta se podría relocalizar y limitar, utilizando el par uno de registros base y limite. Por convención o diseño, los compiladores y ensambladores colocan valores de solo lectura, es decir, constantes e instrucciones, en la memoria alta y las variables en la memoria baja. Así se puede asociar una protección diferente a cada par de registros asegurando, que la memoria alta sea solo de lectura. Esta disposición permite compartir programas almacenados como de solo lectura en la memoria alta entre varios procesos de usuario, cada uno con su propio segmento en la memoria baja. Una manera de lograr esto consiste en separar un programa en dos partes: código y datos. La unidad de control del procesador al realizar la función de descodificación, sabe si quiere realizar la búsqueda de una instrucción o bien la búsqueda o almacenamiento de datos, por lo tanto, se proporcionan dos pares de registro base y limite, uno para las instrucciones que será solo de lectura y otro para los datos, de esta manera se podrán compartir los programas entre los distintos usuarios. Con estos esquemas, al separar programas y datos, realizando la relocalización por separado, podemos compartir programas entre varios usuarios, utilizando así mejor la memoria y reduciendo tanto la fragmentación como las copias múltiples del mismo código, en especial, el código de uso común como el de compiladores, editores, etc. Para finalizar la descripción realizada del particionamiento de la memoria, se puede observar, que tanto las particiones de tamaño fijo, como las de tamaño variable, hacen un uso ineficiente de la memoria, las primeras generan fragmentación interna, mientras que las segundas originan fragmentación externa. A continuación vamos a estudiar los esquemas de gestión de memoria basados en la asignación de memoria no contigua, que tienen por objeto, asignar las distintas partes de un objeto lógico a áreas no contiguas de la memoria física. La traducción de direcciones, efectuada durante la ejecución de las instrucciones, establece la correspondencia necesaria, entre un espacio lógico contiguo y las direcciones físicas de la memoria no contiguas, que determinan las posiciones reales, en donde residen los objetos en la memoria física, durante el tiempo de ejecución. APUNTES DE SISTEMAS OPERATIVOS ANGEL GLEZ. DEL ALBA 32 GESTIÓN Y ADMINISTRACIÓN DE LA MEMORIA REAL El objetivo principal de estos esquemas de gestión de memoria, será conseguir una mejor utilización de la memoria, reduciendo, tanto la fragmentación interna como la fragmentación externa. APUNTES DE SISTEMAS OPERATIVOS ANGEL GLEZ. DEL ALBA TEORÍA DE LOS SISTEMAS OPERATIVOS 33 LA SEGMENTACIÓN. La generalización del concepto de dividir la memoria en varias partes, definido anteriormente, introduce un aspecto importante en la administración de la memoria, que consiste en la separación de la perspectiva que el usuario tiene de la memoria lógica o virtual y la memoria física o real. La perspectiva que el usuario tiene de la memoria, se fundamenta en la organización lógica de un programa en la actualidad, que no se corresponde con el concepto de la memoria física real, pero si existe, una correspondencia entre la perspectiva del usuario y la estructura de la memoria física, que permite establecer la diferencia entre la memoria lógica y la memoria física. La memoria física está formada por un vector lineal de palabras, algunas con instrucciones y otras con datos, sin embargo, el usuario no considera la memoria como un vector lineal de palabras, si no más bien, como un conjunto de partes claramente definidas por la función que cumplen en el desarrollo del programa. Cada una de esas partes esta agrupada de tal forma, que puedan ocupar posiciones contiguas de la memoria, pero las partes entre sí, pueden estar separadas y en cualquier orden. Al espacio que ocupan cada una de esas partes es a lo que se denomina segmento. Un programa desde el punto de vista del usuario, está formado por un módulo principal y varios secundarios, los cuales utilizan unos módulos de código y unas estructuras de datos determinadas. Cada uno de los módulos o partes del programa tiene un nombre, que define el usuario sin preocuparse por las direcciones que estas partes van a ocupar en la memoria. Cada una de esas partes ocupa un segmento, que tiene una longitud variable y que está definida intrínsecamente por el propósito de ese segmento en el programa. Los elementos de información que contiene un segmento, se identifican por su desplazamiento, a partir del inicio del segmento correspondiente. Teniendo en cuenta estas consideraciones, la dirección de un elemento de información determinado, deberá indicarse dando el nombre del segmento y el desplazamiento dentro de él. El nombre del segmento el sistema operativo lo convertirá en un numero y de esta forma la dirección vendrá expresada por los siguientes componentes: (s,d) s d Nombre del segmento. Desplazamiento dentro de él. La segmentación es un esquema de administración de memoria, que se apoya en la perspectiva que el usuario tiene de la memoria. MODULO PRINCIPAL 1.000 K SEGMENTO 0 MODULO 1 400 K SEGMENTO 1 MEMORIA LÓGICA ESTRUCTURAS DE DATOS 1 1.100 K DE UN PROCESO SEGMENTO 3 MODULO 2 500 K ESTRUCTURAS DE DATOS 2 1.000 K SEGMENTO 2 SEGMENTO 4 APUNTES DE SISTEMAS OPERATIVOS ANGEL GLEZ. DEL ALBA 34 GESTIÓN Y ADMINISTRACIÓN DE LA MEMORIA REAL Un espacio de direcciones de un programa, se compone de un conjunto de segmentos, cada uno de los cuales tiene un nombre y una longitud. Cuando un programa de usuario se traduce, el compilador construye automáticamente los segmentos que constituyen el programa de entrada. Los antiguos procesadores 8086 utilizaban la segmentación como único esquema de administración de la memoria. COMO ACTÚA LA SEGMENTACIÓN. Aunque el usuario se puede referir a los objetos de un programa utilizando direcciones lógicas bidimensionales, la memoria física real sigue siendo una secuencia unidimensional de bytes o palabras. Por todo ello, debemos definir una forma de implantar la correspondencia entre direcciones lógicas bidimensionales, definidas por el usuario y direcciones físicas unidimensionales. Esta correspondencia se logra por una estructura de datos que se denomina tabla segmentos. 0 DIRECCIÓN DE UN SEGMENTO (s,d) 1.200 SEGMENTO 0 N. SEGMENTO LONGITUD BASE 2.200 (STBR) 0 1.000 1.200 1 400 6.300 2 500 4.300 3.200 SEGMENTO 3 4.300 3 1.100 3.200 SEGMENTO 2 4.800 (STLR) 4 1.000 4.700 SEGMENTO 4 TABLA DE SEGMENTOS 5.8 00 6.300 SEGMENTO 1 6.700 STBR STLR SEGMENT TABLE BASE REGISTER SEGMENT TABLE LENGTH REGISTER MEMORIA FÍSICA A continuación se trata de exponer como se utilizan las tablas de segmentos teniendo en cuenta que una dirección lógica tiene dos componentes: Un numero de segmento (s). Un desplazamiento (d). S < STLR SI S TABLA DE SEGMENTOS STBR NO UCP SEGMENT TABLE BASE REGISTER S (s,d) LONG. BASE ERROR STLR d < LONG SEGMENT TABLE LENGTH REGISTER BASE MEMORIA SI d NO ERROR APUNTES DE SISTEMAS OPERATIVOS ANGEL GLEZ. DEL ALBA TEORÍA DE LOS SISTEMAS OPERATIVOS 35 El número de segmento, se utiliza como índice en la tabla de segmentos, cada entrada en esta tabla, tiene una base (s) que determina el comienzo del segmento y una longitud del segmento, el desplazamiento (d) de la dirección lógica, debe estar entre 0 y la longitud del segmento, ya que si no es así, se producirá un error de direccionamiento. Si el desplazamiento es valido, se suma a la base del segmento para producir, la dirección de memoria física de la palabra deseada. IMPLANTACIÓN DE LAS TABLAS DE SEGMENTOS. La segmentación está estrechamente relacionada con los modelos de administración de memoria por particiones, que hemos estudiado anteriormente, con la única diferencia de que un programa puede estar formado por varios segmentos. Como consecuencia del empleo de segmentos de distinto tamaño, el concepto de segmentación, resulta similar a las particiones dinámicas y en ausencia de un esquema de superposición o del uso de memoria virtual, sería necesario cargar en memoria todos los segmentos de un programa para su ejecución. La diferencia, en comparación con las particiones dinámicas, radica en que con segmentación, un programa puede ocupar más de una partición y estas no tienen necesidad de ser contiguas. La segmentación elimina la fragmentación interna, pero como en las particiones dinámicas, produce fragmentación externa, sin embargo, debido a que los procesos se dividen en un conjunto de partes más pequeñas, la fragmentación externa será menor. Las estrategias que se utilizan para la situación de los segmentos en la memoria, son las mismas que se utilizan en las particiones dinámicas. La segmentación es un concepto más complejo que las particiones, de esta manera, una tabla de segmentos debe ubicarse en registros rápidos o en memoria, para poder hacer referencias a una velocidad mayor y ahorrar tiempo en las operaciones que se necesitan para localizar un elemento determinado. Cuando un programa está formado por un gran numero de segmentos, será muy necesario conservar la tabla de segmentos en memoria y establecer un registro base de la tabla de segmentos (STBR), Segment Table Base Register, que apunta a la tabla de segmentos. Así mismo, teniendo en cuenta, que el número de segmentos que utiliza el programa, puede variar considerablemente, se usa un registro de longitud de la tabla de segmentos (STLR), Segment Table Length Register. Para una dirección lógica (s,d), primero comprobamos si el numero de segmento (s) es legal, para lo cual S < STLR. Posteriormente sumamos el número de segmento al STBR, que nos proporciona la dirección (STBR + S) en memoria, de la entrada de la tabla de segmentos. Esta entrada se lee de la memoria y continuamos como antes, comparamos el desplazamiento con la longitud del segmento y calculamos la dirección física de la palabra deseada, como la suma de la base del segmento más el desplazamiento. PROTECCIÓN Y USO COMPARTIDO. Una ventaja particular de la segmentación, es la asociación de la protección a los segmentos, ya que cada uno de los segmentos representa una parte del programa, es probable que todos los elementos de información del segmento, se utilicen de la misma manera, así, algunos segmentos contendrán instrucciones y otros contendrán datos. APUNTES DE SISTEMAS OPERATIVOS ANGEL GLEZ. DEL ALBA 36 GESTIÓN Y ADMINISTRACIÓN DE LA MEMORIA REAL En una arquitectura moderna las instrucciones no se modifican a sí mismas, es decir, el código es reentrante, por lo tanto, los segmentos de instrucciones pueden definirse de solo lectura o solo ejecución. El hardware de transformación de memoria, consultará los bits de protección asociados a cada entrada de la tabla de segmentos, para evitar accesos ilegales a la memoria, como un intento de escribir en un segmento de solo lectura o utilizar como datos un segmento de solo ejecución. Si colocamos esos bits en su propio segmento, el hardware de administración de memoria, verificará automáticamente, que los índices de la tabla de segmento sean legales y no salgan de los limites establecidos. De esta manera, el hardware detectará muchos errores comunes en los programas, antes de que puedan causar serios daños. Otra ventaja de la segmentación es la posible compartición de código o datos, de esta manera, cada proceso tiene una tabla de segmentos asociada a su bloque de control de proceso (PCB), utilizada por el despachador, para definir la tabla de segmentos del hardware, cuando se asigna la UCP a este proceso. Los segmentos se comparten, cuando las entradas de las tablas de segmentos de dos procesos distintos, apuntan a las mismas localidades físicas Por ejemplo vamos a considerar el uso de un editor de textos en un sistema de uso compartido. Un editor completo puede ser bastante grande por lo tanto vamos a compartir la situación del editor en la memoria entre los procesos de usuario P1 y P2. 40.000 EDITOR segmento 0 EDITOR segmento 0 LIMITE BASE 20.000 40.000 60.000 DATOS 1 DATOS 1 segmento 1 4.000 60.000 64.000 segmento 1 90.000 DATOS 2 98.000 EDITOR LIMITE BASE Segmento 0 segmento 0 20.000 40.000 segmento 1 8.000 90.000 MEMORIA FÍSICA DATOS 2 segmento 1 LA PAGINACIÓN. La paginación es un esquema de gestión de memoria muy utilizado actualmente, que consiste en dividir la memoria principal, en bloques iguales de tamaño fijo y relativamente pequeños, que se denominan marcos de pagina. De igual modo, los procesos se dividen también en bloques de tamaño fijo y de igual tamaño que los de la memoria principal, que se denominan páginas. De esta manera, las paginas en que se ha dividido un proceso, pueden asignarse a los marcos libres de la memoria principal. PROCESO MEMORIA REAL APUNTES DE SISTEMAS OPERATIVOS ANGEL GLEZ. DEL ALBA TEORÍA DE LOS SISTEMAS OPERATIVOS 37 El modelo de paginación de la memoria es el que se representa a continuación: Nº DE MARCO 0 1 PAGINA 0 PÁGINA 0 2 0 1 1 4 2 3 PAGINA 1 3 PÁGINA 2 3 4 PÁGINA 1 7 5 PAGINA 2 PAGINA 3 MEMORIA LÓGICA TABLA DE PÁGINAS 6 7 PÁGINA 3 MEMORIA FÍSICA En la figura que se expresa a continuación se presenta el apoyo del hardware necesario para la utilización de la paginación: DIRECCIÓN LÓGICA DIRECCIÓN FÍSICA MEMORIA UCP p d m d FÍSICA NO SI P<PTLR PTBR ERROR PTLR PAGE TABLE BASE REGISTER PAGE TABLE LENGTH REGISTER PTBR PTLR TABLA DE PAGINAS Cada dirección lógica generada por el procesador de divide en dos partes: un número de pagina (p) y un desplazamiento en la página (d). El número de página se utiliza como índice en una tabla de páginas, que contiene el número del marco de la memoria física, que contiene esa página. La dirección física se consigue, multiplicando el número del marco por su tamaño y se le suma el desplazamiento en la página, obteniendo de esta manera una dirección de memoria física o real. Tanto el tamaño de la página como el tamaño del marco, esta definido por el hardware y además es preciso añadir, que el tamaño de la página generalmente es una potencia de 2, dependiendo todo ello de la arquitectura del ordenador. La selección de una potencia de 2 como tamaño de página, facilita la traducción de una dirección lógica a un número de marco y un desplazamiento dentro del marco. Si el tamaño de la página es 2 n unidades de direccionamiento, que pueden ser bytes o palabras, entonces, los n bits de orden inferior de la dirección lógica representan el desplazamiento en la página y los bits restantes de orden superior indican el número de página. APUNTES DE SISTEMAS OPERATIVOS ANGEL GLEZ. DEL ALBA 38 GESTIÓN Y ADMINISTRACIÓN DE LA MEMORIA REAL Un ejemplo sencillo seria el siguiente: 0 1 2 3 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 A B C D E F G H I J K L M N O P 0 16 4 0 5 1 6 2 1 3 8 2 TABLA DE PÁGINAS 12 20 I J K L M N P Q 24 A B C D E F G H 28 32 MEMORIA LÓGICA MEMORIA FÍSICA 32 PALABRAS = 8 PAGINAS TAMAÑO DE PÁGINA = 4 PALABRAS Utilizando un tamaño de página de 4 palabras y una memoria física de 32 palabras, es decir, ocho páginas, se muestra un ejemplo de como puede efectuarse la correspondencia entre la memoria lógica desde el punto de vista del usuario y la memoria física. P = 0 DIRECCIÓN LÓGICA 0 = 0000 = MARCO = 5 DIRECCIÓN FÍSICA = (5 * 4) + 0 = 20 MARCO = 6 DIRECCIÓN FÍSICA = (6 * 4) + 0 = 24 MARCO = 1 DIRECCIÓN FÍSICA = (1 * 4) + 2 = 6 MARCO = 2 DIRECCIÓN FÍSICA = ( 2 * 4) + 1 = 9 D =0 P =1 DIRECCIÓN LÓGICA 4 = 0100 = D 0 P = 2 DIRECCIÓN LÓGICA 10 = 1010 = D =2 P = 3 DIRECCIÓN LÓGICA 13 = 1101 = D = 1 Se puede observar que la paginación es una forma de relocalización dinámica, es decir, cada dirección lógica esta enlazada a la dirección física, mediante el hardware de paginación, siendo la paginación semejante al uso de una tabla de registros base, uno para cada marco de memoria. La utilización de este esquema de gestión de memoria permite asegurar, que no se va a producir fragmentación externa, ya que cualquier marco libre, se puede asignar al proceso que lo necesite y que solo se producirá una pequeña fragmentación interna, en la última pagina del proceso, ya que los marcos se asignan como unidades, por lo tanto, si los requisitos de memoria de un proceso, no coinciden con los limites de las paginas, el último marco asignado puede estar parcialmente vacío. Así por ejemplo, si las páginas son de 2.048 bytes, un proceso de 10.760 bytes, necesitaría 5 páginas más 520 bytes, lógicamente al proceso se le asignarían 6 marcos completos y se produciría una fragmentación interna de 1.528 bytes. 10.760 / 2.048 = 5 + 520 / 2.048 Fragmentación Interna = 2.048 – 520 = 1.528. En el peor de los casos, un proceso necesitaría n páginas, más una palabra, en este caso, se le asignarían n + 1 marcos, produciendo una fragmentación interna de casi un marco completo. Se puede decir, que si el tamaño del proceso es independiente del tamaño de página, se puede esperar una fragmentación interna de media pagina por proceso. APUNTES DE SISTEMAS OPERATIVOS ANGEL GLEZ. DEL ALBA TEORÍA DE LOS SISTEMAS OPERATIVOS 39 Esta consideración nos indica, que son deseables tamaños de pagina pequeños, para disminuir la fragmentación interna, pero lógicamente aumentaría el número de entradas en la tabla de páginas, que disminuiría si las páginas son más grandes. Supongamos que en un instante dado, una serie de marcos de la memoria están en uso y otros están libres, lógicamente, el módulo de gestión de memoria del sistema operativo, debe mantener una lista de marcos libres. Cuando un proceso llega para ejecutarse el planificador a largo plazo examina su tamaño, el cual estará expresado en páginas, a continuación el planificador comprueba la memoria disponible en la lista de marcos libres. Cada página del proceso necesita un marco, por lo tanto, si el proceso esta formado por n páginas debe haber n marcos disponibles en la memoria, si existen, el planificador a largo plazo se los asignará al proceso, creando una tabla de páginas que establecerá la correspondencia entre las páginas del proceso y los marcos de la memoria donde están situadas esas páginas. De esta manera, la primera página del proceso se carga en uno de los marcos asignados y el número del marco se registra en la tabla de páginas creada para ese proceso, la siguiente página se carga en otro marco y su número de marco se coloca en la tabla de paginas y así sucesivamente. LISTA DE MARCOS LIBRES LISTA DE MARCOS LIBRES 13 14 13 18 20 15 15 13 PAGINA 1 14 14 PAGINA 0 NUEVO PROCESO PAGINA PAGINA PAGINA PAGINA 0 1 2 3 15 15 16 16 17 0 14 1 13 2 18 3 20 17 18 19 20 18 PAGINA 2 19 TABLA DE PAGINAS DEL NUEVO PROCESO 20 PAGINA 3 21 21 Cada sistema operativo tiene sus propios métodos para almacenar las tablas de páginas y la mayoría asigna una tabla de páginas para cada proceso. En el bloque de control de proceso se almacena un apuntador a la tabla de páginas y cuando al despachador se le indica que inicie un proceso debe volver a cargar la tabla de páginas correspondiente. IMPLANTACIÓN DE LA TABLA DE PÁGINAS. La implantación mediante hardware de la tabla de páginas, se puede realizar mediante un conjunto de registros dedicados de muy alta velocidad, para que la traducción de direcciones sea muy eficiente, ya que cada acceso a memoria debe pasar por la tabla de páginas, por lo tanto, la eficiencia es un elemento principal. APUNTES DE SISTEMAS OPERATIVOS ANGEL GLEZ. DEL ALBA 40 APUNTES DE SISTEMAS OPERATIVOS GESTIÓN Y ADMINISTRACIÓN DE LA MEMORIA REAL ANGEL GLEZ. DEL ALBA TEORÍA DE LOS SISTEMAS OPERATIVOS 41 La utilización de los registros de la tabla de páginas es satisfactoria si esta es razonablemente pequeña, sin embargo, la mayoría de los ordenadores actuales permiten que la tabla de páginas sea muy grande y en estas maquinas no es factible el uso de registros de alta velocidad para implantar la tabla de páginas. En este caso, la tabla de páginas se conserva en la memoria principal y se utiliza un registro base de la tabla de páginas, PTBR (Page Table Base Register) que apunta a la tabla de páginas. Para cambiar entre tablas de páginas, solo sería necesario modificar este registro, lo que reduce en gran medida el tiempo de traducción. El problema con este planteamiento, es el tiempo que se requiere, para acceder a una localidad de memoria del usuario, ya que si se quiere llegar a la localidad i, primero debemos utilizar el registro PTBR como base de la tabla de páginas y el número de página como desplazamiento dentro de la tabla de páginas, para llegar al marco de memoria donde esta situada la localidad i, que combinado con el desplazamiento dentro de la página, proporcionaría la dirección buscada. En este esquema se necesitan dos accesos a memoria para tener acceso a una palabra, uno para la entrada de la tabla de páginas y otro para la palabra que se desea localizar, de esta manera, el acceso a memoria se vuelve más lento por un factor de dos, demora que puede ser intolerable en la mayoría de las circunstancias. La solución común para este problema, consiste en utilizar una memoria especial de tamaño pequeño, consistente en una serie de registros asociativos o buffers de traducción con búsqueda anticipada TLB (Translation look-aside buffers). Un conjunto de registros asociativos se construye con memoria de muy alta velocidad; cada registro consta de dos partes: una clave y un valor. Cuando se presenta un elemento a los registros asociativos, se compara simultáneamente con todas las claves y si el elemento se encuentra se devuelve el valor correspondiente. La búsqueda es muy rápida pero el hardware es muy costoso. Los registros asociativos se utilizan con las tablas de paginas de la forma que se expresa a continuación: DIR. ORIGEN DE TABLA PÁGINAS Nº PÁGINA DESPLAZAMIENTO DIR VIRTUAL a p p d V = (p,d) TLB a+p p p’ d p’ TABLA PÁGINAS a N MARCO p’ p DESPLAZAMIENTO d DIR. REAL R = p’*Tp + d p’ Los registros asociativos, es decir la TLB, contienen solo algunas de las entradas de la tabla de páginas. Cuando el procesador genera una dirección lógica, su número de página se presenta al APUNTES DE SISTEMAS OPERATIVOS ANGEL GLEZ. DEL ALBA 42 GESTIÓN Y ADMINISTRACIÓN DE LA MEMORIA REAL conjunto de registros asociativos, que contienen como clave, el número de página y como valor, el número de marco correspondiente. Si el número de página se encuentra en los registros asociativos, su número de marco está inmediatamente disponible y se utiliza para acceder a la memoria. Esta tarea puede consumir menos del 10% del tiempo que se utilizaría en una referencia directa a memoria. Si el número de página no se encuentra en los registros asociativos, entonces hay que efectuar una referencia a la tabla de páginas, para obtener el número de marco que permita el acceso a la memoria deseada. Además se añadirá, los números de página y marco a los registros asociativos, para que puedan localizarse con rapidez en la siguiente referencia. El porcentaje de ocasiones que se encuentra un número de página en los registros asociativos se denomina tasa de aciertos. Una tasa de aciertos del 80% significa, que en los registros asociativos se ha encontrado él número de página deseado, en un 80% de las ocasiones. Si para buscar en los registros asociativos, se emplean 20 nanosegundos y 100 nanosegundos para el acceso a memoria, entonces un acceso a memoria con correspondencia, requiere 120 nanosegundos cuando él número de página se encuentra en los registros asociativos. Si él número de página no se encuentra en los registros asociativos, se consumirán 20 nanosegundos en dicho acceso, posteriormente acudir a la memoria para obtener la tabla de paginas y el número de marco, que serian 100 nanosegundos más y por último acceder a la palabra deseada de la memoria, que serian otros 100 nanosegundos, sumando un total de 220 nanosegundos. Para determinar el tiempo de acceso efectivo a memoria, debemos de ponderar cada caso por su probabilidad: Tiempo de acceso efectivo = 0,80 *120 + 0,20 * 220 = 140 nanosegundos. En este ejemplo, el tiempo de acceso a memoria es el 29% más lento, ya que pasa de 100 a 140 nanosegundos. Para una tasa de aciertos del 90% tenemos: Tiempo de acceso efectivo = 0,90 * 120 + 0,10 * 220 = 130 nanosegundos. Esta tasa de aciertos mayor produce solo un aumento del 23% en el tiempo de acceso a memoria. La tasa de aciertos esta evidentemente relacionada con él número de registros asociativos. Así, con 16 a 512 registros asociativos puede obtenerse una tasa de aciertos del 80% al 98%, todo depende del procesador que se esté utilizando. PROTECCIÓN Y USO COMPARTIDO. La protección de memoria en un entorno paginado, se puede lograr asociando una serie de bits de protección a cada marco de página. Normalmente, estos bits se conservan en la tabla de páginas y permiten definir si una página es de solo lectura, ejecución, actualización, etc. Cada referencia a memoria pasa por la tabla de páginas para encontrar el número de marco correcto, por lo tanto, al mismo tiempo que se calcula la dirección física, se puede consultar los bits de protección, para verificar que no se efectúen actualizaciones en una página de solo lectura, si eso ocurre, se produce una interrupción de hardware para el sistema operativo, consistente en una violación de la protección de memoria. Esta estrategia de protección puede ampliarse fácilmente, para ofrecer un nivel de protección más fino, creando hardware para brindar protección de solo lectura, lectura/escritura, o de solo ejecución, o bien, proporcionando bits de protección separados para cada tipo de acceso, permitiendo cualquier combinación de estos accesos y produciendo una interrupción al sistema operativo si se presenta algún intento de violación. APUNTES DE SISTEMAS OPERATIVOS ANGEL GLEZ. DEL ALBA TEORÍA DE LOS SISTEMAS OPERATIVOS 43 APUNTES DE SISTEMAS OPERATIVOS ANGEL GLEZ. DEL ALBA 44 GESTIÓN Y ADMINISTRACIÓN DE LA MEMORIA REAL Es poco común que un proceso utilice todo su intervalo de direcciones, en realidad muchos procesos, solo utilizan una pequeña fracción del espacio de direcciones del que disponen. En estos casos, seria un derroche crear una tabla de paginas, con entradas para cada pagina del intervalo de direcciones, ya que la mayor parte de esta tabla no se utilizaría, pero ocuparía un valioso espacio de memoria. Algunos sistemas ofrecen hardware que indica el tamaño de la tabla de paginas, a través de un registro de longitud de la tabla de paginas, PTLR (Page Table Length Register). Este valor se compara con cada dirección lógica, para asegurar que la dirección se encuentra en el intervalo valido para el proceso, si no supera esta prueba se genera una interrupción para el sistema operativo. Una de las ventajas de la Paginación es la probabilidad de compartir un código común, que tiene especial importancia en un entorno de tiempo compartido. Para ello vamos a considerar un sistema de tiempo compartido, que brinde servicio a 40 usuarios, cada uno de los cuales ejecuta un editor de textos. Si el editor de textos, consta de 150 K de código y 50 K de espacio de datos, necesitamos 8.000 K para apoyar a los 40 usuarios. Si el código es reentrante, es decir, que no se puede modificar a sí mismo, en este caso el código puede compartirse entre varios usuarios, pero cada proceso deberá tener su propio espacio para contener los datos durante la ejecución, ya que esos datos variarán para cada proceso. Solo es necesario conservar una copia del editor en la memoria física, por lo tanto, cada tabla de páginas de los procesos de usuario, hará corresponder las páginas de cada proceso de usuario a la misma copia física del editor, pero las páginas de datos, corresponderán a marcos de página diferentes. De esta manera para apoyar a los 40 usuarios, únicamente se requiere una copia del editor (150 K), más 40 copias del espacio de datos de 50 K de cada uno de los usuarios. Esto significa, que ahora solamente serían necesarios: 150 K + 2.000 K = 2.150 K, en lugar de, 8.000 K necesarias sin la compartición. El ahorro que se produce con la compartición será mayor a medida que crezca el número de usuarios en el sistema. ED. 1 T:PAG. 3 ED 2 4 0 1 DAT 1 2 ED 3 DAT 1 PROC. P1 ED 1 ED 2 6 1 P1 T. PAG. ED 1 T. PAG 3 3 ED 2 4 4 5 ED 3 6 6 DAT 3 7 7 3 4 DAT 3 ED 3 6 8 9 DAT 2 2 10 P2 APUNTES DE SISTEMAS OPERATIVOS ED 2 ED 3 PROC. P3 PROC. P2 DAT 2 ED 1 P3 MEMORIA REAL ANGEL GLEZ. DEL ALBA