Estaba leyendo un artículo que explicaba el procedimiento de hibernación en Microsoft Windows. Los puntos principales que saco de él son
- Windows volca toda la RAM (después de procesarla quizás) en el
hiberfil.sys
archivo. - Durante el arranque, se lee el archivo de hibernación y los contenidos se cargan en la RAM.
Mi pregunta es cuando generalmente estoy copiando un archivo de tamaño, digamos, 1 GB, tarda unos 2 minutos en completarse.
Sin embargo, cuando Windows está escribiendo el archivo de hibernación (durante el procedimiento de hibernación), todo el proceso demora entre 10 y 15 segundos. ¿Por qué hay tanta diferencia en la velocidad de escritura?
Mi tamaño de RAM es de 4 GB. (No estoy hablando de la tecnología de arranque rápido).
Puntos de referencia:
- Copiando un archivo de 1 GB del Disco 1 al Disco 2 (externo): 2.3 minutos.
- Hibernando el sistema: 15 segundos.
fsutil
.Respuestas:
Esta es probablemente una respuesta triple.
Una cosa que puede estar en juego aquí es el nuevo apagado híbrido en Windows que cierra efectivamente sus aplicaciones, cierra la sesión y luego procede a hibernar el núcleo del sistema operativo. Tener estos datos guardados significaría que no es necesario "volver a hibernarlos" potencialmente.
La segunda cosa sería que la hibernación no necesitaría guardar páginas de memoria que están paginadas en el archivo de intercambio o que no están en uso (esta sería una razón para llenar agresivamente el archivo de intercambio y mantener los datos en la memoria también) .
El tercero sería que los datos del archivo de hibernación también están comprimidos . Combine eso con mi segundo punto y si solo tiene un pequeño conjunto de datos para exportar que contiene datos altamente comprimibles (los ejecutables generalmente se comprimen bien), entonces la cantidad de datos que salen al archivo de hibernación puede ser sustancialmente menor que el conjunto de trabajo de datos. Tenga en cuenta que, como se indica en los comentarios, las memorias caché de archivos y otros datos de búfer innecesarios podrían descartarse fácilmente sin efectos nocivos para reducir la cantidad de datos que se volcarán en el archivo de hibernación.
Además, los discos duros actuales son bastante rápidos. Con un disco que tiene una escritura sostenida del orden de 100 MB / s, podría escribir (sin comprimir) 4 GB de RAM en menos de un minuto. Como la hibernación se puede hacer como lo último después de suspender todos los procesos del usuario y antes de suspender la CPU, el sistema operativo generalmente tendrá la velocidad de escritura completa del disco. Esto es algo que no tendrá su punto de referencia simple, y la copia de un disco a otro será potencialmente más lenta que simplemente escribir RAM en el disco.
Combine estas cosas y la cantidad de datos que se escribirán en el archivo de hibernación podría ser bastante pequeña, potencialmente del orden de 1 GB y probablemente se escribiría en un bloque continuo grande en menos de 10 segundos.
fuente
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.
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.
fuente
No descarga toda la RAM en el momento de hibernación.
Ya tendrá una gran parte de la RAM ya duplicada en el disco. Esto no solo permite que la hibernación suceda rápidamente, sino que también permite que la memoria esté disponible rápidamente para nuevos programas (para que puedan iniciarse rápidamente).
Por lo tanto, solo tiene que escribir una pequeña fracción de los 4 GB y eso se puede hacer en 10-15s.
De microsoft :
fuente
Además de todo lo anterior, creo que hay algunos otros factores en juego.
Una es que, al copiar un archivo, el archivo debe leerse y escribirse; la hibernación solo requiere que se escriba el archivo. ¡Está, por definición, ya en la memoria!
Estrechamente relacionado con esto, al leer un archivo y escribirlo al mismo tiempo, para ahorrar memoria, el proceso es: leer un fragmento, escribir un fragmento, actualizar el directorio (para mostrar el nuevo tamaño); leer un fragmento, escribir un fragmento, actualizar el directorio.
Cada vez que se mueve de una parte del disco a otra (por ejemplo, leer el archivo a para escribir el archivo b, escribir el archivo b para escribir el directorio y escribir el directorio para leer el siguiente fragmento) el disco tiene que buscar: mover las cabezas, permita que las cabezas se asienten, espere a que pase la parte correcta del disco. Esta es una de las ventajas de un disco de estado sólido: la búsqueda no lleva tiempo. Al hibernar, los datos se escriben de extremo a extremo. El archivo de hibernación (intercambio) está preasignado, por lo que no es necesario actualizar el directorio (no está cambiando el tamaño del archivo de hibernación, solo el contenido).
Y finalmente, su computadora ha suspendido todas las demás tareas: esto es lo ÚNICO que está haciendo (dudo que esto haga mucha diferencia, ¡pero seguramente hará algunas!). Incluso cosas como la administración de memoria y el cambio de tareas están suspendidas.
fuente
Probablemente esto se deba a que la RAM tiene velocidades de entrada / salida mucho más rápidas que el disco duro, por lo que la RAM puede emitir el contenido tan rápido como el disco duro puede leer.
Al copiar archivos, también está limitado por varios factores: la velocidad del disco, si tiene que leer dentro y fuera del mismo disco, llevará más tiempo, la velocidad limitada de la conexión (si se trata de una unidad externa), verificándolo no está sobrescribiendo nada, etc.
fuente
dd if=/dev/zero of=/tmp/output.img bs=8k count=256k
y obtener1862606848 bytes (1.9 GB) copied, 1.81605 s, 1.0 GB/s
, por lo que parece posible (agregaré que Windows copiar archivos parece demorar innecesariamente de todos modos).