Я просматривал статью, в которой объяснялась процедура гибернации в Microsoft Windows. Основные моменты, которые я получаю из этого:
- Windows сбрасывает в память всю оперативную память (возможно, после ее обработки)
hiberfil.sys
. - Во время загрузки файл гибернации читается, а содержимое загружается в ОЗУ.
Мой вопрос: когда я обычно копирую файл размером, скажем, 1 ГБ, это занимает около 2 минут .
Однако, когда Windows пишет файл гибернации (во время процедуры гибернации), весь процесс занимает, возможно, 10-15 секунд. Почему такая разница в скорости записи?
Объем моей оперативной памяти составляет 4 ГБ. (Я не говорю о технологии быстрой загрузки.)
тесты:
- Копирование файла 1 ГБ с диска 1 на диск 2 (внешний): 2,3 минуты.
- Спящий режим системы: 15 секунд.
fsutil
.Ответы:
Это, вероятно, тройной ответ.
Одна вещь, которая может быть здесь задействована, - это новое гибридное отключение в Windows, которое эффективно закрывает ваши приложения, выходит из системы, а затем переходит в спящий режим ядра операционной системы. Сохранение этих данных будет означать, что им не нужно «перевоспитывать» их потенциально.
Во-вторых, гибернация не требует сохранения страниц памяти, которые либо выгружаются в файл подкачки, либо не используются (это может быть одной из причин агрессивного заполнения файла подкачки и сохранения данных в памяти). ,
В-третьих, данные файла гибернации также сжимаются . Объедините это с моим вторым замечанием, и если у вас есть только небольшой набор данных для экспорта, который содержит данные с высокой степенью сжатия (исполняемые файлы обычно хорошо сжимаются), тогда объем данных для вывода в файл гибернации может быть существенно меньше, чем рабочий набор данных. Обратите внимание, что, как указано в комментариях, файловые кэши и другие ненужные данные буфера могут быть легко отброшены без какого-либо вредного воздействия, чтобы уменьшить объем данных, которые будут выгружены в файл гибернации.
Кроме того, современные жесткие диски довольно быстрые. С диска с устойчивой записью порядка 100 МБ / с вы сможете записать (без сжатия) 4 ГБ ОЗУ менее чем за одну минуту. Поскольку гибернация может выполняться как последняя вещь после приостановки всех пользовательских процессов и перед приостановкой ЦП, ОС обычно будет иметь полную скорость записи на диск. Это одна вещь, которой не будет у вашего простого теста, и копирование с диска на диск будет потенциально медленнее, чем просто запись ОЗУ на диск.
Объедините эти вещи, и объем данных, которые будут записаны в файл гибернации, может быть довольно небольшим, потенциально порядка 1 ГБ, и, вероятно, будет записан в один большой непрерывный блок менее чем за 10 секунд.
источник
Во-первых, объем оперативной памяти, который необходимо сохранить, удивительно мал. Фактически, необходимо очищать только набор отображенных грязных страниц («отложенная обратная запись»), а также записывать все частные страницы, которые были записаны и перемещены в исполняемый код.
Во-вторых, в отличие от копирования файла, сброс набора страниц ОЗУ, которые необходимо сохранить на диске, представляет собой одну последовательную непрерывную запись с точки зрения накопителя. Win32 API даже предоставляет функцию пользовательского уровня для этой самой операции. Запись сбора напрямую поддерживается аппаратным обеспечением и работает так же быстро, как диск физически способен принимать данные (контроллер будет напрямую извлекать данные через DMA).
Для этого есть ряд предварительных условий (например, выравнивание, размер блока, закрепление), и он плохо работает с кэшированием, и не существует такой вещи, как «отложенная обратная запись» (что является очень желательной оптимизацией при нормальной работе). ).
Вот почему не каждый пишетработает так все время. Однако, когда система сохраняет файл гибернации, все предварительные условия автоматически выполняются (все данные выровнены по размеру страницы, по размеру страницы и закреплены), и кэширование просто перестало иметь значение, потому что компьютер будет отключен через мгновение.
В-третьих, выполнение одной непрерывной записи очень удобно как для вращающихся дисков, так и для твердотельных дисков.
Файл подкачки и файл гибернации обычно являются одними из самых ранних файлов, созданных и зарезервированных на диске. У них обычно один, максимум два фрагмента. Таким образом, если сектора не повреждены и диск не должен перераспределять физические сектора, логическая последовательная запись преобразуется в физическую последовательную запись на вращающемся диске.
При записи большого количества последовательных непрерывных данных на диске не требуется никаких операций чтения-изменения-записи. Эта проблема менее выражена на вращающихся жестких дисках, которые могут записывать отдельные сектора, которые достаточно малы (при условии, что вы не пишете отдельные байты, что обычно предотвращает кэширование, устройству не нужно извлекать исходное содержимое и записывать измененную версию.) ,
Это, однако, очень заметно на SSD, где каждая запись означает, что, например, блок 512 КБ (это обычное число, но оно может быть больше) должен быть прочитан и изменен контроллером и записан обратно в другой блок. Хотя в принципе можно написать (но не перезаписать) меньшие блоки на флеш-дисках, вы можете стирать только огромные блоки, так работает аппаратная часть. Это причина того, почему твердотельные накопители намного лучше справляются с огромной последовательной записью.
источник
Он не сбрасывает всю оперативную память в спящем режиме.
У него уже будет большая часть ОЗУ, уже дублированная на диске. Это не только позволяет быстро переходить в спящий режим, но и позволяет быстро выделять память для новых программ (чтобы они могли быстро запускаться).
Поэтому нужно всего лишь написать небольшую часть 4 ГБ, и это можно сделать за 10-15 с.
От Microsoft :
источник
В дополнение ко всему вышесказанному, я думаю, есть несколько других факторов.
Одним из них является то, что при копировании файла, файл должен быть прочитан и записан; Hybernation требует только файл для записи. Это по определению уже в памяти!
Точно связанный с этим, при чтении файла и одновременной его записи для экономии памяти процесс выглядит следующим образом: чтение фрагмента, запись фрагмента, обновление каталога (отображение нового размера); читать чанк, писать чанк, обновлять каталог.
Каждый раз, когда вы перемещаетесь с одной части диска на другую (например, читаете файл a, чтобы записать файл b, пишите файл b, чтобы записать каталог, и пишите каталог, чтобы прочитать следующий фрагмент), который должен искать диск - перемещайте головки, позвольте головкам успокоиться, дождитесь появления правой части диска. Это одно из преимуществ твердотельного диска - поиск занимает совсем немного времени. При переходе в спящий режим данные записываются непрерывно. Файл гибернации (подкачки) предварительно выделяется, поэтому каталог не нужно обновлять (вы не меняете размер файла гибернации, а только его содержимое).
И, наконец, ваш компьютер приостановил все остальные задачи - это ЕДИНСТВЕННАЯ вещь, которую он делает (я сомневаюсь, что это будет иметь большое значение, но он обязательно сделает некоторые!). Даже такие вещи, как управление памятью и переключение задач приостановлены.
источник
Вероятно, это связано с тем, что ОЗУ имеет гораздо более высокую скорость ввода / вывода, чем жесткий диск, поэтому ОЗУ может выводить содержимое в нем так быстро, как может читать жесткий диск.
При копировании файлов вы также ограничены различными факторами - скорость диска, если он должен считывать и выводить на один и тот же диск, это займет больше времени, ограниченная скорость соединения (если к внешнему диску), проверка его ничего не перезаписывает и т.д.
источник
dd if=/dev/zero of=/tmp/output.img bs=8k count=256k
и получить1862606848 bytes (1.9 GB) copied, 1.81605 s, 1.0 GB/s
, так что это кажется возможным (я добавлю, что копирование файлов в Windows в любом случае занимает слишком много времени).