Articulo de referencia

Memoria virtual

La memoria virtual combina la RAM activa y la memoria inactiva en el DASD [ a ] para formar un amplio rango de direcciones contiguas. En informática , la memoria virtual o el al...

La memoria virtual combina la RAM activa y la memoria inactiva en el DASD [ a ] para formar un amplio rango de direcciones contiguas.

En informática , la memoria virtual o el almacenamiento virtual [ b ] se habilita mediante 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 del ordenador , mediante una combinación de hardware y software, asigna direcciones de memoria utilizadas por un programa, denominadas direcciones virtuales , a direcciones físicas en la memoria del ordenador . El almacenamiento principal , visto por un proceso o tarea, aparece como un espacio de direcciones contiguo o una colección de segmentos contiguos . El sistema operativo gestiona 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 gestión de memoria (MMU), traduce automáticamente las direcciones virtuales a direcciones físicas. El software dentro del sistema operativo puede ampliar 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 el ordenador.

Entre las principales ventajas de la memoria virtual se incluyen la liberación de las aplicaciones de la necesidad de gestionar un espacio de memoria compartida, la capacidad de compartir la memoria utilizada por las bibliotecas entre procesos, una mayor seguridad gracias al aislamiento de la memoria y la posibilidad de utilizar conceptualmente más memoria de la que podría estar físicamente disponible, mediante 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 responsabilidad de gestionar la jerarquía de memoria (eliminando la necesidad de que el programa gestione explícitamente las superposiciones ); 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 de una computadora moderna ; las implementaciones generalmente requieren soporte de hardware, normalmente en forma de una unidad de administración de memoria integrada en la CPU . Si bien no es necesario, los emuladores y las máquinas virtuales pueden utilizar soporte de hardware para aumentar el rendimiento de sus implementaciones de memoria virtual. [ 6 ]

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. Algunos sistemas operativos más antiguos (como OS/VS1 y OS/VS2 SVS ) e incluso algunos más recientes (como IBM i ) son sistemas operativos de espacio de direcciones único que ejecutan todos los procesos en un único espacio de direcciones compuesto por memoria virtualizada.

Los sistemas embebidos y otros sistemas informáticos de propósito especial que requieren tiempos de respuesta muy rápidos y/o muy consistentes pueden optar por no usar memoria virtual debido a la menor determinismo ; los sistemas de memoria virtual activan interrupciones impredecibles que pueden producir retrasos no deseados e impredecibles en la respuesta a la entrada, especialmente si la interrupción 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 su implementación, y no todos los chips utilizados en sistemas embebidos incluyen dicho hardware, lo que es otra razón por la que algunos de esos sistemas no usan memoria virtual.

Historia

Durante las décadas de 1950, 1960 y principios de 1970, la memoria de las computadoras era muy cara. Los programas de mayor tamaño, para los que la memoria disponible no era suficiente para almacenar todo el código y los datos, debían incluir lógica para gestionar el almacenamiento primario y secundario, como la superposición de memoria . Por lo tanto, se introdujo la memoria virtual no solo para extender la memoria primaria, sino también para facilitar al máximo el uso de dicha extensión por parte de los programadores. [ 7 ]

El ordenador Atlas de la Universidad de Manchester fue el primero en utilizar memoria virtual real.

El primer sistema de memoria virtual verdadero fue el implementado en la Universidad de Manchester para crear un sistema de almacenamiento de un solo nivel [ 8 ] como parte de la computadora Atlas . 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 . [ 9 ] 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. [ 10 ] El primer Atlas se puso en marcha en 1962, pero los prototipos funcionales de paginación se habían desarrollado para 1959. [ 7 ] : 2 [ 11 ] [ 12 ]

Para permitir la multiprogramación y la multitarea , algunos sistemas de la década de 1960 dividían la memoria entre varios programas sin memoria virtual, como el UNIVAC 1107 , el PDP-6 y los primeros modelos del PDP-10 , mediante registros base y de límites .

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 Universidad Técnica de Berlín en 1956 en su tesis doctoral, Diseño lógico de una computadora digital con múltiples tambores giratorios asíncronos y operación automática de memoria de alta velocidad , [ 13 ] [ 14 ] no resiste un análisis cuidadoso. La computadora propuesta por Güntsch (pero nunca construida) tenía un espacio de direcciones de 10 5 palabras que se mapeaba exactamente a las 10 5 palabras de los tambores, es decir, las direcciones eran direcciones reales y no había ningún tipo de mapeo indirecto, una característica clave de la memoria virtual. Lo que Güntsch sí 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. En efecto, escribió (citado en traducción [ 15 ] ): «El programador no necesita respetar la existencia de la memoria principal (ni siquiera necesita saber que existe), pues solo hay un tipo de direcciones [ sic ] con las que se puede programar como si solo hubiera un almacenamiento». Esta es precisamente la situación en los ordenadores con memoria caché, uno de cuyos primeros ejemplos comerciales fue el IBM System/360 Modelo 85. [ 16 ] En el Modelo 85, todas las direcciones eran direcciones reales que hacían referencia al almacenamiento principal del núcleo. Un almacenamiento caché de semiconductores, invisible para el usuario, contenía el contenido de las partes del almacenamiento principal utilizadas por el programa que se estaba ejecutando. Esto es exactamente análogo al sistema de Güntsch, diseñado para mejorar el rendimiento, más que para resolver los problemas que implica la multiprogramación.

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, memoria virtual. [ 17 ] : 49 [ 18 ] Para 1960, Barton era el arquitecto principal del proyecto Burroughs B5000 . De 1959 a 1961, WR Lonergan fue gerente del Burroughs Product Planning Group, que incluía a Barton, Donald Knuth como consultor y Paul King. En mayo de 1960, la UCLA organizó un seminario de dos semanas titulado "Uso y explotación de computadoras gigantes", al que fueron enviados Paul King y otros dos. Stan Gill hizo una presentación sobre la memoria virtual en la computadora Atlas I. Paul King llevó las ideas de vuelta a Burroughs y se determinó que la memoria virtual debía diseñarse en el núcleo del B5000. [ 17 ] : 3 . Burroughs Corporation lanzó el B5000 en 1964 como la primera computadora comercial con memoria virtual. [ 19 ]

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. [ 21 ] IBM introdujo la instrucción Start Interpretive Execution ( SIE ) como parte de 370-XA en el 3081, y versiones VM/XA de VM para explotarla.

Antes de que la memoria virtual pudiera implementarse en los sistemas operativos convencionales, hubo que abordar muchos problemas. La traducción dinámica de direcciones requería hardware especializado, costoso y difícil de construir; las implementaciones iniciales ralentizaban ligeramente el acceso a la memoria. [ 7 ] Existía la preocupación de que los nuevos algoritmos a nivel de sistema que utilizaban almacenamiento secundario fueran menos efectivos que los algoritmos específicos de aplicación utilizados anteriormente. Para 1969, el debate sobre la memoria virtual para computadoras comerciales había terminado; [ 7 ] un equipo de investigación de IBM liderado por David Sayre demostró que su sistema de superposición de memoria virtual funcionaba consistentemente mejor que los mejores sistemas controlados manualmente. [ 22 ]

Los sistemas operativos que admitían memoria virtual en los ordenadores centrales de la década de 1960 incluyen:

La introducción de la memoria virtual permitió que los sistemas de software con grandes requerimientos de memoria se ejecutaran en computadoras con menos memoria física. El ahorro resultante incentivó considerablemente la adopción de la memoria virtual en todos los sistemas. La capacidad adicional de proporcionar espacios de direcciones virtuales añadió un nivel extra de seguridad y confiabilidad, lo que hizo que la memoria virtual resultara aún más atractiva para el mercado.

A lo largo de la década de 1970, la serie IBM System/370, que ejecutaba sistemas operativos basados ​​en almacenamiento virtual, proporcionó a los usuarios empresariales un medio para migrar múltiples sistemas antiguos a mainframes más potentes y con menor número de ellos, que ofrecían una mejor relación precio/rendimiento. El primer miniordenador en introducir memoria virtual fue el noruego NORD-1 ; durante la década de 1970, otros miniordenadores implementaron 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 escalaba bien con tamaños de segmento mayores. El Intel 80386 introdujo soporte para paginación debajo de la capa de segmentación existente , lo que permitió que la excepción de fallo de página se encadenara con otras excepciones sin doble fallo . Sin embargo, cargar descriptores de segmento era una operación costosa, lo que llevó a los diseñadores de sistemas operativos a depender estrictamente de la paginación en lugar de una combinación de paginación y segmentación. [ 23 ]

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 contemporáneos [ d ] suelen tener un tamaño de al menos 4 kilobytes ; los sistemas con grandes rangos de direcciones virtuales o grandes cantidades de memoria real generalmente utilizan tamaños de página mayores. [ 24 ]

Tablas de páginas

Las tablas de páginas se utilizan para traducir las direcciones virtuales vistas por la aplicación a direcciones físicas utilizadas por el hardware para procesar instrucciones; [ 25 ] dicho hardware que maneja esta traducción específica se conoce a menudo como la unidad de administración de memoria . Cada entrada en la tabla de páginas contiene un indicador que señala 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 actualmente no está en la memoria real, el hardware genera una excepción de fallo de página , invocando el componente 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 separadas para cada espacio de direcciones o proceso, tablas de páginas separadas 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 separadas para cada espacio de direcciones o proceso, tablas de segmentos separadas 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 utilizan 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 separadas se 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ágina en lugar de tablas de páginas en la memoria para la traducción de direcciones.

Supervisor de localización

Esta parte del sistema operativo crea y gestiona tablas de páginas y listas de marcos de página libres. Para garantizar que haya suficientes marcos de página libres para resolver rápidamente los fallos de página, el sistema puede tomar periódicamente marcos de página asignados, utilizando un algoritmo de reemplazo de páginas , por ejemplo, el algoritmo LRU ( menos usado recientemente ). Los marcos de página tomados que han sido modificados se escriben de nuevo en la memoria auxiliar antes de añadirlos a la cola de libres. En algunos sistemas, el supervisor de paginación también se encarga de gestionar los registros de traducción que no se cargan automáticamente desde las tablas de páginas.

Por lo general, un fallo de página que no se puede resolver provoca la terminación anormal de la aplicación. Sin embargo, algunos sistemas permiten que la aplicación tenga manejadores de excepciones para este tipo de errores. El supervisor de paginación puede manejar una excepción de fallo 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 existe un marco de página robado que contenga la página deseada, dicho marco de página se reutilizará.
  • En caso de fallo 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 en 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, se actualizará la tabla de páginas, posiblemente seguida de la eliminación del búfer de traducción anticipada (TLB), y el sistema reiniciará la instrucción que causa la excepción.

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

Páginas fijadas

Los sistemas operativos tienen áreas de memoria fijas (que 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 dependen de una matriz de punteros a sus manejadores, como la finalización de E/S y el fallo 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 lento, especialmente en el caso de interrupciones por fallo de página. Por lo tanto, algunas partes de las estructuras de la tabla de páginas no son paginables.

Algunas páginas pueden estar fijadas durante períodos cortos, otras durante períodos largos, y otras deberán estar fijadas de forma permanente. Por ejemplo:

  • El código de supervisión de paginación y los controladores para los dispositivos de almacenamiento secundario en los que residen las páginas deben estar fijados permanentemente, 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 pueden fijarse 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 fijas mientras se realiza la operación de E/S, ya que 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 dispone de una unidad de gestión de memoria para E/S , las transferencias no se pueden detener si se produce un fallo de página y reiniciarse una vez procesado dicho fallo. 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 fallo 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, fijas a corto plazo o no fijas (es decir, paginables). Las estructuras de control del sistema suelen ser fijas a largo plazo (medidas en tiempo real, es decir, tiempo medido en segundos, en lugar de fracciones de segundo), mientras que los búferes de E/S suelen ser fijos a corto plazo (normalmente medidos en un tiempo significativamente menor que el tiempo real, posiblemente durante decenas de milisegundos). De hecho, el sistema operativo tiene una función especial para "fijar rápidamente" estos búferes de datos fijos a corto plazo (fijación que se realiza sin recurrir a una instrucción de llamada al supervisor que consume mucho tiempo ).

Multics utilizaba el término "wired". OpenVMS y Windows se refieren a las páginas temporalmente no paginables (como los búferes de E/S) como "locked", y simplemente "nonpageable" para aquellas que nunca son paginables. La Especificación Única de UNIX también utiliza el término "locked" en la especificación , al igual que las páginas man de 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).

Paliza

Cuando se utilizan paginación y robo de páginas , puede ocurrir un problema llamado " thrashing " [ 27 ] , en el que la computadora dedica una cantidad de tiempo excesiva a transferir 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 debe estar en memoria para que pueda progresar de manera útil. El thrashing ocurre cuando no hay suficiente memoria disponible para almacenar los conjuntos de trabajo de todos los programas activos. Agregar memoria real es la respuesta más simple, pero mejorar el diseño de la aplicación, la planificación y el uso de la memoria puede ayudar. Otra solución es reducir el número de tareas activas en el sistema. Esto reduce la demanda de memoria real al intercambiar todo el conjunto de trabajo de uno o más procesos.

Un thrashing del sistema suele ser el resultado de un aumento repentino en la demanda de páginas por parte de un pequeño número de programas en ejecución. Swap-token [ 28 ] es un mecanismo de protección contra thrashing ligero y dinámico. La idea básica es establecer un token en el sistema, que se entrega aleatoriamente a un proceso que tiene fallos de página cuando ocurre un thrashing. El proceso que tiene el token recibe el privilegio de 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 realizar un seguimiento del número de páginas de intercambio. El token siempre se entrega al proceso con una prioridad alta, que tiene un gran número de páginas de intercambio. La duración de la marca de tiempo no es constante, sino que viene determinada por la prioridad: cuanto mayor sea el número de páginas de intercambio de un proceso, más larga será su marca de tiempo.

Memoria virtual segmentada

Algunos sistemas, como el Burroughs B5500 [ 30 ] y los sistemas Unisys MCP actuales [ 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 con la vista física de un ordenador, aunque las páginas en sí mismas son una división artificial de la memoria. Los diseñadores del B5000 habrían considerado que el tamaño artificial de las páginas era de naturaleza procusteana , una explicación que posteriormente utilizarían para los tamaños exactos de los datos en el B1700 [ 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 compartir la memoria tanto dentro de un proceso como entre procesos. Los descriptores son fundamentales para el funcionamiento de la memoria virtual en los sistemas MCP. Contienen no solo la dirección de un segmento, sino también su longitud y estado en la memoria virtual, indicados por el bit de presencia ('p'), 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 de presencia está desactivado), se produce una interrupción para cargar el segmento desde el almacenamiento secundario en la dirección especificada o, si la dirección es 0, se asigna un nuevo bloque. En este último caso, el campo de longitud del descriptor se utiliza para asignar un segmento de esa longitud.

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

La paginación no está exenta de fragmentación; esta fragmentación es interna a las páginas ( fragmentación interna ). Si un bloque solicitado es menor que una página, se desperdiciará espacio en dicha página. Si un bloque requiere más espacio que una página, se necesitará una pequeña área en otra página, lo que resulta en un gran desperdicio de espacio. La fragmentación se convierte así en un problema para los programadores, quienes pueden modificar sus programas para adaptarlos a determinados 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 principal de la memoria virtual: liberar a los programadores de estas consideraciones de memoria. En los sistemas multiprocesador, el funcionamiento óptimo del sistema depende de la combinación de procesos independientes en cada momento. Se pueden utilizar esquemas híbridos de segmentación y paginación.

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

La segmentación y la paginación pueden utilizarse conjuntamente dividiendo cada segmento en páginas; los sistemas con esta estructura de memoria, como Multics e IBM System/38 , suelen priorizar la paginación, mientras que la segmentación proporciona protección de 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 pueden moverse 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 acaso alguno, hacen esto, en su lugar usan solo paginación. Las primeras soluciones de virtualización x86 sin asistencia de 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 es solo sobre la división de la 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 una memoria que parece un único espacio grande, está estructurada en múltiples espacios.

Esta diferencia tiene consecuencias importantes; un segmento no es una página de longitud variable ni una forma sencilla de ampliar el espacio de direcciones. La segmentación que puede proporcionar un modelo de memoria de un solo nivel en el que no existe 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 al asignar archivos a ubicaciones semi-arbitrarias. En Multics, un archivo (o un segmento de un archivo multisegmento) 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 provoca una interrupción. 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 manejador de la interrupción 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 provoque una interrupción y regresa al código donde ocurrió la interrupción, volviendo a ejecutar la instrucción que la causó. [ 39 ] Esto elimina por completo la necesidad de un enlazador [ 7 ] y funciona cuando diferentes procesos asignan el mismo archivo a diferentes lugares en sus espacios de direcciones privados. [ 40 ]

Intercambio de espacios de direcciones

Algunos sistemas operativos permiten el intercambio de espacios de direcciones completos , además de las funciones de paginación y segmentación. Cuando esto ocurre, el sistema operativo escribe las páginas y segmentos que se encuentran en la memoria principal en archivos de intercambio. Al realizar un intercambio de entrada, el sistema operativo lee los datos de los archivos de intercambio, pero no lee automáticamente las páginas que se habían paginado durante la operación 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 dicho espacio. Esto se puede hacer durante la ejecución de un trabajo introduciendo el nombre de un programa principal elegible [ 41 ] en la Tabla de propiedades del programa con una bandera de no intercambiable. Además, el código privilegiado puede hacer temporalmente que un espacio de direcciones sea no intercambiable mediante una instrucción de llamada al 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 insertar, utilizando SYSEVENT TRANSWAP. [ 43 ]

El intercambio de memoria no requiere necesariamente hardware de gestión de memoria si, por ejemplo, se intercambian varios 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 de mainframe. Este uso abarca desde TSS [ 1 ] en el 360/67 hasta z/OS [ 2 ] en z/Architecture .
  3. IBM había utilizado previamente el término 'hipervisor' para el 360/65 , [ 20 ] pero eso no implicaba memoria virtual.
  4. IBM DOS/VS , OS/VS1 y DOS/VS solo admitían 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 Modelo 67 (PDF) . IBM. 1966. pág.  21. C20-1647-0.
  2. "BCP (Programa de Control Base)" (PDF) . z/OS Versión 2 Release 4 Guía de Introducción y Versión 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 sistema operativo para memoria virtual . Morgan & Claypool Publishers. pág. 1. ISBN  9781627056021Consultado el 16 de octubre de 2017 .
  4. ^ Haldar, Sibsankar; Aravind, Alex Alagarsamy (2010). Sistemas operativos . Educación Pearson India. pag. 269.ISBN  978-8131730225Consultado 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 de bajo consumo energético" . ACM Transactions on Embedded Computing Systems . 8 (1): 1– 31. doi : 10.1145/1457246.1457251 . ISSN 1539-9087 . S2CID 18156695 .  
  6. "AMD-V™ Nested Paging" (PDF) . AMD . Consultado el 28 de abril de 2015 .
  7. 1 2 3 4 5 Denning, Peter (1997). "Antes de que la memoria fuera virtual" (PDF) . En los comienzos: recuerdos personales de pioneros del software . ISBN 978-0-818-67999-5.
  8. Kilburn, T.; Edwards, DBG; Lanigan, MJ; Sumner, FH (abril de 1962). "Sistema de almacenamiento de un nivel". IRE Transactions on Electronic Computers . EC-11 (2): 223– 235. doi : 10.1109/TEC.1962.5219356 .
  9. «Ferranti Atlas 1 & 2 – Arquitectura de Sistemas» (PDF) . 12 de noviembre de 2009.
  10. Denning, Peter J. (1 de enero de 2003). «Memoria virtual» . Enciclopedia de Ciencias de la Computación . John Wiley and Sons. págs. 1832–1835 . ISBN  978-0-470-86412-8Consultado el 10 de enero de 2023 .
  11. 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 .
  12. "El Atlas" . Archivado del original el 6 de octubre de 2014.
  13. Jessen, Elke (2004). "Origen del concepto de memoria virtual". IEEE Annals of the History of Computing . 26 (4): 71– 72.
  14. ^ 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 .  
  15. Jessen (2004) .
  16. Liptay, JS (1968), "Aspectos estructurales del modelo System/360 85: la caché", IBM Systems Journal , 7 : 15–21 , doi : 10.1147/sj.71.0015
  17. 1 2 Waychoff, Richard. "Historias sobre el B5000 y las personas que estuvieron allí" (PDF) . Museo de Historia de la Computación .
  18. "IEEE Computer, agosto de 1977. Carta de David Bulman al editor" . IEEE .
  19. Cragon, Harvey G. (1996). Sistemas de memoria y procesadores segmentados . Jones and Bartlett Publishers. pág. 113. ISBN  978-0-86720-474-2.
  20. Allred, Gary R. (mayo de 1971). Emulación integrada de System/370 bajo OS y DOS (PDF) . 1971 Spring Joint Computer Conference . Vol. 38. AFIPS Press. pág. 164. doi : 10.1109/AFIPS.1971.58 . Consultado el 12 de junio de 2022 .  
  21. z/VM basado en la tecnología de virtualización de IBM. Información general. Versión 4, lanzamiento 3.0 (PDF) . 12 de abril de 2002. GC24-5991-04.
  22. Sayre, D. (1969). "¿Es el 'plegado' automático de programas lo suficientemente eficiente como para reemplazar el manual?". Communications of the ACM . 12 (12): 656– 660. doi : 10.1145/363626.363629 . S2CID 15655353 . 
  23. "Diferencia entre paginación y segmentación" . Unstop . Consultado el 14 de diciembre de 2024 .
  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-0738437668Consultado 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-6Consultado el 18 de julio de 2017 .
  26. "Tablas de traducción" (PDF) . z/Architecture - Principios de funcionamiento (PDF) (Decimocuarta edición). IBM . Mayo de 2022. págs. 3-46 – 3-53 . SA22-7832-13 . Consultado el 18 de agosto de 2025 .  
  27. "Zasada" . Unisys .
  28. Song Jiang; Xiaodong Zhang (2005). "LRU ordenado por tokens: una política eficaz de reemplazo de páginas y su implementación en sistemas Linux". Performance Evaluation . 60 ( 1–4 ): 5–29 . doi : 10.1016/j.peva.2004.10.002 . ISSN 0166-5316 . 
  29. 1 2 Zhang, Xiaodong. "El token de intercambio minimiza eficazmente los efectos de sobrecarga del sistema y se adopta en los núcleos de los sistemas operativos" . Universidad Estatal de Ohio. Archivado del original el 7 de diciembre de 2023.
  30. Burroughs (1964). Manual de referencia del sistema de procesamiento de información Burroughs B5500 (PDF) . Burroughs Corporation . 1021326. Consultado el 18 de agosto de 2025 .
  31. "Memoria virtual Unisys MCP" . 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 – AFIPS '72 (Otoño, parte I) . ACM. págs. 489–497 . doi : 10.1145/1479992.1480060 . ISBN  978-1-4503-7912-0.
  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" . Recuperado el 13 de noviembre de 2007 .
  36. Glaser, Edward L.; Couleur, John F. y Oliver, GA "Diseño de un sistema informático 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" . Communications of the ACM . 15 (5): 308–318 . CiteSeerX 10.1.1.10.6731 . doi : 10.1145/355602.361306 . S2CID 6434322 .  
  39. "Entorno de ejecución de Multics" . Multics.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., solicitar el uso de la memoria preferida
  43. "Intercambio de control (DONTSWAP, OKSWAP, TRANSWAP)" . Centro de conocimiento de IBM . 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 .

Lecturas adicionales

  • Hennessy, John L.; y Patterson, David A.; Arquitectura de computadoras, un enfoque cuantitativo ( ISBN) 1-55860-724-2)
  • Sistemas Operativos: Tres Piezas Fáciles , 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 del original (PDF) el 1 de noviembre de 2012.En un artículo de Michael T. Alexander titulado " Temas avanzados en programación de sistemas" , publicado en la Conferencia de Verano de Ingeniería de la Universidad de Michigan de 1970 (revisado en mayo de 1971), se comparan los enfoques de planificación y asignación de recursos, incluyendo 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 de Linux .
  • El nacimiento del núcleo de Linux : debate en la 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).