Comienza Ya. Es Gratis
ó regístrate con tu dirección de correo electrónico
Tema 4 por Mind Map: Tema 4

1. Gestión de procesos

1.1. - Una CPU no puede ejecutar más de un proceso a la vez, aunque la rapidez con la que se dedica el tiempo de la CPU a distintos procesos puede hacer parecer que los procesos se ejecutan simultáneamente.

1.2. - Una CPU no puede ejecutar más de un proceso a la vez, aunque la rapidez con la que se dedica el tiempo de la CPU a distintos procesos puede hacer parecer que los procesos se ejecutan simultáneamente.

1.3. Para empezar la ejecución de un proceso debe cumplirse: ◦ Ha de residir en memoria. ◦ Tener asignados todos los recursos que necesite (los procesos compiten por el uso de los recursos). - Pueden pertenecer al usuario o al SO. ◦ Procesos del usuario: Se ejecutan en modo usuario (con restricciones de acceso a los recursos hardware). ◦ Procesos del SO: Se ejecutan en el modo kernel o privilegiado, sin restricciones. - Los procesos pueden comunicarse, sincronizarse y colaborar entre sí, mediante una zona compartida de memoria. - Cada proceso está protegido para que ningún otro pueda escribir en él (en el trozo de memoria que ocupa o usa).

1.4. Para empezar la ejecución de un proceso debe cumplirse: ◦ Ha de residir en memoria. ◦ Tener asignados todos los recursos que necesite (los procesos compiten por el uso de los recursos). - Pueden pertenecer al usuario o al SO. ◦ Procesos del usuario: Se ejecutan en modo usuario (con restricciones de acceso a los recursos hardware). ◦ Procesos del SO: Se ejecutan en el modo kernel o privilegiado, sin restricciones. - Los procesos pueden comunicarse, sincronizarse y colaborar entre sí, mediante una zona compartida de memoria. - Cada proceso está protegido para que ningún otro pueda escribir en él (en el trozo de memoria que ocupa o usa).

1.5. Para empezar la ejecución de un proceso debe cumplirse: ◦ Ha de residir en memoria. ◦ Tener asignados todos los recursos que necesite (los procesos compiten por el uso de los recursos). - Pueden pertenecer al usuario o al SO. ◦ Procesos del usuario: Se ejecutan en modo usuario (con restricciones de acceso a los recursos hardware). ◦ Procesos del SO: Se ejecutan en el modo kernel o privilegiado, sin restricciones. - Los procesos pueden comunicarse, sincronizarse y colaborar entre sí, mediante una zona compartida de memoria. - Cada proceso está protegido para que ningún otro pueda escribir en él (en el trozo de memoria que ocupa o usa).

1.6. - Una hebra es un subproceso de un proceso que consume recursos propios pero que depende del proceso padre que lo ha ejecutado. - Mientras que los procesos corresponden a programas distintos, que tienen que estar aislados, las hebras corresponden a un mismo programa. - Un proceso siempre tendrá, como mínimo una hebra, en la que se ejecuta el propio programa pero podría tener más de una. - El cambio de un proceso a otro es computacionalmente costoso al tener que dedicar muchos ciclos de reloj a la gestión de procesos. Sin embargo, el cambio de una hebra a otra en la CPU es menos costoso que el cambio de un proceso a otro.

1.7. Bloque de control de procesos ( PCB ) Toda la información que el SO necesita para controlar un proceso se mantiene en una estructura de datos llamada bloque de control de procesos (PCB), que maneja el Planificador de Procesos. Esta información puede variar según el sistema operativo del que hablemos pero, en general, nos encontraremos estos datos: ◦PID (Identificador del proceso): a cada proceso se le asigna un PID. ◦Estado actual del proceso: ejecución, preparado o bloqueado. ◦Prioridad del proceso: es la asignada por el planificador de procesos. ◦Ubicación en memoria: dirección de memoria en la que se carga el proceso. ◦Recursos utilizados: recursos hardware y software para poder ejecutarse. ◦PPID: esto sólo aparece en los procesos multihilos. Es la identificación del proceso padre. Los procesos los lanzan normalmente otros procesos. Así, cada proceso que se lanza a ejecución depende, en la mayoría de los casos, de otro proceso llamado proceso padre

1.8. Estado de los procesos: Los procesos se pueden encontrar en tres estados distintos: - En ejecución (X): el procesador está ejecutando instrucciones de ese proceso en ese instante concreto. - Preparado o en espera (E): el proceso está preparado para ser ejecutado, esperando su turno. Pasa a este estado cuando el SO decide asignar la CPU a otro proceso (no existe la CPU suficiente como para darle a cada proceso un procesador en exclusiva). - Bloqueado (B): el proceso está detenido, normalmente esperando un recurso (un fichero, un periférico, etc), la salida de otro proceso o un evento externo. Por ejemplo, el proceso se bloquea cuando espera a que el usuario introduzca una línea de comando.

1.9. Transición de los procesos - La transición 1 ocurre cuando un proceso descubre que no puede continuar porque necesita algún dato, señal, etc. Lo más frecuente es que un proceso lea de un archivo especial (por ejemplo, una terminal) y que no existan los datos disponibles, por lo que el proceso se bloquea de forma automática. - Las transiciones 2 y 3 se deben al planificador de proceso (una parte del sistema operativo). La transición 2 ocurre cuando el planificador decide que el proceso en ejecución ha consumido su tiempo de CPU y debe dejar paso al siguiente proceso. - La transición 3 ocurre cuando los demás procesos han tenido su parte y es tiempo de que el primer proceso vuelva a ejecutarse. - La transición 4 aparece cuando ocurre el evento externo por el que esperaba un proceso (como la llegada de una orden, señal o dato). Si no existe otro proceso en ejecución en ese momento, se produce la transición 3 de forma inmediata y el proceso comienza su ejecución. En caso contrario, tendría que esperar en estado listo por un momento, hasta que la CPU esté disponible

1.10. Cuando se ejecuta el módulo del kernel que se encarga de parar la ejecución de un proceso y realizar los cambios necesarios para que se ejecute un proceso diferente, decimos que se ha producido un cambio de contexto. - Un cambio de contexto lleva a cabo las siguientes acciones: 1) Guarda en la memoria principal el valor de los registros del procesador para el proceso que se estaba ejecutando. 2) Recupera el valor de los registros del procesador, desde la memoria principal, para el proceso que toma el relevo. El proceso elegido dependerá del Planificador del sistema operativo, que aplicará una determinada política para elegirlo (turno, prioridad, etc.). 3) Se ejecuta la instrucción indicada en el Contador de Programa, que forma parte del contexto que acabamos de recuperar y, por lo tanto, será la siguiente del nuevo proceso.

1.11. Cambio de contexto: ◦El cambio de contexto puede ser parcial si se realiza entre hilos de un mismo proceso. ◦El cambio de contexto es completo cuando es entre hilos de distintos procesos (el cambio afecta a memoria, hardware, ficheros comunes, etc.). - Los cambios de contexto consumen tiempo (ciclos de reloj de la CPU) - El Administrador del Sistema (una persona) o el propio SO asigna una prioridad a cada proceso. - La prioridad de un proceso determina la cantidad de ciclos de CPU que consumirá respecto de otros procesos en ejecución. - Con la planificación se indica al ordenador los procesos que deben ejecutarse y los estados que debe adoptar.

1.12. Planificación de procesos - El tiempo de ejecución del procesador se divide en minúsculos intervalos de tiempo (quantum) y el SO va asignando cada uno de estos intervalos a cada proceso. - Los algoritmos de planificación indican en cada momento qué proceso debe ejecutarse. Una buen algoritmo de planificación se caracteriza por: - Imparcialidad y equidad: Todos los procesos son igual de importantes. No hay más preferencia por un proceso que por otro, garantizando que cada proceso obtiene su proporción justa de la CPU. - Eficiencia: Se debe aspirar a mantener ocupada la CPU el 100% del tiempo. - Tiempo de respuesta: El sistema debe responder a las solicitudes de los usuarios interactivos en un tiempo adecuado. - Tiempo de retorno: Se debe minimizar el tiempo de espera de los usuarios por lotes para obtener sus resultados. - Rendimiento: Se debe tratar de maximizar el número de acciones que se completan en un plazo de tiempo determinado, perdiendo el menor tiempo posible entre cambios de contexto y esperas. - Algunos de los criterios se contradicen. Por ejemplo, para minimizar el tiempo de respuesta para los usuarios interactivos, el planificador no debería ejecutar las tareas de procesamiento por lotes.

1.13. Algoritmos de planificación El SO debe distribuir el tiempo de CPU entre todos los procesos competidores. A ello se destina el componente del gestor de proceso llamado planificador. - El planificador decide qué proceso entre en la CPU cuando ésta queda libre y en qué momento el proceso que está en ejecución debe abandonar la CPU. - La estrategia de permitir que procesos ejecutables sean suspendidos en forma temporal se llama planificación apropiativa, en contraste con el método de ejecución hasta terminar (planificación no apropiativa) de los primeros sistemas por lotes. - A continuación se van a estudiar algunos de los algoritmos de planificación más habituales en los sistemas multiproceso. - Primero en entrar, primero en salir (FIFO). - Por prioridad al más corto (SJF). - Por prioridad al tiempo restante más corto (SRTF). - Turno rotatorio (round robin). - Por prioridades, no apropiativo. - Por prioridades, apropiativo.

1.14. Algoritmos de planificación El SO debe distribuir el tiempo de CPU entre todos los procesos competidores. A ello se destina el componente del gestor de proceso llamado planificador. - El planificador decide qué proceso entre en la CPU cuando ésta queda libre y en qué momento el proceso que está en ejecución debe abandonar la CPU. - La estrategia de permitir que procesos ejecutables sean suspendidos en forma temporal se llama planificación apropiativa, en contraste con el método de ejecución hasta terminar (planificación no apropiativa) de los primeros sistemas por lotes. - A continuación se van a estudiar algunos de los algoritmos de planificación más habituales en los sistemas multiproceso. - Primero en entrar, primero en salir (FIFO). - Por prioridad al más corto (SJF). - Por prioridad al tiempo restante más corto (SRTF). - Turno rotatorio (round robin). - Por prioridades, no apropiativo. - Por prioridades, apropiativo.

1.15. Algoritmos de planificación ( FIFO ) Es el más sencillo de todos. Se emplea en procesos por lotes y es no apropiativo. El primer trabajo en llegar es el primero en ser procesado, formándose una cola de espera de procesos en estado preparado según el orden de llegada. El proceso usa el procesador hasta que termina completamente su ejecución. - Ventajas: Es muy sencillo de implementar y es predecible, sabiendo con exactitud cuándo terminará un proceso. - Inconvenientes: los procesos largos pueden hacer esperar mucho a los procesos cortos y el tiempo de servicio mínimo variará mucho según el número de procesos ejecutados y su duración. Además, el tiempo medio de espera depende de que lleguen antes los procesos más cortos o los más largos.

1.15.1. Algoritmos de planificación (SJF ) Este algoritmo no apropiativo es el más óptimo para las tareas por lotes, en las cuales el tiempo de ejecución se conoce de antemano. El planificador elige el proceso de la cola que tiene un menor tiempo previsto de ejecución. - Ventajas: Es muy sencillo de implementar y los procesos cortos serán atendidos rápidamente, minimizando el promedio de tiempo de respuesta. - Inconvenientes: Puede ocurrir que los procesos largos sufran de inanición y no lleguen a ejecutarse debido a que vayan entrando a la cola de ejecución procesos cortos.

1.15.1.1. Algoritmos de planificación ( SRTN ) Es la versión apropiativa del SJF. En este caso se van seleccionando los procesos que están en espera con el menor tiempo para terminar. En caso de empate, se utiliza FIFO. Es apropiativo o expulsivo, ya que si mientras se está ejecutando un proceso llega otro con un tiempo restante inferior, se produce un cambio de contexto pasando a la CPU el nuevo proceso y el proceso anterior a estado preparado. - Ventajas: Es un algoritmo sencillo de implementar y muy eficaz para los procesos cortos, que será atendidos rápidamente. - Inconvenientes: Resulta difícil predecir los intervalos de asignación del procesador e, incluso, como ocurría con el algoritmo SJF puede haber procesos largos que sufran de inanición, es decir, que no lleguen a ejecutarse mientras existan procesos cortos esperando turno.

1.15.1.1.1. Algoritmos de planificación ( RR ) Este algoritmo apropiativo se emplea para procesos interactivos (en los que interviene el usuario). A cada proceso se le asigna por orden un intervalo de tiempo de ejecución, llamado quantum, que es igual para todos. Si el proceso continúa en ejecución al final de su quantum, se le coloca al final de la lista y el siguiente proceso se apropia de la CPU. Si el proceso se bloquea o termina antes de consumir su quantum, la CPU se libera para el siguiente proceso preparado de la lista. La cola de procesos actúa como una estructura circular con organización FIFO. - Ventajas: Es muy fácil de implementar. Todo lo que necesita el planificador es mantener una lista de procesos ejecutables. También se trata de un algoritmo justo, ya que el tiempo se reparte equitativamente. - Inconvenientes: Un proceso puede tener que esperar una vuelta entera de la lista circular aunque le quede muy poco para terminar.

2. Gestión de memoria

2.1. - La memoria puede verse como un conjunto de celdas o palabras del mismo tamaño que se encuentran numeradas por una dirección. El ancho en bits del bus de direcciones determina la cantidad de memoria máxima que se puede direccionar (unos 16 TB con un bus de 64 bits). El ancho de palabra es el conjunto de bits que la arquitectura de un ordenador puede manejar. Viene determinado por el tamaño de los buses (16, 32 ó 64 bits). - Para que un programa pueda ejecutarse, sus instrucciones, sus datos y su pila deben encontrarse en la memoria principal del sistema (memoria RAM). - Un programa es una secuencia de instrucciones en código máquina. Para ejecutar una instrucción, es preciso leerla desde la memoria a un registro del procesador y decodificarla. También es posible que haya que volver a la memoria tanto para obtener los datos implicados en una operación, como para guardar los resultados obtenidos. - Para mejorar el rendimiento, un SO multiprogramado o multitare a carga en memoria varios procesos a la vez. La memoria deberá dividirse para dar cabida a un mayor número de procesos.

2.1.1. - El administrador (o gestor) de memoria se encarga de: - Llevar un registro de las partes de la memoria que están en uso y de aquellas que no. - Asignar la memoria desocupada a los procesos que la soliciten y liberarla cuando terminen. - Intercambio entre la memoria principal y el disco, descargando a disco la totalidad o una parte de la memoria ocupada por un proceso, lo que permite dar cabida a más procesos en memoria. - Protege la zona de memoria de cada proceso, controlando que ningún proceso acceda a zonas de memoria que no le correspondan. Como el SO no puede anticiparse a todos los accesos que realizará un proceso en su ejecución, es el procesador el que implementa un mecanismo que intercepta los accesos no permitidos. - Crea zonas compartidas de memoria, a través de las cuales varios procesos pueden compartir información (instrucciones y datos). Por ejemplo: bases de datos, librerías (DLL), …

2.2. - Reasignación de procesos en distintas posiciones de la memoria: al volver a memoria desde disco, no es necesario que un proceso ocupe la posición original. Para ello, los programas hacen referencias a direcciones lógicas o relativas al comienzo de una partición, que serán traducidas por un componente del microprocesador (MMU) a direcciones físicas que apuntan a una posición real en la memoria. - Monoprogramación sin intercambio o paginación: La memoria principal se dividía en dos partes: una para el SO que debía estar siempre en memoria (monitor) y otra para un solo proceso de usuario. - Sólo se podía ejecutar un proceso a la vez al que se asignaba toda la memoria disponible. Cuando éste terminaba, se liberaba la memoria y el control volvía al SO. En un sistema de Multiprogramación, las particiones de memoria que se asignan a los procesos quedan definidas mediante: - El registro base: guarda la dirección más baja, es decir, contiene la dirección inicial física donde empieza el programa. Se utiliza para transformar las direcciones virtuales o lógicas en direcciones físicas. Este registro forma parte de unos circuitos específicos llamados Unidad de Gestión de Memoria (MMU) que actualmente se integran en el chip del microprocesador - El registro límite: contiene la dirección más alta que el proceso puede alcanzar, es decir, contiene la longitud de la partición que se está utilizando. Permite establecer un mecanismo de protección para evitar que un proceso pueda acceder a posiciones de memoria que se encuentren más allá del espacio que tenga asignado.

2.2.1. - Para calcular una dirección física a partir de una dirección lógica, el procesador dispone del registro base que contiene la dirección de inicio de la partición que contiene el proceso. Esto permite la reubicación, que consiste en que un determinado proceso puede ejecutarse en diferentes particiones de memoria, no sólo en sucesivas ejecuciones, sino incluso durante la misma ejecución. - Las referencias de cada proceso a memoria se calculan añadiendo al registro base la dirección lógica y comprobando que no se excede el registro límite o que la dirección resultante no quede por debajo del valor del registro base. Si está fuera del rango, se genera una interrupción que deberá ser procesada por el SO. * Existen diferentes formas de gestionar la memoria: - Particiones fijas. - Particiones variables. - Segmentación. - Paginación. - Memoria virtual.

2.3. La forma más sencilla (particiones fijas): - Antes del inicio de la ejecución de los programas, se dividía la memoria en un número fijo de particiones de igual o distinto tamaño, de modo que sólo se podía ejecutar un número fijo de tareas (MFT, Multitasking with a Fixed number of Tasks). - Cuando había que cargar un proceso en memoria, se le asignaba la partición más pequeña disponible que podía contenerlo. Era frecuente organizar la carga de trabajo según las particiones de memoria, creando una cola de procesos para cada tamaño de partición. - Tiene la ventaja de una implementación sencilla: necesita poco software por parte del SO y ofrece poca sobrecarga de procesamiento. - Como desventajas, el número de procesos activos es limitado (el resto de procesos quedan suspendidos en memoria secundaria) y produce desaprovechamiento de la memoria (fragmentación), ya que los procesos pequeños tienden a desperdiciar gran parte del espacio de las particiones.

2.3.1. - En el siguiente ejemplo, la memoria principal se divide en particiones de tamaño fijo pero no iguales (512, 1024 y 2048 KB). - La primera técnica consiste en crear varias colas de procesos cuyos tamaños sean inferiores al tamaño de la partición en la que esperan ejecutarse. - La segunda técnica (B) sólo usa una cola de espera para los procesos, que se irán alojando en una de las particiones libres donde quepan. - En ambos casos, la zona de memoria más baja (512 KB) se reserva para el SO.

2.4. - El intercambio de memoria principal a disco se hacía de aquellos procesos que se encontraban bloqueados en espera de un suceso (operación de E/S, por ejemplo), pudiendo así dar cabida a nuevos procesos - La fragmentación es la cantidad de memoria desaprovechada por el administrador de memoria cuando la asigna a los procesos (huecos desaprovechados). Hay dos tipos de fragmentación: - Fragmentación interna: Se debe a la diferencia de tamaño entre la partición de memoria y el proceso que se aloja en ella. (deja espacio libre dentro de la asignación por no ocupar el proceso toda la partición.) Como solución, gestionar los bloques de memoria con un tamaño variable para ajustarlos a cada proceso. - Fragmentación externa: Se debe al desaprovechamiento de memoria no asignada a ningún proceso que se encuentra entre particiones no contiguas. Ocurre cuando hay particiones muy pequeñas y es difícil encontrar procesos que quepan dentro. Para evitarla, habría que reubicar en la memoria los procesos en tiempo de ejecución dejando huecos libres juntos, de forma que se puedan unir (particiones variables y compactación de memoria)

2.4.1. En la gestión de memoria por particiones fijas, desde el inicio la memoria se encontraba dividida en un número fijo de particiones antes de ejecutar los procesos. Sin embargo, con particiones variables, al principio toda la memoria libre se considera un único bloque. El número, la posición y el tamaño de los bloques de memoria varían a lo largo del tiempo. - Los procesos se introducen por el SO en posiciones consecutivas de memoria, no existen particiones predefinidas. Cuando llega un proceso, se busca un bloque de memoria libre que pueda contenerlo y se le asigna sólo la porción necesaria. El resto del bloque queda libre para formar un nuevo hueco. Cuando un proceso termina, se unen en un solo hueco de tamaño igual a la suma de ambos.

2.5. - En la gestión del espacio de memoria por particiones fijas, el administrador de memoria mantenía una tabla de particiones en la que cada fila correspondía a una partición, conteniendo la posición base de la partición, su tamaño y el estado de la partición. En cambio, con particiones variables el administrador de memoria usa una tabla de particiones ocupadas, en la que cada fila está el identificador del proceso, la dirección base y el tamaño que ocupa. - Con particiones variables casi se elimina la fragmentación interna gracias a que el tamaño de los bloques se adapta a las necesidades de los procesos. Sin embargo, conforme más procesos vayan terminando se generan cada vez más huecos libres y de menor tamaño, lo que hace que sea cada vez más difícil que los nuevos procesos quepan en ellos. - La solución a esta fragmentación externa pasa por la compactación, que consiste en desplazar los bloques asignados hacia un extremo y unir todos los huecos en un solo hueco más grande. La compactación se efectúa reubicando los procesos en ejecución. El inconveniente, por tanto, tarda más en realizarse esta tarea.

2.5.1. - Primer ajuste (first-fit): Se asigna el proceso al primer bloque libre en el que quepa. Con el tiempo, los espacios disponibles del principio de la memoria tenderán a ser pequeños y difíciles de utilizar. Es bastante rápido, aunque necesita recorrer los primeros bloques hasta encontrar un hueco disponible. - Siguiente ajuste (next-fit): Busca un hueco a partir de la última asignación. Es frecuente que se reserve espacio en el bloque que queda disponible al final de la memoria, que se divide en pequeñas porciones. Lo normal es que requiera frecuentes compactaciones de memoria para obtener un bloque grande al final de la memoria. - Mejor ajuste (best-fit): Se asigna el bloque más pequeño cuya capacidad sea suficiente para contener a el proceso. El resultado es peor que el anterior, porque los fragmentos resultantes son más pequeños y, por lo tanto, difíciles de utilizar. Lo normal es que requiera frecuentes compactaciones de memoria.

2.6. - Al compilar un programa, éste se divide en una colección de segmentos que pueden ubicarse en zonas de memoria no contiguas. - Un segmento es un grupo lógico de información, como el código de un programa, la pila o los datos asociados al programa. - El tamaño de un segmento es variable dependiendo del programa. El SO mantiene una tabla de segmentos, indicando la ubicación en memoria de cada uno de ellos y su tamaño. - Las direcciones se expresan mediante un número de segmento y un desplazamiento dentro de él. Antes de realizar un acceso a memoria, el gestor de memoria comprueba que el desplazamiento no supere al tamaño del segmento, para proteger a las zonas de memoria ocupadas por otro segmento. - Se mejora la protección haciendo que los segmentos que contienen código sean de solo lectura. - La segmentación también permite que ciertos procesos puedan compartir código (rutinas, etc) o datos comunes sin necesidad de estar duplicados en memoria. - La segmentación puede extender el espacio físico de almacenamiento utilizando técnicas de intercambio. También es corriente combinar la segmentación con la paginación.

2.6.1. - La memoria principal se divide en trozos del mismo tamaño denominados marcos de página y los procesos de los usuarios se dividen en fragmentos del mismo tamaño llamados páginas. Cada página se almacena en un marco. - No es necesario que un proceso se almacene en posiciones consecutivas de memoria. Las páginas se almacenan en marcos de página libres independientemente de que estén o no contiguos. Una dirección virtual se forma por el número de página y un desplazamiento o posición relativa dentro de la página. Una dirección virtual suele asignarse cuando se compila el programa comenzando en la dirección 0 de la página 0. - Cada proceso tiene asociada una tabla de páginas que indica el marco de página donde se encuentra almacenada la página correspondiente. Además, el SO mantiene una lista de marcos de página, donde se especifica el proceso y página contenido en cada uno de los marcos y su estado (libre u ocupado). - Para evitar que el sistema sufra una importante penalización de rendimiento, habrá que recurrir a un hardware específico para la traducción de direcciones virtuales a direcciones físicas. La MMU hace dicha correspondencia y puede contener la tabla de páginas o un registro apuntando a la posición de memoria donde se encuentra dicha tabla.

2.7. El procesador envía los procesos que se dividen en 2 partes que son la página y el desplazamiento. La página debe pasar por la tabla de páginas y mira en que marco se debe guardar y luego se guarda en la memoria principal.

2.7.1. -El tamaño combinado del programa, los datos y la pila puede exceder la cantidad de memoria física disponible para él , así se presenta a los programas de usuario una memoria principal aparente mayor que la física real. - No hace falta que un programa esté cargado en su totalidad en la memoria RAM para que se ejecute. El SO mantiene aquellas partes del programa que se utilicen en cada momento en la memoria principal y el resto permanece en el disco. - La memoria también sirve en un sistema de multiprogramación para poder albergar un número de procesos superior en la misma cantidad de memoria principal, lo que permite a su vez un mayor aprovechamiento del procesador. Ambos mecanismos se pueden usar conjuntamente, pudiendo así ejecutar varios procesos que no caben en memoria: - Sólo con el intercambio se consigue que haya más procesos de los que cabe en memoria, pero individualmente cada uno de ellos cabría. - La memoria virtual hace posible usar procesos que no caben en memoria. - La memoria virtual se basa en que las instrucciones de un programa que se ejecutan de forma sucesiva están en direcciones muy próximas de memoria y en que los programas suelen estar escritos con linealidad, evitando saltos entre posiciones de memoria distantes.

2.8. - La memoria virtual se implanta utilizando las técnicas de gestión de memoria segmentada, por páginas o por la combinación de ambas - En disco se mantiene un archivo con la imagen del proceso completo, troceado en páginas o segmentos. En cambio, en la memoria principal sólo se carga la página que en ese momento deba estar en ejecución. Normalmente se utiliza un método de intercambio perezoso, de manera que únicamente se lleva una página a memoria cuando es demandada por algún proceso. No obstante, se pueden también cargar más páginas consecutivas a la referenciada, para aprovechar así la localidad espacial y para ganar en velocidad. - El SO operativo gestiona la memoria virtual con ayuda de dos tipos de tablas: - Tabla de páginas por cada proceso: Cada fila contiene la dirección de disco donde comienza la página del proceso imagen, un bit de presencia que indica si está dentro de la memoria principal o si está sólo en memoria secundaria, el marco de memoria principal en el está la página. -Tabla de marcos de página: Cada fila de esta tabla corresponde a un marco de página de memoria principal y contiene lo siguiente: que está en el marco, estado del marco, bit de modificación

2.8.1. - La memoria virtual se implanta utilizando la técnica de gestión de memoria que pueden ser segmentada, por paginas o una combinación de ambas (segmentos paginados). - En caso de que un proceso haga una referencia a una instrucción o dato de una pagina que no esta en la memoria principal, se produce una excepción de fallo de pagina. - Entonces el SO busca un marco libre en la tabla de marcos de página se descarta de la memoria principal para cargar la nueva pagina. Si la página a reemplazar ha sido actualizada en memoria principal desde la última vez que se cargó (bit de modificación), antes de cargar la nueva página se debe actualizar la copia en disco de dicha página. En cambio, si la página no ha sido modificada, la copia de disco estaría actualizada, por lo que no sería necesario volver a escribirla en el disco. - Normalmente cuando se produce un fallo de página en un proceso, se sustituye una página del propio proceso (sustitución con alcance local). Aunque en algunas ocasiones, se puede realiza una sustitución con alcance global analizando todas las páginas de memoria para cargar la pagina que necesita. - Cada vez que ocurre un fallo de pagina, se pierde tiempo accediendo al disco duro para cargar la pagina, dejando el proceso bloqueado hasta entonces. - En caso de que se produzca un fallo de página y no haya ningún marco de página libre, se debe eliminar de la memoria principal una de las páginas para dejar espacio y así poder cargar la pagina solicitada. Para esta función se aplica un algoritmo de reemplazo de pagina.

2.9. - El algoritmo de reemplazo de página decide ara realizar la sustitución. - En caso de que se cargen demasiados procesos al mismo tiempo, se puede producir bastantes fallos de pagina, lo que se conoce como hiperpaginación, donde los accesos a disco se multiplican y cae el rendimiento. - Si se elimina una pagina de uso muy frecuente, es probable que se deba recuperar rápidamente, por lo que se produce un gasto adicional. Los algoritmos de reemplazo que vamos a ver son los siguientes: - LRU: Se descarga la página que lleva más tiempo sin usarse. - FIFO: Se descarga la primera página que se cargó del proceso. - Optimo: Se reemplaza la página que vaya a ser utilizada más tarde. Este algoritmo es irrealizable porque al momento del fallo de página, el SO no tiene forma de saber a cuál de las páginas se hará referencia en un futuro.