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