Particiones La forma más fácil de conseguir la multiprogramación es simplemente dividir la memoria en n particiones (posiblemente de diferentes tamaños). Esta división puede, por ejemplo, realizarse manualmente cuando se pone en marcha el sistema. Cuando llega un trabajo, puede colocarse en la cola de entrada de la partición más pequeña en la que cabe. Puesto que en este esquema las particiones son fijas, cualquier espacio en una partición no utilizado por un trabajo se desperdicia. Este sistema, con particiones fijas establecidas por la mañana por el operador sin posibilidad de modificarse después, fue utilizado en el OS/360 de los grandes mainframes de IBM durante muchos años. Se le denominó MFT (Multiprogramming with a Fixed number of Tasks u OS/MFT). Es sencillo de entender e igualmente sencillo de implementar: los trabajos que llegan se encolan hasta que esté disponible una partición apropiada, momento en el cual el trabajo se carga en esa partición y se ejecuta hasta que termina. Actualmente, son pocos, por no decir ninguno, los sistemas operativos que utilizan este modelo. memoria virtual se refiere cuando el tamaño combinado del programa, sus datos y su pila pueden exceder la cantidad de memoria física disponible. El sistema operativo mantiene en la memoria principal aquellas partes del programa que se están usando en cada momento, manteniendo el resto de las partes del programa en el disco. Por ejemplo, un programa de 16 MB puede ejecutarse sobre una máquina de 4 MB eligiendo cuidadosamente qué 4 MB se tendrán en la memoria en cada instante, e intercambiando partes del programa entre el disco y la memoria, según sea necesario. los sistemas de paginación de memoria dividen los programas en pequeñas partes o páginas. Del mismo modo, la memoria es dividida en trozos del mismo tamaño que las páginas llamados marcos de página. Paginación pura La paginación pura en el manejo de memoria consiste en que el sistema operativo divide dinámicamente los programas en unidades de tamaño fijo ( generalmente múltiplos de 1 kilobyte ) los cuales va a manipular de RAM a disco y viceversa. Al proceso de intercambiar páginas, segmentos o programas completos entre RAM y disco se le conoce como `intercambio' o `swapping'. En la paginación, se debe cuidar el tamño de las páginas, ya que si éstas son muy pequeñas el control por parte del sistema operativo para saber cuáles están en RAM y cuales en disco, sus direcciones reales, etc; crece y provoca mucha `sobrecarga' (overhead). Por otro lado, si las páginas son muy grandes, el overhead disminuye pero entonces puede ocurrir que se desperdicie memoria en procesos pequeños. Debe haber un equilibrio. Segmentaciòn. Divide la memoria en segmentos, cada uno de los cuales tiene una longitud variable, que está definida intrínsecamente por el tamaño de ese segmento del programa. Los elementos dentro de un segmento están identificados por su desplazamiento con respecto al inicio del segmento: la primera instrucción del programa, la séptima entrada de la pila, la quinta instrucción de la función Sqrt(), etc. La Relocalización consiste en ajustar las direcciones de un programa al sitio donde fue cargado, para que este pueda ser ejecutado. Este proceso es indispensable para poder tener multiprogramación, puesto que un programa no siempre va a ocupar las mismas posiciones de memoria. Suponga que se tiene el siguiente trozo de programa en lenguaje ensamblador: Para su ejecución el programa debe ser traducido a lenguaje de máquina. Sin embargo el ensamblador no conoce el sitio en donde va a ser cargado el programa y por lo tanto no puede traducir adecuadamente las referencias a la memoria. Si el programa fuese cargado en la posición 0, por ejemplo, y suponiendo que las variables h y g están en las posiciones 50 y 54 respectivamente, con respecto al inicio del programa, el programa generado sería: Sin embargo, si el programa fuese cargado a partir de la posición 100, el código debe relocalizarse y sería: Segmentación pura La segmentación se aprovecha del hecho de que los programas se dividen en partes lógicas, como son las partes de datos, de código y de pila (stack). Lasegmentación asigna particiones de memoria a cada segmento de un programa y busca como objetivos el hacer fácil el compartir segmentos ( por ejemplo librerías compartidas ) y el intercambio entre memoria y los medios de almacenamiento secundario. Sistemas combinados La paginación y la segmentación puras son métodos de manejo de memoria bastante efectivos, aunque la mayoría de los sistemas operativos modernos implantan esquemas combinados, es decir, combinan la paginación y la segmentación. La idea de combinar estos esquemas se debe a que de esta forma se aprovechan los conceptos de la división lógica de los programas (segmentos) con la granularidad de las páginas. De esta forma, un proceso estará repartido en la memoria real en pequeñas unidades (páginas) cuya liga son los segmentos