64

Я просматривал статью, в которой объяснялась процедура гибернации в Microsoft Windows. Основные моменты, которые я получаю из этого:

  1. Windows сбрасывает всю оперативную память (возможно, после ее обработки) в файл hiberfil.sys .
  2. Во время загрузки файл гибернации читается, а содержимое загружается в ОЗУ.

У меня вопрос, когда я обычно копирую файл размером, скажем, 1 ГБ, это занимает около 2 минут .

Однако, когда Windows пишет файл гибернации (во время процедуры гибернации), весь процесс занимает, возможно, 10-15 секунд. Почему такая разница в скорости записи?

Объем моей оперативной памяти составляет 4 ГБ. (Я не говорю о технологии быстрой загрузки.)

тесты:

  1. Копирование файла 1 ГБ с диска 1 на диск 2 (внешний): 2,3 минуты.
  2. Спящий режим системы: 15 секунд.

5 ответов5

45

Это, вероятно, тройной ответ.

Одна вещь, которая может быть здесь задействована, - это новое гибридное отключение в Windows, которое эффективно закрывает ваши приложения, выходит из системы и затем переходит в спящий режим ядра операционной системы. Сохранение этих данных будет означать, что им не нужно «перевоспитывать» их потенциально.

Во-вторых, гибернация не должна сохранять страницы памяти, которые либо выгружаются в файл подкачки, либо не используются (это может быть одной из причин агрессивного заполнения файла подкачки и сохранения данных в памяти). ,

В-третьих, данные файла гибернации также сжимаются. Объедините это с моим вторым замечанием, и если у вас есть только небольшой набор данных для экспорта, который содержит данные с высокой степенью сжатия (исполняемые файлы обычно хорошо сжимаются), то объем данных для вывода в файл гибернации может быть существенно меньше, чем рабочий набор данных. Обратите внимание, что, как указано в комментариях, файловые кэши и другие ненужные данные буфера могут быть легко отброшены без какого-либо вредного воздействия, чтобы уменьшить объем данных, которые будут выгружаться в файл гибернации.

Кроме того, современные жесткие диски довольно быстрые. С диска с устойчивой записью порядка 100 МБ / с вы сможете записать (без сжатия) 4 ГБ ОЗУ менее чем за одну минуту. Поскольку гибернация может выполняться как последняя вещь после приостановки всех пользовательских процессов и до приостановки ЦП, ОС обычно будет иметь полную скорость записи на диск. Это одна вещь, которой не будет у вашего простого теста, и копирование с диска на диск будет потенциально медленнее, чем просто запись ОЗУ на диск.

Объедините эти вещи, и объем данных, которые будут записаны в файл гибернации, может быть довольно небольшим, потенциально порядка 1 ГБ, и, вероятно, будет записан в один большой непрерывный блок менее чем за 10 секунд.

31

Во-первых, объем оперативной памяти, который необходимо сохранить, удивительно мал. Фактически, необходимо очищать только набор отображенных грязных страниц ("отложенная обратная запись"), а также записывать все частные страницы, которые были записаны и перемещены в исполняемый код.

  • Сегменты .text исполняемых файлов всегда поддерживаются сопоставлением файлов. Это также верно по крайней мере для некоторых библиотек DLL (но не для всех, зависит от того, нужно ли их перемещать).
  • Память, которая аналогичным образом поддерживается файловыми сопоставлениями, может быть отброшена (предполагается, что она не CoW или RW и не загрязнена).
  • Ленивая обратная запись все еще должна произойти, но кроме этого, кэши могут быть отброшены.
  • Память, которая была выделена, но не была записана (обычно большая часть данных приложения!) поддерживается нулевой страницей и может быть отброшен.
  • Большая часть страниц памяти, которые находятся в состоянии "ожидания" (фактический резидентный рабочий набор для Windows удивительно мал, всего 16 МБ), будет скопирована в файл страницы в фоновом режиме и может быть отброшена ,
  • Области памяти, отображаемые определенными устройствами, такими как графическая карта, могут (возможно) не должны быть сохранены. Иногда пользователи удивляются, что они подключают 8GiB или 16GiB к компьютеру, а 1GiB или 2GiB просто "пропали" без видимой причины. Основные графические API-интерфейсы требуют, чтобы приложения могли с недействительным содержимым буфера "при определенных условиях" (не говоря точно, что это значит). Таким образом, не исключено, что память, закрепленная графическим драйвером, также просто отбрасывается. В конце концов, экран все равно погаснет.

Во-вторых, вопреки копированию файла выгрузка набора страниц ОЗУ, которые необходимо сохранить на диске, представляет собой одну последовательную непрерывную запись с точки зрения накопителя. Win32 API даже предоставляет функцию пользовательского уровня для этой самой операции. Запись сбора напрямую поддерживается аппаратными средствами и работает так же быстро, как диск физически способен принимать данные (контроллер будет напрямую извлекать данные через DMA).
Для этого есть ряд предварительных условий (например, выравнивание, размер блока, закрепление), и он плохо работает с кэшированием, и не существует такой вещи, как "отложенная обратная запись" (что является очень желательной оптимизацией при нормальной работе). ).
Вот почему не каждая запись работает так постоянно. Однако, когда система сохраняет файл гибернации, все предварительные условия автоматически выполняются (все данные выровнены по размеру страницы, по размеру страницы и закреплены), и кэширование просто перестало иметь значение, потому что компьютер будет отключен через мгновение.

В-третьих, выполнение одной непрерывной записи очень удобно как для вращающихся дисков, так и для твердотельных дисков.

Файл подкачки и файл гибернации обычно являются одними из самых ранних файлов, созданных и зарезервированных на диске. Они обычно имеют один, максимум два фрагмента. Таким образом, если сектора не повреждены и диск не должен перераспределять физические сектора, логическая последовательная запись преобразуется в физическую последовательную запись на вращающемся диске.

При записи большого количества последовательных непрерывных данных на диске не требуется никаких операций чтения-изменения-записи. Эта проблема менее выражена на вращающихся жестких дисках, которые могут записывать отдельные сектора, которые достаточно малы (при условии, что вы не пишете отдельные байты, что обычно предотвращает кэширование, устройству не нужно извлекать исходное содержимое и записывать измененную версию.) ,
Это, однако, очень заметно на SSD, где каждая запись означает, что, например, блок 512 КБ (это обычное число, но оно может быть больше) должен быть прочитан и изменен контроллером и записан обратно в другой блок. Хотя в принципе вы можете записывать (но не перезаписывать) меньшие блоки на флэш-дисках, вы можете стирать только огромные блоки, но именно так работает оборудование. Это причина того, почему твердотельные накопители намного лучше справляются с огромными последовательными записями.

10

Он не сбрасывает всю оперативную память в спящем режиме.

У него уже будет большая часть ОЗУ, уже дублированная на диске. Это не только позволяет быстро переходить в режим гибернации, но и позволяет быстро выделять память для новых программ (чтобы они могли быстро запускаться).

Поэтому нужно только написать небольшую часть 4 ГБ, и это можно сделать за 10-15 с.

От Microsoft:

Когда ОЗУ не хватает (например, зафиксированных байтов больше, чем установленной ОЗУ), операционная система будет пытаться сохранить определенную часть установленной ОЗУ доступной для немедленного использования путем копирования страниц виртуальной памяти, которые не используются активно, в файл подкачки , Следовательно, этот счетчик не достигнет нуля и не обязательно является хорошим показателем того, что вашей системе не хватает оперативной памяти.

2

В дополнение ко всему вышесказанному, я думаю, есть несколько других факторов.

Одним из них является то, что при копировании файла, файл должен быть прочитан и записан; Hybernation требует только файл для записи. Это по определению уже в памяти!

Точно связанный с этим, при чтении и одновременной записи файла для экономии памяти процесс выглядит следующим образом: чтение фрагмента, запись фрагмента, обновление каталога (отображение нового размера); читать чанк, писать чанк, обновлять каталог.

Каждый раз, когда вы перемещаетесь с одной части диска на другую (например, читаете файл a, чтобы записать файл b, пишите файл b, чтобы записать каталог, и пишите каталог, чтобы прочитать следующий фрагмент), который должен искать диск - перемещайте головки, позвольте головкам успокоиться, подождите, пока появится правая часть диска. Это одно из преимуществ твердотельного диска - поиск занимает совсем немного времени. При спячке данные записываются сквозно. Файл гибернации (подкачки) предварительно выделяется, поэтому каталог не нужно обновлять (вы не меняете размер файла гибернации, а только его содержимое).

И, наконец, ваш компьютер приостановил все остальные задачи - это ЕДИНСТВЕННАЯ вещь, которую он делает (я сомневаюсь, что это будет иметь большое значение, но он обязательно сделает некоторые!). Даже такие вещи, как управление памятью и переключение задач приостановлены.

0

Вероятно, это связано с тем, что оперативная память имеет гораздо более высокую скорость ввода / вывода, чем жесткий диск, поэтому оперативная память может выводить содержимое в нее так же быстро, как и жесткий диск.

При копировании файлов вы также ограничены различными факторами - скоростью диска, если он должен считывать и выводить на один и тот же диск, это займет больше времени, ограниченной скоростью соединения (если к внешнему диску), проверкой его ничего не перезаписывает и т.д.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .