2

最近,我一直在研究暂停和恢复 .Net 应用程序的能力,特别是着眼于能够暂停应用程序、存储其状态并稍后再次启动它。

我一直在研究通过编写自定义 CLR 主机提供的选项,这无疑是一种神秘的艺术。似乎自定义主机可以为任务、内存管理、锁等提供自己的实现。因此,从这里看来,我可能能够创建一个自定义 CLR 主机,它可以通过 ICLRTask 暂停和恢复应用程序,但我' m 不确定提供的接口是否有足够的钩子来暂停所有任务,将整个程序状态存储到磁盘,然后稍后再使应用程序恢复活力。有人可以明确告诉我这根本不可能吗?我也不介意它是否仅适用于一小部分应用程序,我只是对这里的可能性感到好奇。

4

2 回答 2

3

很抱歉不得不在你的游行中下雨,但这不会飞。ICLRTask 接口是应 SQL Server 团队的明确要求添加的。它们支持 SQLCLR 主机,这是 CLR 的自定义主机,允许程序员在存储过程中编写托管代码。他们要求 CLR 团队打破托管线程和操作系统线程之间的硬链接,即当前框架中的 ProcessThread。旨在将托管线程实现为纤程,这是当时 SQL Server 的核心功能。

这实际上并没有发生,他们无法获得足够的可靠性并放弃了该项目。而且这个项目很快就没有理由让它工作了,光纤无法与拥有自己的 L1 缓存的多核 CPU 相匹敌。

这与你想要完成的事情没有任何关系。到目前为止,除了可靠地捕获进程状态之外,最难解决的问题是您无法真正处理正在执行本机代码的线程。特别是那种调用 winapi 函数并阻塞内核驱动程序以完成 I/O 请求的类型。您无法捕获内核状态,也没有钩子。向 pinvoke 编组器添加钩子会使其太慢。Hibernate 是一个系统特性,它不能是一个进程特性。

于 2012-05-26T21:08:51.827 回答
2

当 Mono 运行时被集成为 Second Life 脚本引擎时,暂停正在运行的进程,然后序列化并移动到另一台机器(或稍后)并恢复的能力是在 Mono 运行时上实现的。这是几年前的事了,我不确定这项工作是否被重新合并到开源 Mono 代码中。但据所有报道,这是一次成功的演习。

来自 Miguel 的这篇博客文章可能是一个好的开始http://tirania.org/blog/archive/2008/Jan-29.html并且有更多指向 LANG.NET 视频的链接,其中讨论了 Mono 工作的第二人生。

关于另一篇文章到底做了什么的更多线索:

2006 年,LindenLabs 的 Jim 介绍了他们在 SecondLife 中为支持微线程所做的工作。

Jim's work was a lot more ambitious than what both Joe had requested. SecondLife required that code be suspended at any point in time and that its entire state be serializable into a format suitable for storage into a database. Serialized state could then be restored at a different point in time or on a different computer (for example while moving from node to node).

For this to work, they needed a system that would track precisely the entire call stack chain, local variables and parameters as well as being able to suspend the code at any point.

Jim did this by using a CIL rewriting engine that injected the state serialization and reincarnation into an existing CIL instructions stream. He covered the technology in detail in his Lang.NET talk in 2006.

The technology went in production in 2008 and today this continuation framework powers 10 million Mono scripts on SecondLife.

于 2012-05-26T21:28:30.510 回答