Memoria virtual

Técnica de gestión de memoria de computadora

La memoria virtual combina RAM activa y memoria inactiva en DASD [a] para formar una amplia gama de direcciones contiguas.

En informática , la memoria virtual o almacenamiento virtual [ b] es una técnica de gestión de memoria que proporciona una "abstracción idealizada de los recursos de almacenamiento que están realmente disponibles en una máquina determinada" [3], lo que "crea la ilusión para los usuarios de una memoria (principal) muy grande". [4]

El sistema operativo de la computadora , utilizando una combinación de hardware y software, asigna direcciones de memoria utilizadas por un programa, llamadas direcciones virtuales , a direcciones físicas en la memoria de la computadora . El almacenamiento principal , como lo ve un proceso o tarea, aparece como un espacio de direcciones contiguo o una colección de segmentos contiguos . El sistema operativo administra los espacios de direcciones virtuales y la asignación de memoria real a memoria virtual. [5] El hardware de traducción de direcciones en la CPU, a menudo denominado unidad de administración de memoria (MMU), traduce automáticamente las direcciones virtuales a direcciones físicas. El software dentro del sistema operativo puede extender estas capacidades, utilizando, por ejemplo, almacenamiento en disco , para proporcionar un espacio de direcciones virtuales que puede exceder la capacidad de la memoria real y, por lo tanto, hacer referencia a más memoria de la que está físicamente presente en la computadora.

Los principales beneficios de la memoria virtual incluyen liberar a las aplicaciones de tener que administrar un espacio de memoria compartido, la capacidad de compartir la memoria utilizada por las bibliotecas entre procesos, mayor seguridad debido al aislamiento de la memoria y la capacidad de utilizar conceptualmente más memoria de la que podría estar físicamente disponible, utilizando la técnica de paginación o segmentación.

Propiedades

La memoria virtual facilita la programación de aplicaciones al ocultar la fragmentación de la memoria física, al delegar al núcleo la carga de gestionar la jerarquía de memoria (eliminando la necesidad de que el programa maneje superposiciones explícitamente) y, cuando cada proceso se ejecuta en su propio espacio de direcciones dedicado, al obviar la necesidad de reubicar el código del programa o de acceder a la memoria con direccionamiento relativo .

La virtualización de la memoria puede considerarse una generalización del concepto de memoria virtual.

Uso

La memoria virtual es una parte integral de la arquitectura informática moderna ; las implementaciones suelen requerir soporte de hardware, normalmente en forma de una unidad de gestión de memoria integrada en la CPU . Aunque no es necesario, los emuladores y las máquinas virtuales pueden emplear soporte de hardware para aumentar el rendimiento de sus implementaciones de memoria virtual. [6] Los sistemas operativos más antiguos, como los de los mainframes de la década de 1960 y los de los ordenadores personales de principios y mediados de la década de 1980 (por ejemplo, DOS ), [7] generalmente no tienen funcionalidad de memoria virtual, [ dudosodiscutir ] aunque las excepciones notables para los mainframes de la década de 1960 incluyen:

Durante los años 60 y principios de los 70, la memoria de las computadoras era muy cara. La introducción de la memoria virtual permitió que los sistemas de software con grandes demandas de memoria pudieran ejecutarse en computadoras con menos memoria real. Los ahorros que esto supuso proporcionaron un fuerte incentivo para cambiar a la memoria virtual en todos los sistemas. La capacidad adicional de proporcionar espacios de direcciones virtuales agregó otro nivel de seguridad y confiabilidad, lo que hizo que la memoria virtual fuera aún más atractiva para el mercado.

La mayoría de los sistemas operativos modernos que admiten memoria virtual también ejecutan cada proceso en su propio espacio de direcciones dedicado . De este modo, cada programa parece tener acceso exclusivo a la memoria virtual. Sin embargo, algunos sistemas operativos más antiguos (como OS/VS1 y OS/VS2 SVS ) e incluso los modernos (como IBM i ) son sistemas operativos de espacio de direcciones único que ejecutan todos los procesos en un único espacio de direcciones compuesto de memoria virtualizada.

Los sistemas integrados y otros sistemas informáticos especiales que requieren tiempos de respuesta muy rápidos o muy consistentes pueden optar por no utilizar memoria virtual debido a un determinismo reducido ; los sistemas de memoria virtual desencadenan trampas impredecibles que pueden producir demoras no deseadas e impredecibles en la respuesta a la entrada, especialmente si la trampa requiere que los datos se lean en la memoria principal desde la memoria secundaria. El hardware para traducir direcciones virtuales a direcciones físicas generalmente requiere un área de chip significativa para implementarse, y no todos los chips utilizados en sistemas integrados incluyen ese hardware, lo que es otra razón por la que algunos de esos sistemas no utilizan memoria virtual.

Historia

En la década de 1950, todos los programas más grandes tenían que contener lógica para gestionar el almacenamiento primario y secundario, como la superposición . Por lo tanto, se introdujo la memoria virtual no solo para ampliar la memoria primaria, sino para hacer que dicha extensión fuera lo más fácil posible de usar para los programadores. [8] Para permitir la multiprogramación y la multitarea , muchos de los primeros sistemas dividían la memoria entre varios programas sin memoria virtual, como los primeros modelos del PDP-10 a través de registros .

La afirmación de que el concepto de memoria virtual fue desarrollado por primera vez por el físico alemán Fritz-Rudolf Güntsch en la Technische Universität Berlin en 1956 en su tesis doctoral, Diseño lógico de una computadora digital con múltiples tambores giratorios asincrónicos y operación automática de memoria de alta velocidad [9] [10] no resiste un escrutinio cuidadoso. La computadora propuesta por Güntsch (pero nunca construida) tenía un espacio de direcciones de 10 5 palabras que se asignaban exactamente a las 10 5 palabras de los tambores, es decir , las direcciones eran direcciones reales y no había ninguna forma de asignación indirecta, una característica clave de la memoria virtual. Lo que Güntsch inventó fue una forma de memoria caché , ya que su memoria de alta velocidad estaba destinada a contener una copia de algunos bloques de código o datos tomados de los tambores. De hecho, escribió (como se cita en la traducción [11] ): "El programador no necesita respetar la existencia de la memoria primaria (ni siquiera necesita saber que existe), ya que solo hay un tipo de direcciones ( sic ) mediante las cuales uno puede programar como si solo hubiera un almacenamiento". Esta es exactamente la situación en las computadoras con memoria caché, uno de los primeros ejemplos comerciales de las cuales fue el IBM System/360 Modelo 85. [12] En el Modelo 85, todas las direcciones eran direcciones reales que se referían al almacenamiento principal del núcleo. Un almacenamiento de caché de semiconductores, invisible para el usuario, contenía el contenido de las partes del almacenamiento principal en uso por el programa que se estaba ejecutando en ese momento. Esto es exactamente análogo al sistema de Güntsch, diseñado como un medio para mejorar el rendimiento, en lugar de resolver los problemas involucrados en la multiprogramación.

El Atlas Computer de la Universidad de Manchester fue el primer ordenador que incorporó una verdadera memoria virtual.

El primer sistema de memoria virtual verdadero fue el implementado en la Universidad de Manchester para crear un sistema de almacenamiento de un nivel [13] como parte del Atlas Computer . Utilizaba un mecanismo de paginación para mapear las direcciones virtuales disponibles para el programador en la memoria real que consistía en 16.384 palabras de memoria de núcleo primario con 98.304 palabras adicionales de memoria de tambor secundaria . [14] La adición de memoria virtual al Atlas también eliminó un problema de programación inminente: la planificación y programación de transferencias de datos entre la memoria principal y secundaria y la recompilación de programas para cada cambio de tamaño de la memoria principal. [15] El primer Atlas se puso en servicio en 1962, pero se habían desarrollado prototipos funcionales de paginación en 1959. [8] : 2  [16] [17]

Ya en 1958, Robert S. Barton , que trabajaba en Shell Research, sugirió que el almacenamiento principal debería asignarse automáticamente en lugar de que el programador se preocupara por las superposiciones de la memoria secundaria, en efecto, la memoria virtual. [18] : 49  [19] En 1960, Barton era el arquitecto principal del proyecto Burroughs B5000. De 1959 a 1961, WR Lonergan fue gerente del Grupo de Planificación de Productos de Burroughs, que incluía a Barton, Donald Knuth como consultor y Paul King. En mayo de 1960, UCLA realizó un seminario de dos semanas 'Uso y explotación de computadoras gigantes' al que fueron enviados Paul King y otros dos. Stan Gill dio una presentación sobre la memoria virtual en la computadora Atlas I. Paul King llevó las ideas a Burroughs y se determinó que la memoria virtual debería diseñarse en el núcleo del B5000. [18] : 3  . Burroughs Corporation lanzó el B5000 en 1964 como la primera computadora comercial con memoria virtual. [20]

IBM desarrolló [c] el concepto de hipervisores en sus CP-40 y CP-67 , y en 1972 lo proporcionó para el S/370 como Virtual Machine Facility/370. [22] IBM introdujo la instrucción Start Interpretive Execution ( SIE ) como parte de 370-XA en el 3081, y las versiones VM/XA de VM para explotarla.

Antes de que la memoria virtual pudiera implementarse en los sistemas operativos convencionales, se tuvieron que abordar muchos problemas. La traducción dinámica de direcciones requería hardware especializado costoso y difícil de construir; las implementaciones iniciales ralentizaron ligeramente el acceso a la memoria. [8] Existían preocupaciones de que los nuevos algoritmos para todo el sistema que utilizaban almacenamiento secundario fueran menos efectivos que los algoritmos específicos de la aplicación utilizados anteriormente. En 1969, el debate sobre la memoria virtual para computadoras comerciales había terminado; [8] un equipo de investigación de IBM dirigido por David Sayre demostró que su sistema de superposición de memoria virtual funcionaba consistentemente mejor que los mejores sistemas controlados manualmente. [23] A lo largo de la década de 1970, la serie IBM 370 que ejecutaba sus sistemas operativos basados ​​en almacenamiento virtual proporcionó un medio para que los usuarios comerciales migraran múltiples sistemas antiguos a menos mainframes más potentes que tenían una mejor relación precio/rendimiento. La primera minicomputadora que introdujo la memoria virtual fue la noruega NORD-1 ; durante la década de 1970, otras minicomputadoras implementaron la memoria virtual, en particular los modelos VAX que ejecutaban VMS .

La memoria virtual se introdujo en la arquitectura x86 con el modo protegido del procesador Intel 80286 , pero su técnica de intercambio de segmentos no se adaptaba bien a segmentos de mayor tamaño. El Intel 80386 introdujo el soporte de paginación debajo de la capa de segmentación existente , lo que permitió que la excepción de error de página se encadenara con otras excepciones sin doble error . Sin embargo, cargar descriptores de segmentos era una operación costosa, lo que hacía que los diseñadores de sistemas operativos dependieran estrictamente de la paginación en lugar de una combinación de paginación y segmentación. [ cita requerida ]

Memoria virtual paginada

Casi todas las implementaciones actuales de memoria virtual dividen un espacio de direcciones virtuales en páginas , bloques de direcciones de memoria virtual contiguas. Las páginas en los sistemas [d] contemporáneos suelen tener un tamaño de al menos 4 kilobytes ; los sistemas con grandes rangos de direcciones virtuales o cantidades de memoria real generalmente utilizan tamaños de página más grandes. [24]

Tablas de páginas

Las tablas de páginas se utilizan para traducir las direcciones virtuales vistas por la aplicación en direcciones físicas utilizadas por el hardware para procesar instrucciones; [25] el hardware que maneja esta traducción específica a menudo se conoce como la unidad de gestión de memoria . Cada entrada en la tabla de páginas contiene un indicador que indica si la página correspondiente está en la memoria real o no. Si está en la memoria real, la entrada de la tabla de páginas contendrá la dirección de memoria real en la que se almacena la página. Cuando el hardware hace referencia a una página, si la entrada de la tabla de páginas para la página indica que no está actualmente en la memoria real, el hardware genera una excepción de error de página , invocando el componente de supervisor de paginación del sistema operativo .

Los sistemas pueden tener, por ejemplo, una tabla de páginas para todo el sistema, tablas de páginas independientes para cada espacio de direcciones o proceso, tablas de páginas independientes para cada segmento; de manera similar, los sistemas pueden tener, por ejemplo, ninguna tabla de segmentos, una tabla de segmentos para todo el sistema, tablas de segmentos independientes para cada espacio de direcciones o proceso, tablas de segmentos independientes para cada región en un árbol [e] de tablas de regiones para cada espacio de direcciones o proceso. Si solo hay una tabla de páginas, diferentes aplicaciones que se ejecutan al mismo tiempo usan diferentes partes de un único rango de direcciones virtuales. Si hay varias tablas de páginas o segmentos, hay varios espacios de direcciones virtuales y las aplicaciones concurrentes con tablas de páginas independientes redirigen a diferentes direcciones reales.

Algunos sistemas anteriores con tamaños de memoria real más pequeños, como el SDS 940 , utilizaban registros de páginas en lugar de tablas de páginas en la memoria para la traducción de direcciones.

Supervisor de paginación

Esta parte del sistema operativo crea y administra tablas de páginas y listas de marcos de páginas libres. Para garantizar que habrá suficientes marcos de páginas libres para resolver rápidamente los fallos de página, el sistema puede robar periódicamente marcos de páginas asignados, utilizando un algoritmo de reemplazo de páginas , por ejemplo, un algoritmo de menos usado recientemente (LRU). Los marcos de páginas robados que se han modificado se vuelven a escribir en el almacenamiento auxiliar antes de agregarlos a la cola libre. En algunos sistemas, el supervisor de paginación también es responsable de administrar los registros de traducción que no se cargan automáticamente desde las tablas de páginas.

Por lo general, un error de página que no se puede resolver da como resultado una finalización anormal de la aplicación. Sin embargo, algunos sistemas permiten que la aplicación tenga controladores de excepciones para dichos errores. El supervisor de paginación puede manejar una excepción de error de página de varias maneras diferentes, según los detalles:

  • Si la dirección virtual no es válida, el supervisor de paginación la trata como un error.
  • Si la página es válida y la información de la página no está cargada en la MMU, la información de la página se almacenará en uno de los registros de página.
  • Si la página no está inicializada, se puede asignar y borrar un nuevo marco de página.
  • Si hay un marco de página robado que contiene la página deseada, ese marco de página se reutilizará.
  • En caso de un error debido a un intento de escritura en una página protegida contra lectura, si se trata de una página de copia en escritura, se asignará un marco de página libre y se copiará el contenido de la página anterior; de lo contrario, se tratará como un error.
  • Si la dirección virtual es una página válida en un archivo mapeado en memoria o un archivo de paginación, se asignará un marco de página libre y se leerá la página.

En la mayoría de los casos, habrá una actualización de la tabla de páginas, posiblemente seguida de una purga del búfer de búsqueda de traducción (TLB), y el sistema reinicia la instrucción que causa la excepción.

Si la cola de marcos de página libres está vacía, entonces el supervisor de paginación debe liberar un marco de página utilizando el mismo algoritmo de reemplazo de página para el robo de páginas.

Páginas fijadas

Los sistemas operativos tienen áreas de memoria que están ancladas (nunca se intercambian con el almacenamiento secundario). Otros términos utilizados son páginas bloqueadas , fijas o cableadas . Por ejemplo, los mecanismos de interrupción se basan en una matriz de punteros a sus controladores, como finalización de E/S y error de página . Si las páginas que contienen estos punteros o el código que invocan fueran paginables, el manejo de interrupciones se volvería mucho más complejo y requeriría mucho más tiempo, particularmente en el caso de interrupciones por error de página. Por lo tanto, alguna parte de las estructuras de la tabla de páginas no es paginable.

Algunas páginas pueden permanecer fijadas por períodos cortos, otras pueden permanecer fijadas por períodos más largos y otras pueden necesitar permanecer fijadas de forma permanente. Por ejemplo:

  • El código del supervisor de paginación y los controladores de los dispositivos de almacenamiento secundario en los que residen las páginas deben estar fijados de forma permanente, ya que de lo contrario la paginación ni siquiera funcionaría porque el código necesario no estaría disponible.
  • Los componentes que dependen del tiempo se pueden fijar para evitar retrasos de paginación variables.
  • Los búferes de datos a los que acceden directamente los dispositivos periféricos que utilizan acceso directo a memoria o canales de E/S deben residir en páginas ancladas mientras la operación de E/S está en curso porque dichos dispositivos y los buses a los que están conectados esperan encontrar búferes de datos ubicados en direcciones de memoria física; independientemente de si el bus tiene una unidad de administración de memoria para E/S , las transferencias no se pueden detener si se produce un error de página y luego reiniciarse cuando se haya procesado el error de página. Por ejemplo, los datos podrían provenir de una unidad de sensor de medición y los datos en tiempo real perdidos debido a un error de página no se pueden recuperar.

En los sistemas operativos de IBM para System/370 y sistemas sucesores, el término es "fijo", y dichas páginas pueden ser fijas a largo plazo, o pueden ser fijas a corto plazo, o pueden no ser fijas (es decir, paginables). Las estructuras de control del sistema a menudo son fijas a largo plazo (medidas en tiempo de reloj de pared, es decir, tiempo medido en segundos, en lugar de tiempo medido en fracciones de un segundo) mientras que los buffers de E/S generalmente son fijos a corto plazo (generalmente medidos en un tiempo significativamente menor que el tiempo de reloj de pared, posiblemente durante decenas de milisegundos). De hecho, el sistema operativo tiene una función especial para "arreglar rápidamente" estos buffers de datos fijos a corto plazo (arreglo que se realiza sin recurrir a una instrucción de Llamada de Supervisor que consume mucho tiempo ).

Multics utilizó el término "wired" (conectado). OpenVMS y Windows se refieren a las páginas que temporalmente no se pueden paginar (como los buffers de E/S) como "bloqueadas", y simplemente como "no paginables" para aquellas que nunca se pueden paginar. La Single UNIX Specification también utiliza el término "bloqueado" en la especificación para , al igual que las páginas de manual en muchos sistemas tipo Unix .mlock()mlock()

Operación virtual-real

En OS/VS1 y sistemas operativos similares, algunas partes de la memoria del sistema se gestionan en modo "virtual-real", denominado "V=R". En este modo, cada dirección virtual corresponde a la misma dirección real. Este modo se utiliza para mecanismos de interrupción , para el supervisor de paginación y las tablas de páginas en sistemas más antiguos, y para programas de aplicación que utilizan una gestión de E/S no estándar. Por ejemplo, z/OS de IBM tiene tres modos (virtual-virtual, virtual-real y virtual-fijo). [ cita requerida ]

Paliza

Cuando se utilizan la paginación y el robo de páginas , puede producirse un problema denominado “ thrashing[27] , en el que el ordenador pasa una cantidad de tiempo excesivamente grande transfiriendo páginas hacia y desde un almacenamiento de respaldo, lo que ralentiza el trabajo útil. El conjunto de trabajo de una tarea es el conjunto mínimo de páginas que debería estar en la memoria para que pueda realizar un progreso útil. El thrashing se produce cuando no hay suficiente memoria disponible para almacenar los conjuntos de trabajo de todos los programas activos. Añadir memoria real es la respuesta más sencilla, pero mejorar el diseño de la aplicación, la programación y el uso de la memoria puede ayudar. Otra solución es reducir la cantidad de tareas activas en el sistema. Esto reduce la demanda de memoria real intercambiando todo el conjunto de trabajo de uno o más procesos.

Un ataque de sistema es a menudo el resultado de un aumento repentino en la demanda de páginas de un pequeño número de programas en ejecución. Swap-token [28] es un mecanismo de protección contra ataques ligero y dinámico. La idea básica es establecer un token en el sistema, que se entrega aleatoriamente a un proceso que tiene fallas de página cuando se produce un ataque. El proceso que tiene el token recibe un privilegio para asignar más páginas de memoria física para construir su conjunto de trabajo, que se espera que termine rápidamente su ejecución y libere las páginas de memoria a otros procesos. Se utiliza una marca de tiempo para entregar el token uno por uno. La primera versión de swap-token se implementó en Linux 2.6. [29] La segunda versión se llama preempt swap-token y también está en Linux 2.6. [29] En esta implementación actualizada de swap-token, se establece un contador de prioridad para cada proceso para rastrear el número de páginas de intercambio. El token siempre se entrega al proceso con una alta prioridad, que tiene un gran número de páginas de intercambio. La longitud de la marca de tiempo no es una constante, sino que está determinada por la prioridad: cuanto mayor sea el número de páginas de intercambio de un proceso, más larga será la marca de tiempo del mismo.

Memoria virtual segmentada

Algunos sistemas, como el Burroughs B5500 [30] y los actuales sistemas Unisys MCP [31] utilizan segmentación en lugar de paginación, dividiendo los espacios de direcciones virtuales en segmentos de longitud variable. El uso de la segmentación hace coincidir los bloques de memoria asignados con las necesidades y solicitudes lógicas de los programas, en lugar de la vista física de una computadora, aunque las páginas en sí mismas son una división artificial en la memoria. Los diseñadores del B5000 habrían encontrado que el tamaño artificial de las páginas era de naturaleza procustiana , una historia que luego usarían para los tamaños de datos exactos en el B1000 [32] .

En los sistemas Burroughs y Unisys, cada segmento de memoria se describe mediante un descriptor maestro , que es un descriptor absoluto único al que pueden hacer referencia otros descriptores relativos (copia), lo que permite compartirlo dentro de un proceso o entre procesos. Los descriptores son fundamentales para el funcionamiento de la memoria virtual en los sistemas MCP. Los descriptores contienen no solo la dirección de un segmento, sino también la longitud del segmento y el estado en la memoria virtual indicado por el "bit p" o "bit de presencia", que indica si la dirección corresponde a un segmento en la memoria principal o a un bloque de almacenamiento secundario. Cuando se accede a un segmento no residente (el bit p está desactivado), se produce una interrupción para cargar el segmento desde el almacenamiento secundario en la dirección dada o, si la dirección en sí es 0, asignar un nuevo bloque. En este último caso, se utiliza el campo de longitud del descriptor para asignar un segmento de esa longitud.

Otro problema que presenta el uso de un esquema segmentado es el de los tableros de ajedrez [33] , en los que todos los segmentos libres se vuelven demasiado pequeños para satisfacer las solicitudes de nuevos segmentos. La solución es realizar una compactación de memoria para agrupar todos los segmentos utilizados y crear un bloque libre grande a partir del cual se puedan asignar más segmentos. Dado que hay un único descriptor maestro para cada segmento, la nueva dirección de bloque solo necesita actualizarse en un único descriptor, ya que todas las copias hacen referencia al descriptor maestro.

La paginación no está libre de fragmentación: la fragmentación es interna a las páginas ( fragmentación interna ). Si un bloque solicitado es más pequeño que una página, se desperdiciará algo de espacio en la página. Si un bloque requiere más que una página, se requiere un área pequeña en otra página, lo que da como resultado un gran espacio desperdiciado. La fragmentación se convierte así en un problema que se transmite a los programadores, que pueden distorsionar su programa para que coincida con ciertos tamaños de página. Con la segmentación, la fragmentación es externa a los segmentos ( fragmentación externa ) y, por lo tanto, un problema del sistema, que era el objetivo de la memoria virtual en primer lugar, para liberar a los programadores de tales consideraciones de memoria. En los sistemas de multiprocesamiento, el funcionamiento óptimo del sistema depende de la mezcla de procesos independientes en cualquier momento. Se pueden utilizar esquemas híbridos de segmentación y paginación.

El Intel 80286 admite un esquema de segmentación similar como opción, pero rara vez se utiliza.

La segmentación y la paginación se pueden utilizar juntas dividiendo cada segmento en páginas; los sistemas con esta estructura de memoria, como Multics e IBM System/38 , suelen tener una paginación predominante y la segmentación proporciona protección de la memoria. [34] [35] [36]

En los procesadores Intel 80386 y posteriores IA-32 , los segmentos residen en un espacio de direcciones paginado lineal de 32 bits . Los segmentos se pueden mover dentro y fuera de ese espacio; las páginas allí pueden "paginar" dentro y fuera de la memoria principal, proporcionando dos niveles de memoria virtual; pocos sistemas operativos, si es que hay alguno, lo hacen, en su lugar utilizan solo paginación. Las primeras soluciones de virtualización x86 no asistidas por hardware combinaban paginación y segmentación porque la paginación x86 ofrece solo dos dominios de protección, mientras que un VMM, un sistema operativo invitado o una pila de aplicaciones invitadas necesita tres. [37] : 22  La diferencia entre los sistemas de paginación y segmentación no solo tiene que ver con la división de memoria; la segmentación es visible para los procesos de usuario, como parte de la semántica del modelo de memoria. Por lo tanto, en lugar de que la memoria parezca un solo espacio grande, está estructurada en múltiples espacios.

Esta diferencia tiene consecuencias importantes: un segmento no es una página con longitud variable ni una forma sencilla de alargar el espacio de direcciones. La segmentación que puede proporcionar un modelo de memoria de un solo nivel en el que no hay diferenciación entre la memoria del proceso y el sistema de archivos consiste únicamente en una lista de segmentos (archivos) mapeados en el espacio de direcciones potencial del proceso. [38]

Esto no es lo mismo que los mecanismos proporcionados por llamadas como mmap y MapViewOfFile de Win32 , porque los punteros entre archivos no funcionan cuando se asignan archivos a lugares semiarbitrarios. En Multics, un archivo (o un segmento de un archivo de múltiples segmentos) se asigna a un segmento en el espacio de direcciones, por lo que los archivos siempre se asignan en un límite de segmento. La sección de enlace de un archivo puede contener punteros para los cuales un intento de cargar el puntero en un registro o hacer una referencia indirecta a través de él causa una trampa. El puntero no resuelto contiene una indicación del nombre del segmento al que se refiere el puntero y un desplazamiento dentro del segmento; el controlador de la trampa asigna el segmento al espacio de direcciones, coloca el número de segmento en el puntero, cambia el campo de etiqueta en el puntero para que ya no cause una trampa y regresa al código donde ocurrió la trampa, volviendo a ejecutar la instrucción que causó la trampa. [39] Esto elimina por completo la necesidad de un enlazador [8] y funciona cuando diferentes procesos asignan el mismo archivo a diferentes lugares en sus espacios de direcciones privadas. [40]

Intercambio de espacio de direcciones

Algunos sistemas operativos permiten intercambiar espacios de direcciones completos , además de las funciones que tienen para paginación y segmentación. Cuando esto ocurre, el sistema operativo escribe las páginas y segmentos que se encuentran actualmente en la memoria real en archivos de intercambio. En un intercambio de entrada, el sistema operativo vuelve a leer los datos de los archivos de intercambio, pero no vuelve a leer automáticamente las páginas que se habían paginado en el momento de la operación de intercambio de salida.

El MVS de IBM , desde OS/VS2 Release 2 hasta z/OS , permite marcar un espacio de direcciones como no intercambiable; al hacerlo no se fija ninguna página en el espacio de direcciones. Esto se puede hacer durante la duración de un trabajo ingresando el nombre de un programa principal elegible [41] en la Tabla de propiedades del programa con un indicador de no intercambiable. Además, el código privilegiado puede hacer que un espacio de direcciones sea no intercambiable temporalmente utilizando una instrucción de llamada de supervisor SYSEVENT (SVC); ciertos cambios [42] en las propiedades del espacio de direcciones requieren que el sistema operativo lo intercambie y luego lo vuelva a intercambiar, utilizando SYSEVENT TRANSWAP. [43]

El intercambio no requiere necesariamente hardware de gestión de memoria si, por ejemplo, se intercambian múltiples trabajos dentro y fuera de la misma área de almacenamiento.

Véase también

Notas

  1. ^ Los primeros sistemas utilizaban tambores ; los sistemas contemporáneos utilizan discos o memoria de estado sólido.
  2. ^ IBM utiliza el término almacenamiento virtual en los sistemas operativos mainframe. Este uso se extiende desde TSS [1] en el 360/67 hasta z/OS [2] en z/Architecture .
  3. ^ IBM había utilizado anteriormente el término hipervisor para el 360/65 , [21] pero eso no involucraba memoria virtual.
  4. ^ IBM DOS/VS , OS/VS1 y DOS/VS solo admiten páginas de 2 KB.
  5. ^ En IBM Z [26] hay un árbol de regiones de 3 niveles para cada espacio de direcciones.

Referencias

  1. ^ "COMPONENTES DEL SISTEMA: Reubicación dinámica" (PDF) . Resumen técnico preliminar del sistema de tiempo compartido System/360 Model 67 (PDF) . IBM. 1966. pág. 21. C20-1647-0.
  2. ^ "BCP (Base Control Program)" (PDF) . z/OS Versión 2 Release 4 Guía de introducción y lanzamiento de z/OS (PDF) . IBM. 22 de septiembre de 2020. pág. 3. GA32-0887-40.
  3. ^ Bhattacharjee, Abhishek; Lustig, Daniel (2017). Soporte arquitectónico y de sistemas operativos para memoria virtual. Morgan & Claypool Publishers. pág. 1. ISBN 9781627056021. Recuperado el 16 de octubre de 2017 .
  4. ^ Haldar, Sibsankar; Aravind, Alex Alagarsamy (2010). Sistemas operativos. Educación Pearson India. pag. 269.ISBN 978-8131730225. Recuperado el 16 de octubre de 2017 .
  5. ^ Zhou, Xiangrong; Petrov, Peter (1 de diciembre de 2008). "Traducción directa de direcciones para memoria virtual en sistemas embebidos energéticamente eficientes". ACM Transactions on Embedded Computing Systems . 8 (1): 1–31. doi :10.1145/1457246.1457251. ISSN  1539-9087. S2CID  18156695.
  6. ^ "Paginación anidada AMD-V™" (PDF) . AMD . Consultado el 28 de abril de 2015 .
  7. ^ "Historial de versiones de Windows". Microsoft. 23 de septiembre de 2011. Archivado desde el original el 8 de enero de 2015. Consultado el 9 de marzo de 2015 .
  8. ^ abcde Denning, Peter (1997). "Antes de que la memoria fuera virtual" (PDF) . En el principio: recuerdos de pioneros del software .
  9. ^ Jessen, Elke (2004). "Origen del concepto de memoria virtual". IEEE Annals of the History of Computing . 26 (4): 71–72.
  10. ^ Jessen, E. (1996). "Die Entwicklung des Virtullen Speichers". Informatik-Spektrum (en alemán). 19 (4): 216–219. doi :10.1007/s002870050034. ISSN  0170-6012. S2CID  11514875.
  11. ^ Jessen (2004).
  12. ^ Liptay, JS (1968), "Aspectos estructurales del modelo System/360 85: la caché", IBM Systems Journal , 7 : 15–21, doi :10.1147/sj.71.0015
  13. ^ Kilburn, T.; Edwards, DBG; Lanigan, MJ; Sumner, FH (1962), "Sistema de almacenamiento de un nivel", IRE Trans EC-11 (2): 223–235, doi :10.1109/TEC.1962.5219356
  14. ^ "Ferranti Atlas 1 y 2 - Arquitectura de sistemas" (PDF) . 12 de noviembre de 2009.
  15. ^ Denning, Peter J. (1 de enero de 2003). «Virtual memory» (Memoria virtual). Encyclopedia of Computer Science (Enciclopedia de informática ). John Wiley and Sons. pp. 1832–1835. ISBN 978-0-470-86412-8. Recuperado el 10 de enero de 2023 .
  16. ^ Creasy, RJ (septiembre de 1981). "El origen del sistema de tiempo compartido VM/370" (PDF) . IBM Journal of Research & Development . 25 (5): 486. doi :10.1147/rd.255.0483.
  17. ^ "El Atlas". Archivado desde el original el 6 de octubre de 2014.{{cite web}}: CS1 maint: unfit URL (link)
  18. ^ ab Waychoff, Richard. "Historias sobre el B5000 y las personas que estuvieron allí" (PDF) . Museo de Historia de la Computación .
  19. ^ "Carta de David Bulman al editor de IEEE Computer, agosto de 1977". IEEE .
  20. ^ Cragon, Harvey G. (1996). Sistemas de memoria y procesadores segmentados. Jones and Bartlett Publishers. pág. 113. ISBN 978-0-86720-474-2.
  21. ^ Gary R. Allred (mayo de 1971). Emulación integrada de System/370 bajo SO y DOS (PDF) . Conferencia conjunta de informática de primavera de 1971 . Vol. 38. AFIPS Press. pág. 164. doi :10.1109/AFIPS.1971.58 . Consultado el 12 de junio de 2022 .
  22. ^ z/VM basado en IBM Virtualization Technology General Information Version 4 Release 3.0 (PDF) . 12 de abril de 2002. GC24-5991-04.
  23. ^ Sayre, D. (1969). "¿Es el "plegado" automático de programas lo suficientemente eficiente como para desplazar al manual?". Communications of the ACM . 12 (12): 656–660. doi :10.1145/363626.363629. S2CID  15655353.
  24. ^ Quintero, Dino; et al. (1 de mayo de 2013). Guía de rendimiento de IBM Power Systems: implementación y optimización. IBM Corporation. pág. 138. ISBN 978-0738437668. Recuperado el 18 de julio de 2017 .
  25. ^ Sharma, Dp (2009). Fundamentos de los sistemas operativos. Excel Books India. pág. 62. ISBN 978-81-7446-626-6. Recuperado el 18 de julio de 2017 .
  26. ^ "Tablas de traducción" (PDF) . z/Architecture - Principles of Operation (PDF) (Decimocuarta edición). IBM . Mayo de 2022. págs. 3-46–3-53. SA22-7832-13 . Consultado el 18 de enero de 2023 .
  27. ^ "Paliza". Unisys .
  28. ^ Song Jiang; Xiaodong Zhang (2005). "LRU ordenada por tokens: una política de reemplazo de páginas efectiva y su implementación en sistemas Linux". Evaluación del desempeño . 60 (1–4): 5–29. doi :10.1016/j.peva.2004.10.002. ISSN  0166-5316.
  29. ^ ab "Swap Token minimiza eficazmente los efectos de desgaste del sistema y se adopta en los núcleos del sistema operativo".
  30. ^ Burroughs (1964). Manual de referencia del sistema de procesamiento de información Burroughs B5500 (PDF) . Burroughs Corporation . 1021326 . Consultado el 28 de noviembre de 2013 .
  31. ^ "Memoria virtual MCP de Unisys". Unisys .
  32. ^ Wilner, WT (1972). "Diseño del Burroughs B1700". Actas de la conferencia conjunta de informática de otoño del 5 al 7 de diciembre de 1972, Parte I sobre - AFIPS '72 (otoño, parte I) . págs. 489–497. doi :10.1145/1479992.1480060. ISBN 978-1-4503-7912-0. {{cite book}}: |website=ignorado ( ayuda )
  33. ^ "Tablero de ajedrez". Unisys .
  34. ^ Manual del sistema GE-645 (PDF) . Enero de 1968. págs. 21–30 . Consultado el 25 de febrero de 2022 .
  35. ^ Corbató, FJ ; Vyssotsky, VA "Introducción y descripción general del sistema Multics" . Consultado el 13 de noviembre de 2007 .
  36. ^ Glaser, Edward L.; Couleur, John F. y Oliver, GA "Diseño de sistema de una computadora para aplicaciones de tiempo compartido".
  37. ^ Smith, JE; Uhlig, R. (14 de agosto de 2005). "Máquinas virtuales: arquitecturas, implementaciones y aplicaciones, HOTCHIPS 17, Tutorial 1, parte 2" (PDF) .
  38. ^ Bensoussan, André; Clingen, Charles T.; Daley, Robert C. (mayo de 1972). "La memoria virtual Multics: conceptos y diseño". Comunicaciones de la ACM . 15 (5): 308–318. CiteSeerX 10.1.1.10.6731 . doi :10.1145/355602.361306. S2CID  6434322. 
  39. ^ "Multics Execution Environment". Multicians.org . Consultado el 9 de octubre de 2016 .
  40. ^ Organick, Elliott I. (1972). El sistema Multics: un examen de su estructura . MIT Press. ISBN 978-0-262-15012-5.
  41. ^ El requisito más importante es que el programa esté autorizado por la APF.
  42. ^ p. ej., solicitando el uso de la memoria preferida
  43. ^ "Intercambio de control (DONTSWAP, OKSWAP, TRANSWAP)". IBM Knowledge Center . Programación de z/OS MVS: Referencia de servicios de ensamblador autorizados SET-WTO SA23-1375-00. 1990–2014 . Consultado el 9 de octubre de 2016 .

Lectura adicional

  • Hennessy, John L.; y Patterson, David A.; Arquitectura informática: un enfoque cuantitativo ( ISBN 1-55860-724-2 ) 
  • Sistemas operativos: tres piezas sencillas, por Remzi H. Arpaci-Dusseau y Andrea C. Arpaci-Dusseau. Arpaci-Dusseau Books, 2014. Capítulos relevantes: Espacios de direcciones Traducción de direcciones Segmentación Introducción a la paginación TLB Tablas de páginas avanzadas Intercambio: mecanismos Intercambio: políticas
  • "Programas de supervisión de tiempo compartido" (PDF) . Archivado desde el original (PDF) el 1 de noviembre de 2012.por Michael T. Alexander en Temas avanzados en programación de sistemas , Conferencia de verano de ingeniería de la Universidad de Michigan de 1970 (revisada en mayo de 1971), compara los enfoques de programación y asignación de recursos, incluida la memoria virtual y la paginación, utilizados en cuatro sistemas operativos de mainframe: CP-67 , TSS/360 , MTS y Multics .
  • LinuxMM: Gestión de memoria Linux.
  • Nacimiento del kernel de Linux, discusión en lista de correo.
  • El administrador de memoria virtual en Windows NT, Randy Kath, Microsoft Developer Network Technology Group, 12 de diciembre de 1992 en Wayback Machine (archivado el 22 de junio de 2010)
Retrieved from "https://en.wikipedia.org/w/index.php?title=Virtual_memory&oldid=1250508670"