Premièrement, la quantité de RAM à sauvegarder est étonnamment petite. En fait, seuls les ensembles de pages modifiées mappées ("écriture différée") doivent être vidés, de même que toutes les pages privées écrites et le code exécutable déplacé doivent être écrites.
- Les segments .text des exécutables sont toujours sauvegardés par un mappage de fichier. Cela est également vrai pour au moins certaines DLL (mais pas toutes, cela dépend si elles doivent être déplacées).
- La mémoire qui est pareillement sauvegardée par des mappages de fichiers peut être supprimée (on présume que ce n'est ni CoW ni RW et sale).
- L'écriture différée doit encore se produire, mais à part cela, les caches peuvent être supprimés.
- La mémoire allouée mais non écrite (généralement la plus grande partie des données de l'application!) Est sauvegardée par la page zéro et peut être supprimée.
- La plus grande partie des pages de mémoire en état de veille (le jeu de travail de résident réel par processus sous Windows est étonnamment petite, 16 Mo seulement) aura été copiée dans le fichier de page en arrière-plan à un moment donné et peut être ignorée .
- Les régions de mémoire mappées par certains périphériques tels que la carte graphique peuvent (éventuellement) ne pas avoir besoin d'être sauvegardées. Les utilisateurs sont parfois surpris d’avoir branché 8GiB ou 16GiB à un ordinateur, et 1GiB ou 2GiB sont simplement "partis" sans raison apparente. Les principales API graphiques exigent que les applications puissent annuler le contenu de la mémoire tampon "dans certaines conditions" (sans préciser ce que cela signifie). Il n’est donc pas déraisonnable de s’attendre à ce que la mémoire bloquée par le pilote graphique soit également supprimée. De toute façon, l’écran va s’éteindre, après tout.
Deuxièmement, contrairement à ce que vous copiez un fichier, le vidage de l'ensemble des pages RAM devant être sauvegardées sur le disque constitue une écriture séquentielle unique et contiguë du point de vue du lecteur. L'API Win32 expose même une fonction de niveau utilisateur pour cette opération même. La collecte d'écriture est directement prise en charge par le matériel et fonctionne aussi rapidement que le disque est physiquement capable d'accepter des données (le contrôleur extraira directement les données via DMA).
Il existe un certain nombre de conditions préalables pour que cela fonctionne (telles que l'alignement, la taille de bloc, l'épinglage), et cela ne fonctionne pas bien avec la mise en cache et il n'y a pas de "réécriture différée" (qui est une optimisation très souhaitable en fonctionnement normal ).
C’est la raison pour laquelle chaque écriture n’est pasfonctionne comme ça tout le temps. Cependant, lorsque le système enregistre le fichier d'hibernation, toutes les conditions préalables sont automatiquement remplies (toutes les données sont alignées, redimensionnées et épinglées) et la mise en cache devient inutile car l'ordinateur va s'éteindre dans un instant.
Troisièmement, faire une seule écriture contiguë est très favorable à la fois pour les disques tournants et pour les disques à l'état solide.
Le fichier d'échange et le fichier d'hibernation sont généralement des fichiers parmi les plus anciens créés et réservés sur le disque. Ils en ont généralement un, au plus deux fragments. Ainsi, sauf si des secteurs sont endommagés et que le disque doit réaffecter des secteurs physiques, une écriture séquentielle logique se traduit en une écriture physique séquentielle sur un disque en rotation.
Aucune opération de lecture-modification-écriture n'est nécessaire sur le disque lorsqu'une très grande quantité de données séquentielles contiguës est en cours d'écriture. Ce problème est moins prononcé sur les disques durs en rotation qui peuvent écrire des secteurs simples qui sont assez petits (à condition que vous n'écriviez pas des octets, ce que la mise en cache empêche généralement, le périphérique n'a pas besoin d'extraire le contenu d'origine ni de réécrire la version modifiée.) .
C’est cependant quelque chose qui est très visible sur les disques SSD où chaque écriture signifie par exemple qu’un bloc de 512 Ko (un nombre habituel, mais il peut être plus grand) doit être lu et modifié par le contrôleur, puis réécrit vers un autre bloquer. Vous pouvez en principe écrire sur (mais pas écraser).) des unités plus petites sur des disques flash, vous ne pouvez jamais effacer d’énormes blocs, c’est la façon dont le matériel fonctionne. C'est la raison pour laquelle les disques SSD se débrouillent tellement mieux sur les énormes écritures séquentielles.