Tout d'abord, la quantité de RAM qui doit être sauvegardée est étonnamment faible. En fait, seul l'ensemble des pages sales mappées ("lazy writeback") doit être vidé, ainsi que toutes les pages privées sur lesquelles on a écrit et le code exécutable relocalisé.
- Les segments .text des exécutables sont toujours soutenus par le mappage des fichiers. C'est également vrai pour au moins un peu de DLL (mais pas toutes, cela dépend si elles doivent être déplacées).
- La mémoire qui est également soutenue par des mappages de fichiers peut être éliminée (en supposant qu'il ne s'agit pas de CoW ou de RW). y sale).
- Une réécriture paresseuse devra toujours avoir lieu, mais à part cela, les caches peuvent être éliminés.
- La mémoire qui a été allouée mais n'a pas été écrite (généralement la plus grande partie des données de l'application !) est soutenue par la page zéro et peut être mise au rebut.
- La plus grande partie des pages de mémoire qui sont en état de "veille" (l'ensemble de travail résident réel par processus sous Windows est étonnamment petit, à peine 16MB) aura été copié sur le fichier de page en arrière-plan à un moment donné et pourra être supprimé.
- Les régions de la mémoire qui sont 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 de constater qu'ils branchent 8 Go ou 16 Go dans un ordinateur et que 1 Go ou 2 Go ont disparu sans raison apparente. Les principales API graphiques exigent que les applications puissent accepter que le contenu des tampons devienne invalide "dans certaines conditions" (sans dire exactement ce que cela signifie). Il n'est donc pas déraisonnable de s'attendre à ce que la mémoire qui est épinglée par le pilote graphique soit simplement jetée, elle aussi. L'écran va s'éteindre de toute façon, après tout.
Deuxièmement, contrairement à la copie d'un fichier, le vidage de l'ensemble des pages de RAM qui doivent être sauvegardées sur le disque est une seule écriture séquentielle et contiguë du point de vue du lecteur. L'API Win32 expose même une fonction fonction de niveau utilisateur pour cette même opération. L'écriture groupée est directement prise en charge par le matériel et fonctionne aussi vite que le disque est physiquement capable d'accepter des données (le contrôleur tirera directement les données via DMA).
Il y a un certain nombre de conditions préalables pour que cela fonctionne (comme l'alignement, la taille du bloc, l'épinglage), et cela ne joue pas bien avec la mise en cache et il n'y a pas de chose telle que le "lazy writeback" (qui est une optimisation très souhaitable en fonctionnement normal).
C'est la raison pour laquelle pas tous les écrits travaille 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 sur une page, de la taille d'une page et épinglées) et la mise en cache n'est plus pertinente car l'ordinateur va être éteint dans un instant.
Troisièmement, faire une seule écriture contiguë est très favorable tant pour les disques rotatifs que pour les disques à semi-conducteurs.
Le fichier d'échange et le fichier d'hibernation sont généralement parmi les premiers fichiers créés et réservés sur le disque. Ils ont généralement un, au plus deux fragments. Ainsi, à moins que les secteurs ne soient endommagés et que le disque doive réallouer des secteurs physiques, un logique L'écriture séquentielle se traduit par une physique écriture séquentielle sur un disque en rotation.
Aucune opération de lecture-modification-écriture n'est nécessaire sur le disque lorsqu'une énorme quantité de données séquentielles et contiguës est écrite. Ce problème est moins prononcé sur les disques durs rotatifs qui peuvent écrire des secteurs uniques assez petits (à condition de ne pas écrire des octets uniques, ce que la mise en cache empêche généralement, le périphérique n'a pas besoin de récupérer le contenu original et de réécrire la version modifiée).
Il s'agit toutefois d'un élément qui est très perceptible sur un SSD où chaque écriture signifie que, par exemple, un bloc de 512 Ko (c'est un nombre habituel, mais il pourrait être plus grand) doit être lu et modifié par le contrôleur, puis réécrit dans un bloc différent. Alors que vous pouvez en principe écrire sur (mais pas sur écraser ) des unités plus petites sur les disques flash, vous ne pouvez jamais effacer que de gros blocs, c'est ainsi que le matériel fonctionne. C'est la raison pour laquelle les disques SSD sont tellement plus performants sur les écritures séquentielles énormes.