Windowshibernate如何工作

出于好奇,我正在寻找关于“如何Windowshibernate选项工作”,即当在Windows关机对话框中select“hibernate”选项的文章/文档。 我从某些渠道得到的答复是,它仅仅是内存和寄存器的序列化。

如果我在这里错了,请原谅我。 如果Windows可以序列化任何应用程序,进程或对象,无论它是可序列化的还是不可序列化的,.NET如何将可序列化的对象限制为具有[Serializable]属性或ISerializable接口的对象?

在进程地址空间内,一切都只是字节; 一些堆栈,一些托管堆等。字节固有地可序列化 – 它们只是字节。 所有休眠所要做的就是挂起线程并将整个地址空间写入磁盘。

使用对象时 ,您希望将它们保存到某些内存不足的结构中。 不幸的是,存储地址等是没有意义的 ,因为特别不可能在内存中重新使用完全相同的点。 另外,像非托管对象句柄的许多事情在重新水化时将没有意义 。 您也很可能只想保存一小块对象,而不是整个进程空间。 即使在一个小图中,这些对象可能会散落在各处 – 所以你不能只复制几页的内存。

另外请记住,序列化的常见用法是深度克隆对象; 如果你依赖于内存表示的对象,你将不得不反序列化到内存中的相同的地方 – 所以你不能克隆任何东西 。 这就是你触及一些概念之前 ,比如压缩垃圾收集器,这些垃圾收集器在你看不到的时候在内存中移动对象。

还要考虑到你可能正在将数据加载到不同的平台/体系结构中,或者想要编写特定的格式(xml,json等)。

因此,不是仅仅复制原始内存,序列化代码必须查看单个对象,遍历引用和写入对象图,以允许从与原始内存完全没有任何关系的源进行再水合。 很难。

这是两个完全不同的东西。 Windows在任何时候都可以控制内存中的内容,并且可以直接访问硬件。 “序列化”是描述它支持休眠的一个词,但它和CLR中的概念不一样。

在.NET中,序列化是开发人员通常发起的显式操作; 该属性告诉框架,您标记的类型可以流出并返回,而不必担心行为中的状态或变化。

从技术上说,CLR可以序列化我想要的任何东西,毕竟它可以访问每种类型的底层表示,并跟踪每个对象实例。 所以我想你可以在任何给定的点上“休眠”整个应用程序域; 这将更接近于Windows所做的。

那只是它的内存和寄存器的串行化

“序列化”可能是错误的用语; 谁告诉你,可能只是意味着“复制”。

我们来看看这两个概念是如何不同的。

基本上,序列化意味着一个对象被转换成连续的字节流,并且以后可以从该流精确重构。 为什么我强调“连续”? 原因如下:如果一个对象引用驻留在另一个内存位置的另一个对象(即,与被序列化的对象不是“邻接”),那么序列化也会将另一个对象引入字节流中,这样就没有依赖关系对象在特定的内存位置。 您最终会得到一个可能包含完整对象图的单个字节数组,而不会再引用外部对象。

现在,所有这些可能都不需要休眠。 您只需将所有内容全部复制到硬盘(无需任何修改或重新排序),即可创建计算机的RAM,CPU寄存器和I / O寄存器的完整快照。 (稍微聪明一点的休眠过程可能只包含操作系统实际分配的内存,即只有正在使用的内存。)

但是我敢说,休眠比这个稍微复杂一些:例如,当涉及到I / O寄存器的时候,你很快可能不能复制保存的寄存器值。 您可能还必须小心地按照正确的顺序写入I / O寄存器以使某些I / O设备恢复到之前的状态。 我可以想象,PCI / AGP标准对于节能状态有特殊的处理方式,您可以通过专用的I / O寄存器向设备要求其当前状态的快照。 (但这只是猜测。)