Как работает Windows Hibernation - PullRequest
5 голосов
/ 06 марта 2011

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

Простите, если я ошибаюсь.Если окна могут сериализовать какие-либо приложения, процессы или объекты независимо от того, являются ли они сериализуемыми или несериализуемыми, почему .NET ограничивает сериализуемые объекты объектами с атрибутом [Serializable] или интерфейсом ISerializable?

Ответы [ 3 ]

6 голосов
/ 06 марта 2011

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

С объектами вы хотите сохранить их в некоторой структуре нехватки памяти. К сожалению, не имеет смысла хранить адреса и т. Д., Поскольку исключительно вряд ли переместится в одну и ту же точку памяти. Кроме того, многие вещи, такие как дескрипторы неуправляемых объектов , не будут иметь смысла при повторной гидратации. Также весьма вероятно, что вы хотите сохранить только маленький блок объектов, а не все пространство процесса. И даже на небольшом графике эти объекты могут быть разбросаны по всему месту - так что вы не сможете просто скопировать несколько страниц памяти.

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

Также учтите, что вы можете загружать данные в другую платформу / архитектуру или хотите написать определенный формат (xml, json и т. Д.).

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

2 голосов
/ 06 марта 2011

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

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

Технически CLR может сериализовать все, что, я полагаю, после того, как у него есть доступ к базовомупредставление каждого типа и отслеживает каждый экземпляр объекта.Так что я думаю, что вы можете «впасть в спячку» всего домена приложения в любой момент;это было бы ближе к тому, что делает Windows.

1 голос
/ 06 марта 2011

что, это просто сериализация памяти и регистров

«Сериализация», вероятно, был неправильным термином; кто бы ни сказал вам, что, вероятно, просто означает "копирование".

Давайте посмотрим, как эти два понятия отличаются.

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

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

Но я осмелюсь сказать, что гибернация немного сложнее, чем эта: например, когда дело доходит до регистров ввода / вывода, очень быстро становится возможным, что вы не сможете просто скопировать обратно сохраненные значения регистров; вам также может потребоваться записать регистры ввода-вывода в правильном порядке , чтобы вернуть какое-либо устройство ввода-вывода в прежнее состояние. Я мог бы предположить, что стандарт (ы) PCI / AGP имеют специальную обработку для состояний энергосбережения, так что вы можете запросить у устройства моментальный снимок его текущего состояния через выделенные регистры ввода / вывода. (Но это только догадки.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...