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.
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.
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, [ dudoso – discutir ] 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.
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 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 ]
This section needs additional citations for verification. (December 2010) |
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]
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.
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:
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.
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:
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()
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 ]
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.
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]
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.
{{cite web}}
: CS1 maint: unfit URL (link){{cite book}}
: |website=
ignorado ( ayuda )