Primero, la cantidad de RAM que debe guardarse es sorprendentemente pequeña. De hecho, solo el conjunto de páginas sucias mapeadas ("reescritura diferida") debe vaciarse, así como también deben escribirse todas las páginas privadas que se han escrito y se ha reubicado el código ejecutable.
- Los segmentos .text de ejecutables siempre están respaldados por la asignación de archivos. Eso también es cierto para al menos algunas DLL (pero no todas, depende de si necesitan ser reubicadas).
- La memoria que está respaldada de manera similar por las asignaciones de archivos se puede descartar (se presume que no es CoW o RW y está sucia).
- Todavía tendrá que producirse una diferida diferida, pero aparte de eso, los cachés se pueden descartar.
- La memoria que se ha asignado pero que no se ha escrito (por lo general, la mayor parte de los datos de la aplicación) está respaldada por la página cero y puede descartarse.
- La mayor parte de las páginas de memoria que están en estado "en espera" (el conjunto de trabajo residente real por proceso en Windows es sorprendentemente pequeño, solo 16 MB) se habrá copiado en el archivo de la página en segundo plano en algún momento y se puede descartar. .
- Es posible que no sea necesario guardar las regiones de memoria asignadas por ciertos dispositivos, como la tarjeta gráfica. Los usuarios a veces se sorprenden de que conectan 8GiB o 16GiB a una computadora, y 1GiB o 2GiB simplemente se han "ido" sin razón aparente. Las principales API de gráficos requieren que las aplicaciones sean capaces de invalidar el contenido del búfer "en algunas condiciones" (sin decir exactamente qué significa esto). Por lo tanto, no es irrazonable esperar que la memoria anclada por el controlador de gráficos también se descarte también. La pantalla se va a apagar de todos modos, después de todo.
En segundo lugar, al contrario que usted copia un archivo, deshacerse del conjunto de páginas RAM que deben guardarse en el disco es una sola escritura secuencial y contigua desde el punto de vista de la unidad. La API Win32 incluso expone una función de nivel de usuario para esta misma operación. Gather write es directamente compatible con el hardware y funciona tan rápido como el disco es físicamente capaz de aceptar datos (el controlador extraerá los datos directamente a través de DMA).
Hay una serie de condiciones previas para que esto funcione (como la alineación, el tamaño del bloque, la fijación), y no funciona bien con el almacenamiento en caché y no existe la "reescritura diferida" (que es una optimización muy deseable en funcionamiento normal )
Esa es la razón por la cual no todos escribenfunciona así todo el tiempo. Sin embargo, cuando el sistema guarda el archivo de hibernación, se cumplen automáticamente todas las condiciones previas (todos los datos están alineados, del tamaño de la página y anclados) y el almacenamiento en caché se ha vuelto irrelevante porque la computadora se apagará en un momento.
Tercero, hacer una sola escritura contigua es muy favorable tanto para discos giratorios como para discos de estado sólido.
El archivo de intercambio y el archivo de hibernación suelen ser algunos de los primeros archivos creados y reservados en el disco. Suelen tener uno, como máximo dos fragmentos. Por lo tanto, a menos que los sectores estén dañados y el disco tenga que reasignar sectores físicos, una escritura secuencial lógica se traduce en una escritura secuencial física en un disco giratorio.
No se necesitan operaciones de lectura-modificación-escritura en el disco cuando se escribe una gran cantidad de datos contiguos y secuenciales. Este problema es menos pronunciado en discos duros giratorios que pueden escribir sectores individuales que son bastante pequeños (siempre que no escriba bytes individuales, lo que generalmente impide el almacenamiento en caché, el dispositivo no necesita recuperar el contenido original y volver a escribir la versión modificada). .
Esto es, sin embargo, algo que es muy notable en SSD donde cada escritura significa que, por ejemplo, un bloque de 512kB (que es un número habitual, pero podría ser más grande) tiene que ser leído y modificado por el controlador, y escrito de nuevo en otro bloquear. Si bien en principio puedes escribir (pero no sobrescribir)) unidades más pequeñas en discos flash, solo puede borrar grandes bloques, así es como funciona el hardware. Esta es la razón por la cual los SSD funcionan mucho mejor en grandes escrituras secuenciales.