Je passais en revue un article expliquant la procédure de mise en veille prolongée sous Microsoft Windows. Les principaux points que j'en tire sont
- Windows vide la totalité de la RAM (après l'avoir traitée) dans le
hiberfil.sys
fichier. - Lors du démarrage, le fichier d'hibernation est lu et le contenu est chargé dans la RAM.
Ma question est quand je copie habituellement un fichier de taille, disons, 1 Go, cela prend environ 2 minutes à compléter.
Toutefois, lorsque Windows écrit le fichier d'hibernation (au cours de la procédure d'hibernation), le processus complet prend environ 10 à 15 secondes. Pourquoi cette vitesse d'écriture est-elle si différente?
Ma taille de RAM est de 4 Go. (Je ne parle pas de technologie de démarrage rapide.)
Benchmarks:
- Copie d'un fichier de 1 Go d'un disque 1 à l'autre (externe): 2,3 minutes.
- Veille prolongée du système: 15 secondes.
fsutil
.Réponses:
C'est probablement une triple réponse.
Le nouvel arrêt hybride de Windows, qui ferme efficacement vos applications, vous déconnecte, puis met en veille prolongée le noyau du système d’exploitation, fait partie des choses à jouer. Avoir déjà ces données sauvegardées signifierait qu'il n'est pas nécessaire de les "hiberner" potentiellement.
Deuxièmement, l'hibernation n'aurait pas besoin de sauvegarder les pages de mémoire qui sont transférées dans le fichier d'échange ou qui ne sont pas utilisées (ce serait une raison pour remplir le fichier d'échange de manière agressive et conserver également les données en mémoire). .
Le troisième serait que les données du fichier d'hibernation sont également compressées . Combinez cela avec mon deuxième point et si vous n'avez qu'un petit ensemble de données à exporter qui contient des données hautement compressibles (les exécutables sont généralement bien compressés), la quantité de données à envoyer au fichier d'hibernation peut être considérablement plus petite que le jeu de travail. de données. Notez que, comme indiqué dans les commentaires, les caches de fichiers et autres données de tampon inutiles peuvent facilement être supprimés sans effet néfaste, ce qui permet de réduire la quantité de données à dumper dans le fichier de veille prolongée.
De plus, les disques durs actuels sont assez rapides. Avec un disque ayant une écriture soutenue de l’ordre de 100 Mo / s, vous seriez en mesure d’écrire (non compressé) 4 Go de RAM en moins d’une minute. Comme l'hibernation peut être effectuée en dernier lieu après la suspension de tous les processus utilisateur et avant la suspension du processeur, le système d'exploitation aura généralement la vitesse d'écriture maximale du disque. C'est une chose que votre simple test n'aura pas, et copier d'un disque à un disque risque d'être plus lent que d'écrire de la RAM sur un disque.
Combinez ces éléments et la quantité de données à écrire dans le fichier d'hibernation pourrait être assez petite, potentiellement de l'ordre de 1 Go, et serait probablement écrite dans un grand bloc continu en moins de 10 secondes.
la source
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.
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.
la source
Il ne vide pas la totalité de la RAM au moment de la mise en veille prolongée.
Une grande partie de la RAM sera déjà dupliquée sur le disque. Cela permet non seulement une mise en veille prolongée rapide, mais également une mémoire rapidement disponible pour les nouveaux programmes (afin qu'ils puissent être lancés rapidement).
Par conséquent, il suffit d'écrire une petite fraction des 4 Go, ce qui peut être fait en 10-15 secondes.
De Microsoft :
la source
En plus de tout ce qui précède, je pense qu'il y a quelques autres facteurs en jeu.
La première est que, lors de la copie d’un fichier, celui-ci doit être lu et écrit; hybernation exige seulement que le fichier soit écrit. C'est, par définition, déjà en mémoire!
De manière étroitement liée à cela, lors de la lecture et de l’écriture simultanées d’un fichier, le processus consiste à économiser de la mémoire: lire un morceau, écrire un morceau, mettre à jour le répertoire (pour afficher la nouvelle taille); lire un morceau, écrire un morceau, mettre à jour le répertoire.
Chaque fois que vous passez d'une partie du disque à une autre (par exemple, lisez le fichier a pour écrire le fichier b, écrivez le fichier b pour écrire le répertoire et écrivez le répertoire pour lire le bloc suivant), le disque doit chercher - déplacer les têtes, laissez les têtes s'installer, attendez que la partie droite du disque passe. C'est l'un des avantages d'un disque SSD: la recherche ne prend pas de temps. En mode hibernation, les données sont écrites de bout en bout. Le fichier d'hibernation (swap) est pré-alloué, il n'est donc pas nécessaire de mettre à jour le répertoire (vous ne modifiez pas la taille du fichier d'hibernation, mais uniquement son contenu).
Et enfin, votre ordinateur a suspendu toutes les autres tâches - c’est la SEULE chose qu’il fait (je doute que cela fasse une grande différence, mais cela en fera forcément!). Même des éléments tels que la gestion de la mémoire et le changement de tâche sont suspendus.
la source
Ceci est probablement dû au fait que les vitesses d’entrée / sortie de la RAM sont beaucoup plus rapides que celles du disque dur, de sorte que la RAM peut produire les données aussi rapidement que le disque dur peut les lire.
Lors de la copie de fichiers, vous êtes également limité par divers facteurs - la vitesse du disque, si elle doit être lue et relue sur le même disque, cela prendra plus de temps, la vitesse limitée de la connexion (sur un lecteur externe), vérifiée n'écrase rien, etc.
la source
dd if=/dev/zero of=/tmp/output.img bs=8k count=256k
et obtenir1862606848 bytes (1.9 GB) copied, 1.81605 s, 1.0 GB/s
, de sorte que cela semble être possible (je vais ajouter que la copie de fichiers Windows semble prendre inutilement longtemps de toute façon).