• Conceptos sobre almacenamiento. • Los procesos necesitan espacio para el código asociado • Los procesos realizan operaciones de E/S que hacen uso de buffers MEMORIA: • Soporte para retener información, sujeta a posibles recuperaciones • Se divide en un conjunto finito de elementos, denominados posiciones, que pueden agruparse o no para su direccionamiento • Hay distintos tipos de memoria, en función de distintos parámetros: • Velocidad de acceso • Capacidad de almacenamiento • Coste 1.1. JERARQUÍA DE MEMORIA: Para lograr un buen rendimiento, se organizan los distintos tipos de memoria de forma jerárquica: 1.2. OBJETIVO DEL GESTOR DE MEMORIA: • Controlar la jerarquía como si fuera un todo • Se basa en un esquema de almacenamiento Esquema de almacenamiento: Organización de la Memoria + Gestión de Memoria 1.2.1.Organización de la Memoria: • La Organización de la memoria, implica cierto soporte Hardware • Es el CÓMO de percibe la memoria: • Si se trata de una memoria en la que puede haber uno o varios programas • Si los bloques de memoria son fijos o cambian con el tiempo • Si existe posibilidad de reubicar programas • ... ORGANIZACIONES POSIBLES: • Sistemas de Memoria Real: • Sistemas Dedicados: Un solo usuario • Sistemas Multiprogramados: • Sistemas con Particiones Fijas: REGIONES 1 • Absolutas • Reubicantes • Sistemas con Particiones Variables • Sistemas de Memoria Virtual: Sistemas Multiprogramados • Segmentados • Paginados • Combinados 1.2.2. Gestión de la Memoria: • Se hace por Software y por Hardware • Es un conjunto de estrategias aplicado sobre una organización de memoria para aumentar su rendimiento 1.2.2.1 ESTRATEGIAS FETCH o DE BÚSQUEDA: Determinan cuándo coger un bloque de código o datos para pasarlo a Memoria Principal. Hay dos tipos: • Búsqueda por demanda: • Se localiza y se pasa un bloque a memoria cuando la UCP lo pide o referencia • Es poco efectiva, porque la UCP espera • Búsqueda por demanda anticipada: • Se lleva a memoria más bloques de los referenciados (los contiguos) • Se persigue que estén en memoria para cuando sean refernciados • Es muy costoso, pero aumenta el rendimiento • ESTRATEGIAS DE UBICACIÓN o GESTIÓN DEL ESPACIO LIBRE: Estudia dónde situar en memoria, el siguiente bloque de programa o datos Hay tres tipos: • Estrategias de gestión de huecos de tamaño fijo: BUDDY SYSTEMS • Estrategias de encadenamiento de zonas libres: • BEST FIT • FIRST FIT • WORST FIT • Estrategias de zonas de magnitudes predefinidas En los distintos niveles de la jerarquía, suele haber distintas estrategias de ubicación. • ESTRATEGIAS DE REEMPLAZAMIENTO: 2 Determinan qué bloque de los que hay en memoria (cuando ésta está llena) debe reemplazarse por uno nuevo. Algoritmos que se utilizan: • FIFO • ÓPTIMO • LRU • LFU • MRU • MFU • Sistemas dedicados a un usuario. La Memoria Principal, se divide en dos: • Una parte para el Sistema Operativo • Otra parte para el usuario Generalmente, la zona del Sistema Operativo, se suele encontrar a partir de las posiciones más bajas, pero en algunos Sistemas Operativos, se suele encontrar a partir de la más alta. Depende de qué posiciones de memoria están reservadas para el vector de interrupciones. La parte del Sistema Operativo se puede encontrar a su vez, dividida en otras dos partes: • Parte Residente: SIEMPRE debe estar en Memoria • Zona de Rutinas Transitorias Como el Sistema Operativo ya ocupa un cierto espacio, y si se añade algo (drivers, ...) al sistema, se debería modificar el límite de zonas de memoria ocupadas. Para todas aquellas rutinas del Sistema Operativo que se usan habitualmente, se diseñó la parte RESIDENTE. El resto, en lugar de guardarlas en memoria, están aparte, en memoria auxiliar, que se cargará la rutina del servicio y en el momento en el que necesita el servicio correspondiente, en el momento en que se pide, el Sistema Operativo se encargará de cargar la rutina en la posición correspondiente. En estos sistemas, por cada dirección generada durante la ejecución de un proceso de usuario, se tiene que comprobar si es correcta o no. El Sistema Operativo no tiene restricciones de acceso a ninguna parte de la memoria, pero los procesos de usuario sí tienen. La dirección será válida, si la posición de memoria referenciada, está en la Zona de Usuario. La comprobación, se puede hacer por Hardware o por Software, aunque si la hacemos por Software, el rendimiento baja mucho, y por eso: ! LA PROTECCIÓN DE MEMORIA SIEMPRE SE HACE POR HARDWARE Se necesitará un registro máquina, conocido como: REGISTRO FENCE (frontera, barrera) 3 Este registro, contendrá la dirección de la zona de usuario. Mediante una instrucción reservada del Sistema Operativo, se podrá modificar el contenido del registro FENCE. Un proceso de usuario, al ejecutarse, va generando direcciones. La dirección generada, se compara con el contenido del registro FENCE (dirección de protección), y con esa comprobación, se decide si se permite el acceso a memoria o hay error. En caso de ERROR lo que se hace es: • Llamar al Hardware d interrupciones • Matar el proceso • Volcar la memoria Cuando codificamos un programa, su inicio es la dirección 0. Si se pone el programa en memoria, no se puede poner la dirección 0, porque ahí está el Sistema Operativo. Hay que realizar una operación de BIND. Es decir, hay que establecer la correspondencia entre instrucciones y datos y direcciones de Memoria Principal. Esta operación, la BIND, se puede hacer: • En tiempo de Compilación • En tiempo de Carga • En tiempo de Ejecución • Si se realiza la BIND en compilación, y se modifica el contenido del registro FENCE, habrá que volver a compilar todos los programas • Cuanto más tarde se haga la operación BIND, mayor flexibilidad. • Si se realiza la BIND en tiempo de ejecución, las direcciones generadas, son, en un principio lógicas, por lo que hay que convertirlas en direcciones físicas, sumándoles el contenido del registro FENCE o registro BASE, cuyo contenido se denomina DIRECCIÓN BASE. Si se realiza la BIND en tiempo de ejecución, el gráfico quedaría de la siguiente manera: Para aumentar el rendimiento en los Sistemas Monoprogramados, se utilizan los Sistemas con Intercambio o Swapping. • Sistemas con intercambio o SWAPPING. En estos sistemas, se trata de conmutar la memoria entre diferentes procesos. A cada proceso se le asigna una cantidad de tiempo de utilización del sistema, en concreto, de la memoria. A este tiempo se le denomina QUANTUM. Cuando se le acaba el tiempo de utilización de la memoria, su imagen se vuelca sobre memoria auxiliar. Luego, habrá que elegir otro proceso al que dar paso y cargar su imagen en Memoria Principal. • Se necesita un DAAD (Dispositivo de Acceso Directo) con capacidad suficiente como para contener todas las imágenes de memoria de todos nuestros procesos. • El Sistema Operativo, tendrá una lista de todas las imágenes de los procesos de usuario que tiene en memoria auxiliar, junto con su dirección en ella. 4 • Conmutar la memoria, implica como mínimo, dos operaciones de E/S, lo que conlleva TIEMPO. EJERCICIO: Sea un DAAD con tiempo de acceso de 8 msg Un Ratio de transferencia de 250 Kw/sg Para transferir 20 KW, calcularr el TIEMPO DE SWAPPING 250 Kw ! 1 sg 20 Kw ! x sg Tiempo_SWAP−OUT = 8msg + Tiempo_SWAP−IN = Tiempo_SWAP−OUT = 88 msg TIEMPO DE SWAPPING = 176 MSG • El tiempo de asignación del procesador a cada proceso (QUANTUM), debe ser bastante mayor que el tiempo de SWAPPING Problema: • El tiempo invertido en el swapping es elevado Soluciones: 2.1. SOLUCIÓN HARDWARE: Consiste en utilizar dispositivos de Swapping: • Más rápidos • Con menor tiempo de acceso • Con mayores ratios de transferencia EJEMPLO: − TSS Q−32 ! Tiempo de Acceso = 10msg ! Ratio de Transferencia = 363.000 w/s ! Tiempo de SWAP−IN = Tiempo de SWAP−OUT = 130'2 sg − ECS ! Tiempo de Acceso = 3 sg ! Ratio de Transferencia = 10.000.000 w/s 5 ! Tiempo de SWAP−IN = Tiempo de SWAP−OUT = 4.006 sg 2.2. SOLUCIÓN NO HARDWARE: 2.2.1.Transferir la zona ocupada de la Zona de Usuario: Consiste en, en vez de transferir toda la zona de usuario, transferir sólo la zona ocupada. Para ello, el Sistema Operativo debe conocer la cantidad de memoria que usa cada proceso. 2.2.2. SWAPPING con Solapamiento: Solapan las operaciones de swapping con la ejecución de instrucciones por parte de la UCP. La zona de memoria ocupada por el Sistema Operativo, se extiende para poder albergar también dos imágenes de proceso de usuario. FUNCIONAMIENTO: • Ejecución del proceso 1 ! Proceso 1 en Zona de Usuario Mientras tanto, se carga mediante Swapping, la imagen de otro proceso de usuario en uno de los buffers • Al acabar el Quantum del proceso 1, su imagen de memoria pasa al otro buffer, y la imagen del proceso recientemente transferido al primer buffer, se pasa a la Zona de Usuario • Ejecución de este nuevo proceso Mientras se ejecuta el nuevo proceso, se realiza el SWAP−OUT del proceso que se acaba de retirar de Zona de Usuario, y se lleva a cabo también, el SWAP−IN de un nuevo proceso Problema: • Si un proceso solicita un servicio al Sistema Operativo, se le acaba el Quantum, y se le saca de memoria antes de que se atienda su petición: ¿Qué se hace con lo que ha pedido cuando se le atienda? Soluciones: • No conmutar la memoria hasta no haberse completado los servicios pedidos por el proceso que la ocupa • Definir en la zona de memoria del Sistema Operativo, unos buffers especiales para depositar el resultado de las peticiones. Cuando el proceso vuelve a memoria, se le pasan esos datos ! Se complica el Sistema Operativo 3.Sistemas Multiprogramados o Sistemas con Multiprogramación. 6 Los problemas del Swapping, se resolverían si no hubiera que sacar de memoria las imágenes de los procesos. La solución, pasa por tener en la Zona de Usuario varios procesos: • Se define una Zona para el Sistema Operativo, y también se define una Zona de Ususario dividida en bloques, de manera que en cada bloque puede haber un programa de usuario Nivel de Multiprogramación: Es el número máximo de programas de usuario que puede haber en la Zona de Usuario, que será igual al número de bloques en que se divide la Zona de Usuario. • A estos sistemas, se les puede añadir SWAPPING Hay dos tipos de Sistemas Multiprogramados: • MFT • MVT SISTEMAS MFT: • Multiprogramación com número fijo de tareas La Zona de Usuario, se divide en regiones, que por definición, no varían: Número Fijo de Regiones. Es decir, al generar el Sistema Operativo, al arrancar la máquina, se define el número y tamaño de las regiones. Esto permanece invariante hasta que se vuelva a generar el Sistema Operativo. SISTEMAS MVT: • Multiprogramación con un número variables de tareas Estos sistemas, se caracterizan porque las particiones de la Zona de Usuario varían dinámicamente ! Se asigna Memoria según van llegandolos procesos En todos los Sistemas Multiprogramados, hay que prestar especial atención a la Protección de Memoria. Protección de Memoria: Hay que proteger el Sistema Operativo y cada fragmento, es decir, cada proceso de usuario sólo debe poder acceder a la zona dememoria que tiene asignada. Solución: 1. REGISTROS LÍMITE: Los Registros Límite son tres: Registros de Zona Activa: Indica el número de región, partición o fragmento en que está cargado el programa del proceso en curso Sólo se usa en MFT (por lo que hablaremos de regiones en vez de particiones o fragmentos), y no siempre. No tiene sentido cuando las particiones son 7 dinámicas. Registro Límite Superior: Registro que contiene la dirección límite superior de esa región o partición Registro Límite Inferior: Registro que contiene la dirección límite inferior de esa región o partición Circuito de Protección de Memoria con Registros Límite: • R.L.I Y R.L.S. son valores de cada proceso • El contenido de los tres registros, (R.L.I., R.L.D. Y Registro de ZONA ACTIVA si lo hay) es información propia del proceso que se está ejecutando Esta información, (el contenido de los tres registros), se guarda en el PCB: • El valor del Registro de Zona Activa, cuando existe: Existe una tabla en el Sistema Operativo, que permite obtener las direcciones de límite de cada zona a partir de su identificativo ó • La dirección de comienzo y fin de la memoria asignada a ese proceso FUNCIONAMIENTO: Cuando el Dispatcher cede el control del procesador a un proceso, vuelca la información de su PCB en los registros máquina, de manera que si el PCB tiene el identificativo de Zona Activa, lo vuelca sobre el registro correspondiente. A partir de ese dato, calcula los valores de los registros Límite (Superior e Inferior), y los vuelca sobre ellos. Si el PCB ya tiene el contenido de los registros Límite, el Dispatcher lo vuelca sobre los registros correspondientes. Problema: • Sólo funciona cuando la ubicación es estática 2. REGISTROS DE BASE Y LÍMITE: Se usa cuando la reubicación es dinámica. • El Registro BASE, es la dirección de comienzao de la zona de memoria asignada al proceso: R.L.I. • El Registro LÍMITE, es el resultado de: DIRECCIÓN LÍMITE SUPERIOR − DIRECCIÓN LÍMITE INFERIOR Circuito de Protección de Memoria con Registros Base y Límite: 3.1. SISTEMAS MFT: 8 • La Zona de Usuario se divide en bloques de tamaño fijo, que vamos a llamar REGIONES • Todas las regiones no tienen por qué tener el mismo tamaño • La dirección de la Zona de Usuario se hace en tiempo de generación del sistema, y permanece hasta que se regenere • En cada región sólo puede haber un programa d usuario • Cuando se somete un trabajo a ejecución, el Planificador de Alto Nivel, es decir, el Gestor de Trabajos, trata de asignar memoria al programa correspondiente al paso de trabajo indicado Si puede ubicarlo, le pide al cargador que lo cargue en la región designada Una vez que se ha cargado el programa en memoria, se crea el proceso correspondiente (estado READY) UBICAR = ASIGNAR ¿CÓMO SE HACE LA ASIGNACIÓN DE MEMORIA? Para hacer la asignación de memoria, se usan algoritmos o estrategias de ubicación o asignación: 3.1.1. Primera Aproximación: • Se define una cola de trabajos por cada región de distinto tamaño Al llegar un trabajo, el Gestor de Trabajos hace lo siguiente: 1º) Lo divide en pasos de trabajo (programas) 2º) Sitúa una región correspondiente a cada proceso de trabajo, en la cola correspondiente a la región que con tamaño suficiente cubra sus necesidades de memoria con un desperdicio mínimo 3º) Al acabar el proceso, se libera la memoria que tenía asignada, y el Planificador de Trabajos pide al cargador que cargue en la región que ha quedado libre el programa correspondiente al paso de trabajo cuyo registro está en la cabecera de la cola asociada Problema: Si suponemos: J1: 2K J2: 1K J3: 4K J4: 3 ½ K 9 ! Todos se colocarán en Q2, lo que supone desperdiciar 16K Si en el ejemplo, los pasos de trabajo tienen necesidades menores de 4K, todos quedan en la cola Q2, por lo que de los 20K disponibles, se desperdician 16K. 3.1.2. Segunda Aproximación: • Sólo hay una cola de trabajos en el sistema • En este caso, un programa se cargará solamente en la región en que se despedicie menos espacio • Se puede añadir también la limitación: First Come First Served (FCFS) (FIFO) Problema: • Si se libera la zona de 10K, con la limitación FCFS, J1 no se cargará en memoria, pues será más adecuado la región de 6K (no se carga ninguno: FIFO) • Si se permite la restricción FIFO, se recorre la cola, pero si sólo llegan trabajos con requerimiento de memoria pequeña, también se quedaría el sistema parado: Y encima recorrería toda la cola!!! Los problemas se deben a que la restricción FIFO, es decir, a la estrategia de ubicación, a cargar cada paso de trabajo sólo en la región en que menos espacio se desperdicie. Esta estrategia se llama: Best − Fit Only (BFO) Solución: • Cambiar de estrategia: Usar la estrategia Best Available Fit: ! Cargar el paso de trabajo en la zona de memoria que menos memoria desperdicie de entre los disponibles • Problema de ubicación: ¿Qué pasa cuando un proceso se está ejecutando, necesita más memoria, pero el Sistema Operativo no puede concederle más? Hay tres posibilidades: • Terminar anormalmente el proceso, indicando que no hay memoria suficiente, para que cuando el usuario relance el trabajo, indique que va a necesitar más memoria. • Mandar un mensaje al proceso, indicando que no hay más memoria disponible. El proceso decide si continuar o no. • Sacar la imagen de ese proceso a memoria auxiliar y cargarlo en una región de mayor tamaño si la hay. • Esta solución sólo vale cuando hay una región de mayor tamaño • Esta solución sólo vale cuando la reubicación es dinámica Para aumentar el rendimiento de los Sistemas MFT, suelen combinarse dos técnicas: • SWAPPING: Asociar a cada proceso un tiempo de uso del Sistema • ROLLING: Conmutar los procesos en base a la prioridad 10 ¿EN CUÁNTAS REGIONES SE DIVIDE LA ZONA DE USUARIO? ¿DE QUÉ TAMAÑO? • Se hace una primera división que recoge las necesidades de los procesos que se van a ejecutar en la instalación • Tras llegar a una división correcta, se genera el sistema, se pone operativo, y se recogen datos sobre el rendimiento del sistema con esa división • Si tras analizar los datos, el rendimiento no es adecuado, se redenera el sistema con una nueva división: TUNNING Problema: • Si el conjunto de trabajos a ejecutar es dinámico, es decir, varía con el tiempo, es muy difícil lograr un división adecuada Solución: • Poder variar el tamaño de las regiones dinámicamente ! MVT EJEMPLO: Supongamos que se ha generado el siguiente sistema: ¿Será bueno el rendimiento del sistema con estos supuestos? Para ver si el rendimiento es bueno en un sistema, hay que calcular la fragmentación: • A un proceso que necesita una zona de memoria de tamaño M, se le asigna un espacio de memoria de tamaño N, de manera que siempre: M"N • Se conoce como FRAGMENTACIÓN INTERNA: N−M • Se conoce como FRAGMENTACIÓN INTERNA TOTAL: Ni − Mi • Se conoce como FRAGMENTACIÓN EXTERNA, al sumatorio de los tamaños de las regiones libres. Sólo se calcula cuando hay procesos en espera • La FRAGMENTACIÓN o FRAGMENTACIÓN TOTAL, es: Fragmentación INTERNA + Fragmentación EXTERNA • El rendimiento será mejor cuanto menor sea la fragmentación 11 • El rendimiento es pésimo, ya que la zona de usuario cuenta con 22 K, y se desperdician 12 K Si suponemos que se ha generado el siguiente sistema: 3.2. PARTICIONES VARIABLES: SISTEMAS MVT: Inicialmente, la Zona de Usuario no está dividida. Al llegar un trabajo, se le asigna la parte de memoria que necesita, y el resto pasa a ser un nuevo hueco. Se continúa así sucesivamente, hasta no poder dar servicio a nadie más. El sistema, necesita conocer la situación de memoria, es decir: • Qué huecos hay • De qué tamaño son • Dirección de comienzo de cada una • ... Esta información, se guarda en la TABLA DE SITUACIÓN DE MEMORIA, que debe ser mantenida dinámicamente. Problema: En ocasiones, el trabajo necesario para mantener en la Tabla de Situación de Memoria (TSM) un hueco, no compensa, al ser muy pequeño el tamaño del hueco. ! Se define un tamaño mínimo de hueco, y sólo se representan en una tabla, los huecos de tamaño mayor o igual a ese mínimo. Los huecos de menor tamaño, pueden quedar libres y sin representar. A estos huecos, se les denomina MIGAS. De echo, cada cierto tiempo, se lanza un proceso llamado `RECOGE MIGAS' para recuperar ese espacio. EJEMPLO: Sea una Memoria Principal de 256 K, donde: • Sistema Operativo: 40 Kw • Zona de Usuario: 216 Kw La cola se recorre en orden FCFS (FIFO) Sea la siguiente cola de trabajos: ID J1 J2 J3 J4 Necesidad de Memoria ... 60 K 100 K 30 K 70 K 12 J5 50 K El procesador sigue una estrategia de planificación llamada ROUND−ROBIN: • Se cede el control del procesador durante un espacio de tiempo a los procesos de la Lista READY, que por tanto, van rotando por el procesador El QUANTUM, es una unidad de tiempo, y es un tiempo mucho mayor al que se tarda en asignar memoria a un trabajo y la carga de su programa, es decir, que el tiempo que se tarda en asignar memoria a un trabajo, y cargar su programa, es despreciable. Con estos datos, se pide: • Ir dibujando la Lista READY, la Tabla de Situación de Memoria y la Zona de Usuario SITUACIÓN INICIAL: 1ER QUANTUM: Llega J1: Llegan J2, J3, ..., a la vez que se le asigna el procesador a J1 Al llegar J2: Al llegar J3: 2º QUANTUM: J1 ha acabado su Quantum: 3er QUANTUM: J1 ha acabado su Quantum: Y se sigue así hasta que se acabe de ejecutar algún proceso. Para ello, elaboramos un cuadro de resumen de tiempos: J1 J2 J3 1 2 3 4 5 6 7 8 9 10 11 12 13 14// 15 Al acabar el quantum nº 14: 15º QUANTUM: J1 J2 J3 J4 13 14 15 16 19 22 25 18 17 21 20 24 23 27 26 28// Al acabar el quantum nº 28: 13 29º QUANTUM: J1 J2 J3 J4 J5 28// 30 29 31 33 32 34 36 35 37 38// 3.3. ESTRATEGIAS DE UBICACIÓN O SISTEMAS DE ASIGNACIÓN: • Son válidas para: • MFT • MVT • Memoria Virtual • Memoria Secundaria • Estas estrategias, se usan para calcular dónde ubicar el siguiente programa, conjunto de datos, ... en memoria. Se trata en definitiva, de localizar un hueco de tamaño suficiente • Los tipos de estrategias de ubicación son: • Zonas Libres Encadenadas: ! best − fit ! worst − fit ! first − fit • `BUDDY SYSTEMS' • ZONAS DE MAGNITUDES PREDEFINIDAS 3.3.1. Zonas Libres Encadenadas: • A cada zona libre se asocia un descriptor con: • Su dirección de origen o de comienzo • Su tamaño o magnitud • Los eslabones de encadenamiento o punteros • El descriptor, está dentro de la propia zona de memoria. • Al liberarse una zona de memoria, se reinserta en la lista, siendo objeto de fusión con los posibles huecos contiguos • La TSM (Tabla de Situación de Memoria), está implementada como una lista doblemente enlazada de zonas libres o huecos 3.3.1.1. ESTRATEGIA BEST − FIT 14 • Consiste en asignar el hueco mínimo con tamaño suficiente • Al llegar JN con necesidad de 13 K, hay que buscar el hueco en el que menos memoria se desperdicie Inconveniente: • Hay que recorrer todos los huecos para escoger el mínimo con capacidad suficiente Solución: • Mantener siempre ordenada la lista en ascendente por tamaño de hueco o zona libre Problema: • Al tratar de desperdiciar el mínimo hueco en cada zona, puede producir migas, huecos muy pequeños que no tienen capacidad para albergar nada. • De cualquier manera, el rendimiento de esta estrategia es bueno 3.3.1.2. ESTRATEGIA WORST − FIT • Consiste en asignar el hueco mayor con tamaño suficiente, es decir, el hueco en e que más espacio se desperdicie Inconveniente: • Hay que recorrer todos los huecos para escoger el más grande Solución: • Mantener siempre ordenada la lista en descendente por tamaño de hueco o zona libre Ventaja: • Sólo hay que consultar el primer hueco, porque si no cabe en el primero, no cabe en ningún otro • No se generan migas, al menos hasta muy tarde 3.3.1.3. ESTRATEGIA FIRST − FIT • Consiste en asignar el primer hueco (en orden de dirección) con tamaño suficiente • El objetivo, es, acelerar la búsqueda al máximo, de forma que no haya que recorrer la Lista de Zonas Libres • La lista está ordenada por orden de dirección de comienzo • En principio, la estrategia de FIRST − FIT es la más rápida, sobre todo cuanto más dispersas son las magnitudes solicitadas • WORST − FIT es la que menos compensa, porque los huecos que desperdicia son muy grandes 3.3.2. `BUDDY SYSTEMS': 15 Las magnitudes de las zonas de memoria están cuantificadas (determinadas) siguiendo un algoritmo recursivo, y se expresan en múltiplos de una determinada unidad de asignación. Se usan reglas de recursividad, dadas por: • El Sistema Binario: 1, 2, 4, 8, 16, ... • El Sistema Fibonacci: 1, 1, 2, 3, 5, 8, 13, ... Cuando se necesita un bloque de magnitud Si, si no hay ninguno libre, se subdivide un bloque de magnitud Si+1, usando la relación de recursividad. 32 8 16 K K 8 8 4K K 16 K K 16 K K 16 K • Sólo se fusionan huecos adyacentes si suman lo que deben sumar • Todo bloque de tamaño mayor que 1, es la concatenación de los 2 bloques en que puede dividirse. A estos bloques se les denomina buddies En los Buddy Systems, las posibles direcciones de comienzo de los bloques están predefinidas: Ventajas: • Sólo se obtienen ventajas cuando las demandas coinciden con los posibles tamaños de los bloques: • La búsqueda de un bloque es muy rápida • La fusión de bloques que se liberan, es prácticamente instantánea 3.3.3. Zonas de Magnitudes Predefinidas Estas estrategias se usan cuando la demanda de bloques se realiza sobre un conjunto de magnitudes definidas. En el VM 1370 de IBM, se demuestra que el 95% de las demandas, se realizan sobe bloques de 10 tamaños distintos: • Se definen 10 zonas de memoria, es decir, una por cada uno de esos tamaños, más otra zona con todo lo que queda libre • Se utiliza una cola de trabajos por cada zona de memoria, de manera que las demandas de cada una de las 10 magnitudes van a la cola del resto de memoria • Ese resto de memoria, puede usar cualquiera de las políticas de asignación vistas ¿Cuándo se usan las políticas de asignación? Las estrategias de asignación se utilizan: • Al asignar Memoria a los trabajos • Al crear procesos • Al reservar buffers de E/S 16 • ... Las estrategias de asignación se utilizan por parte de los programas de aplicación, a través de llamadas al sistema para asignar o liberar memoria: P.e. : * malloc (En C) * free (En C) 3.4. PROBLEMA DE COMPACTACIÓN: Supongamos: ! J5 no cabe en ninguno de los huecos, pero sí cabría si todo el espacio libre formara un hueco (76 K) Solución: • Reorganizar el contenido de la memoria, para que haya un único hueco. A esto se le llama REALIZAR UNA OPERACIÓN DE COMPACTACIÓN: Compactar la memoria consiste en mover los contenidos de la misma, de forma que la memoria libre, quede formando un único hueco Inconvenientes: • Consume recursos que podrían usar los procesos • Los procesos en ejecución, deben parase durante la compactación: • Los tiempos de respuesta serán variables • No es aplicable a Sistemas de Tiempo real Conclusión: • Hay que estudiar en cada sistema, la forma más adecuada de implementar la compactación, y cada cuánto tiempo debe realizarse Formas de implementar la operación de COMPACTACIÓN: • Con operaciones de memoria a memoria (por bloques) • Mediante un canal de E/S, es decir, se sacan los bloques usados a Memoria Auxiliar, y luego se vuelven a pasar a Memoria Principal, sin dejar hueco entre ellos (Es la que más se usa) • Con dos canales trabajando en paralelo: Uno saca la información a Memoria Auxiliar, y el otro la va volviendo a pasar a Memoria Principal • El Kernel. Definición: En cualquier Sistema Operativo por niveles, cada nivel se `extiende' con las demás primitivas de los niveles inferiores. Cada nivel es capaz de llevar a cabo las funciones implementadas en él 17 mismo, más las funciones implementadas en todos los niveles inferiores. VENTAJAS: • Tienen un diseño modular • Existe la posibilidad de diseñarlos mediante lenguajes de alto nivel ( UNIX está hecho en C ) • Las partes ligadas al Hardware, deberán desarrollarse en ensamblador o lenguaje máquina, o microprogramarlo En definitiva, llegamos a la conclusión de que estos Sistemas Operativos son: • Más fiables • Más fáciles de mantener • Más fáciles de extender NÚCLEO MÍNIMO DE UN SISTEMA OPERATIVO: (De propósito general) • En el núcleo, debe estar la parte más usada por los procesos • El núcleo, será la parte que no estará programada en alto nivel, en definitiva, será la parte que mayor rendimiento tenga • La misión del Kernel, será crear un entorno adecuado para que los procesos puedan desarrollarse y ejecutarse correctamente. • El núcleo, tiene que hacer posible que existan procesos en el sistema Como mínimo, en el núcleo tiene que haber: • El GESTOR DE INTERRUPCIONES DE PRIMER NIVEL: FLIH (First Level Interruption Handler): `Algo' que gestione las interrupciones • El DISPATCHER o PLANIFICADOR DE BAJO NIVEL o CONMUTADOR DE CONTEXTO: Elemento que decide quién se va a ejecutar en cada momento • Mecanismo de comunicación entre procesos El núcleo, está instalado sobre un Hardware, un Hardware mínimo. SOPORTE HARDWARE MÍNIMO: • Tiene que tener un Hardware de interrupciones que como mínimo salva el valor del PC • Tiene que haber un Hardware de protección de memoria • Tiene que haber instrucciones reservadas para uso por parte del Sistema Operativo • Tiene que haber un reloj, es decir, un contador Cuando hablamos de instrucciones reservadas, nos referimos al firmware, que está entre el Núcleo y el Hardware, es decir, son una serie de instrucciones dentro de un chip. 18 2.Componentes del núcleo. 2.1. EL CONTROLADOR DE INTERRUPCIONES DE PRIMER NIVEL: EL FLIH En principio, una señal es una indicación por la que se altera la secuencia de ejecución. Hay varios tipos de interrupción, que se clasifican en función de su origen: ! EXTERNAS: Se producen fuera del procesador ! INTERNAS: Se producen dentro del procesador Si precisamos más: Las interrupciones EXTERNAS, las denominamos: • INTERRUPCIONES Las interrupciones INTERNAS, pueden ser: • EXTRACÓDIGOS: Operaciones que manipulan elementos internos del procesador • TRAPS o EXCEPCIONES La misión del FLIH, está en el núcleo, para dar una respuesta a cualquier tipo de señal que se produce en el sistema. Al producirse una señal, la atrapa el Hardware de interrupciones, que como mínimo, salva el contenido del PC en el PCB del proceso. Además, puede que también salve el resto del entorno volátil (también en el PCB). También direcciona al FLIH, es decir, pone en el PC la dirección del FLIH. Por lo tanto, podemos decir, que el FLIH es un elemento software, es un proceso. Ya hemos dicho que el FLIH es Software, pues se trata de un sencillo programa definido sobre un área de memoria dedicada a él, un área de memoria específica; es decir, el FLIH siempre está en la misma parte de la memoria. El FLIH hace dos cosas: 1º) Determina el origen de la interrupción (Averigua qué interrupción se ha producido) 2º) Direcciona la rutina que trata esa interrupción Si el FLIH es un programa, necesita parte del entorno volátil: PC, ACC, ... Por ello, debe salvarse el entorno volátil del proceso interrumpido. El entorno volátil del proceso interrumpido, se puede salvar en dos momentos: • Puede salvarlo el Hardware de interrupciones • Si no lo salva el Hardware de interrupciones, será lo primero que haga el FLIH, antes incluso de determinar 19 el origen de la interrupción NOTA: Hay sistemas que definen unos registros máquina para uso exclusivo por parte del Sistema Operativo, para evitar tener que estar salvando y restaurando el contenido del entorno volátil. 2.1.1. Formas de determinar el origen de una interrupción: 2.1.1.1. MEDIANTE SOFTWARE: Mediante una cadena de saltos o IFs (o con una CASE) El FLIH, tiene un único punto de entrada: Ventaja: ! Es muy sencillo Desventaja: ! Rendimiento muy pobre (Cuantas más interrupciones, peor rendimiento) Posible solución: • Poner al principio de la cadena de saltos las comprobaciones de las interrupciones más frecuentes. 2.1.1.2. MEDIANTE HARDWARE: Mediante el uso de un comparador simultáneo, incluido en el Hardware de interrupciones. El origen de la interrupción, no lo va a detectar el FLIH, lo va a detectar el Hardware de interrupciones. El FLIH, tiene N puntos de entrada, siendo N el número de interrupciones que reconoce el sistema. Ventaja: ! Es casi simultáneo, mucho más rápido que la secuencia de IFs Desventaja: ! Coste Elevado: Un comparador para muchas interrupciones es muy caro 2.1.1.3. COMBINANDO SOFTWARE Y HARDWARE: El comparador distingue los TIPOS de interrupción. Las interrupciones se agrupan por tipos. EL Hardware de interrupciones: 1º) Salva el contenido del entorno volátil 2º) Mediante un comparador simultáneo, determina el tipo al que pertenece la 20 interrupción producida 3º) Se direcciona al FLIH, donde una pequeña cadena de saltos determina la interrupción en concreto que se ha producido Si N es el número de tipos de interrupciones, el FLIH tiene N puntos de entrada. Cuando el FLIH está atendiendo una interrupción, pueden producirse otras. ¿Qué hacemos con esas otras interrupciones que se producen? • Inhibir (ignorar) el resto de interrupciones mientras se atiende una. Pero esto no puede hacerse siempre • Las interrupciones más prioritarias deben tratarse nada más producirse Posible solución: • Definir niveles de prioridad entre las interrupciones, de forma que si se está atendiendo una interrupción, quedarán pendientes (o inhibidas) las de menor o igual prioridad. Problema: • Si se produce una interrupción más prioritaria que la que se está atendiendo, debe dejarse de atender la que se estaba atendiendo para atender la más prioritaria. Por lo tanto, debe guardarse el entorno volátil de la interrupción que estaba atendiendo. La interrupción que pasa a ser atendida, también puede tener que dejarse, al llegar otra de mayor prioridad ... Por tanto, es necesario un lugar a para almacenar entornos volátiles, es decir, un PCB, por cada prioridad de interrupción − 1. 2.1.2. Inicio del servicio de una interrupción: Las interrupciones no pueden estar inhibidas mucho tiempo, es decir, el tiempo de tratamiento del FLIH debe ser corto. Problema: • Hay interrupciones cuyo tratamiento lleva mucho tiempo. En ese caso, el FLIH, sólo inicia su tratamiento, y luego, lama a otra rutina ajena o externa a él, que realiza el resto del tratamiento. Una interrupción puede implicar cambio(s) de estado en algún(os) proceso(s). TIPOS DE INTERRUPCIONES: • Interrupciones que provocan cambios de estado del proceso en ejecución • Algunos extracódigos: Peticiones de E/S • Señales de error para suspensión • Interrupciones de reloj: Interrupciones por expiración del temporizador 21 • Interrupciones que provocan cambios de estado en procesos que no están en ejecución • Interrupciones de E/S 2.2. EL PLANIFICADOR DE BAJO NIVEL: EL DISPATCHER ¿Cuándo se direcciona al dispatcher? • Por uniformidad, se direcciona siempre tras atender una interrupción: Siempre que se ejecute el FLIH, se ejecuta después el dispatcher • Al quedar libre la CPU • Cuando el proceso en ejecución no sea el más adecuado para estar ejecutándose El proceso en ejecución no es el más adecuado para estar ejecutándose, cuando se trabajo con lo que se denomina `PRIORIDAD CON REQUISAMIENTO'. Prioridad con Requisamiento: Si se está ejecutando un proceso y llega otro de mayor prioridad a la lista READY, se requisa el procesador sl proceso en ejecución, y se comienza a ejecutar el más prioritario. NOTA: No siempre que se da una interrupción se llamará al dispatcher, pero aunque no tenga nada que hacer, se le suele llamar. MISIÓN DEL DISPATCHER: La misión del dispatcher es, realizar operaciones de conmutación de contexto. ORGANIGRAMA DEL FUNCIONAMIENTO DEL DISPATCHER: NOTAS: • La LISTA READY está ordenada por prioridad • Para saber si hay proceso en curso, se consulta a la Tabla Central. • Para saber si sigue habiendo proceso en curso, hay que mirar la prioridad del proceso RUNNING (PCB) y compararlo con la prioridad del proceso cuyo PCB está en la cabecera de la LISTA READY • Cuando quitamos el procesador al proceso en curso, podemos anular el dato `Proceso en curso' o no anularlo, porque de todas formas se machacará posteriormente aunque no lo anulemos TABLA CENTRAL: La tabla central, es, el medio de acceso a todas las estructuras del sistema, y el continente de informaciones generales del sistema. 22 NUMERO − VERSIÓN FECHA .......... ESTRUCTURA DE PROCESOS LISTA_READY LISTA_BLOCKED .... 2.3. IMPLEMENTACIÓN DE LAS PRIMITIVAS DE COMUNICACIÓNES ENTRE PROCESOS: Las primitivas de comunicación entre procesos, son necesarias porque a veces un proceso tiene que sincronizarse con otros. Las primitivas de comunicación entre procesos, deben estar accesibles para todos los procesos: • Tanto procesos de usuario • Como procesos del sistema Cuando un proceso se bloquea, cambia de estado; pasa de RUNNING a BLOCKED. Es decir, deja de haber proceso en curso, por lo que hay que invocar al dispatcher. La primitiva de bloqueo, debe poder llamar al dispatcher. De forma análoga, cuando tras una interrupción se desbloquea un proceso, debe llamarse a la primitiva de desbloqueo desde el tratamiento de interrupciones. ! La primitiva de desbloqueo y el tratamiento de interrupciones, deben implementarse al mismo nivel ! Las primitivas de bloqueo y de desbloqueo, deben implementarse en el núcleo para que sean accesibles desde todos los niveles EJEMPLO DE UTILIZACIÓN: WAIT (S) ! IF S.E NOT > 0 THEN Bloquear (S.C) ELSE S.E := S.E − 1; SIGNAL (S) ! IF S.C.CABEZA NOT NULL AND S.C.COLA NOT NULL THEN Desbloquear (S.C) ELSE S.E := S.E + 1; `Bloquear' y `Desbloquear', son las primitivas que se usan en distintos procesos. 23 Si implementamos una rutina de `Bloqueo' • Proceso_en _curso = NULL • Modificar su estado en el PCB ! BLOCKED • Insertar su PCB en: • La LISTA BLOCKED • La Cola del Semáforo Si implementamos una rutina de `Desbloqueo' • Sacar el PCB de: • La Cola del Semáforo • La LISTA BLOCKED • Modificar su estado en el PCB ! READY o RUNNING • Insertar su PCB en la LISTA READY ! Para meter/sacar procesos en/de la cola de un semáforo: • Para añadir o extraer un PCB en la cola del semáforo, es necesario conocer su implementación y/o organización • Distintos semáforos pueden usa colas con distintas organizaciones o implementaciones Solución: • Implementar junto con el semáforo, rutinas de manejo de sus estructuras de datos, para ser invocadas por las rutinas de bloqueo/desbloqueo. TYPE SEMAFORO RECORD E: INTEGER; COLA: −−−; ORGANIZACIÓN: ^RUTINA DE MANEJO DE LA COLA; END La organización, es una llamada a la rutina; no se implementa directamente, porque no se tienen datos para hacerlo. La ejecución de un WAIT/SIGNAL sobre un semáforo, puede implicar un cambio de estado en algún proceso. Por ello, se direcciona al dispatcher después de cualquier WAIT o después de cualquier SIGNAL. Se direcciona SIEMPRE, aunque no haga nada. EJEMPLO DE UNA WAIT: INDIVISIBILIDAD: 24 • Las rutinas de bloqueo y desbloqueo, deben implementarse como indivisibles • Las tareas que tienen que hacer estas primitivas, no pueden hacerse en una instrucción • Para que sean indivisibles, se consideran como una Sección Crítica, con su protocolo de entrada y su protocolo de salida, con lo que además garantizamos la Exclusión Mutua. Estos protocolos se construyen con espera activa mediante instrucciones Hardware, porque en el núcleo no hay nada más disponible. En los Sistemas Monoprocesador: • No hay que garantizar la Exclusión Mutua, sólo habrá un proceso ejecutándose en cada momento • Hay que mantener la indivisibilidad, no se puede interrumpir una primitiva En los Sistemas Monoprocesador, sólo se interrumpe un proceso mediante una interrupción. Los protocolos se construyen inhibiendo y desinhibiendo las interrupciones: PROTOCOLO DE ENTRADA Inhibir interrupciones SECCIÓN CRÍTICA Primitiva de (des)bloqueo PROTOCOLO DE SALIDA BLOQUEO/DESBLOQUEO PROPÓSITO NIVEL DE IMPLEMENTACIÓN MECANISMO DE RETARDO TIEMPO DE RETARDO WAIT / SIGNAL BLOQUEO / DESBLOQUEO EXCLUSIÓN MUTUA DE PROCESOS: SINCRONIZACIÓN GENERAL ENTRE PROCESOS • INIT_SEM • WAIT • SIGNAL SOFTWARE SOFTWARE + HARDWARE ESPERA ACTIVA / COLA INHIBICIÓN DE INTERRUPCIONES VARIOS SEGUNDOS VARIOS SEGUNDOS • Estrategias de Reemplazamiento. El objetivo de estas estrategias, es, seleccionar un bloque de los que están en Memoria Principal, para reemplazarlo por otro (evidentemente, si hay que reemplazarlo por otro, es porque este otro ha sido recientemente referenciado) logrando un buen rendimiento. Para evaluar el rendimiento de estas estrategias, se ejecutan contra una cadena de referencias, que es una secuencia de referencias a memoria. Las cadenas de referencias pueden generarse: 25 • De forma artificial • A partir de las trazas de los programas, olvidándose de los desplazamientos Traza de un programa: Conjunto de direcciones por las cuales va pasando un programa. Una cadena de referencias, sólo tendrá números de páginas, no Desplazamientos. Hay que eliminar referencias sucesivas al mismo bloque. Para hacer una simulación, además de la cadena de referencias, se necesita saber la cantidad de Memoria Real disponible para la ejecución, es decir, para saber cuántos fallos de bloque va a referenciar, está bien saber la Memoria Real de la que se dispone. Podemos representarlo mediante la siguiente gráfica: También se suelen utilizar otros tipos de gráficas: Cuando estas curvas no son descendentes, nos encontramos ante la ANOMALÍA DE BELADY. Para evitar que se produzca esta anomalía, debe cumplirse que: Si (w, m) " Si (w, m+1) Donde: Si (w, m): Es el conjunto de bloques que están cargados en una memoria de m celdas en la i−ésima referencia de la cadena w • ESTRATEGIA DE REEMPLAZAMIENTO FIFO(FIRST INPUT FIRST OUTPUT): Elige para ser reemplazado al bloque que lleva más tiempo cargado en Memoria. Para poder implementar esto, cada bloque, debe tener asociado el instante de reloj en que fue cargado en memoria. Una forma sencilla de implementarlo, es, mediante una estructura FIFO, es decir, una cola FIFO. Ventaja: • Es muy fácil de implementar Problema: • Se puede producir la anomalía de BELADY EJEMPLO: 26 Dada la cadena de referencias: 1, 2, 3, 4, 1, 2, 5, 1, 2, 3, 4, 5 Probar para FIFO con 2, 3, 4 y 5 celdas. ¿Cuántos fallos de bloque se producen? • 2 CELDAS 1 2 3 4 1 2 5 1 2 3 4 27