2012-05-26 32 views
2

我一直在寻找的暂停和恢复.Net应用程序为晚,特别是眼睛朝着能暂停的应用程序,存储其状态的能力,稍后再启动它。自定义CLR主机 - “暂停” /“恢复”应用

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

+1

首先,我对自定义CLR主机一无所知,所以这都是猜测。 思考它如何工作,我认为它只适用于一部分应用程序。这是因为文件句柄或其他系统资源在恢复程序时可能不存在。您的主机或您的应用程序必须足够聪明才能知道尝试重新请求这些外部资源。如果您不得不对主机进行更改以支持主机,那么我认为您首先不需要主机,因此无论如何您的应用都可以暂停并恢复。 – Steve

+0

Workflow Foundation(http://msdn.microsoft.com/zh-cn/netframework/aa663328.aspx)怎么样?这允许工作停止并被序列化,以后继续。这里有漂亮的图片:http://msdn.microsoft.com/en-us/library/dd851337.aspx。 – Govert

+0

@Govert我对Workflow Foundation感到颇为赞赏。我在这整个谈话中发现的一些东西是关于持久迭代器概念的链接。有点不好意思,但我想我可以用它做一些好事...链接在这里:http://dotnet.agilekiwi.com/blog/2007/05/implementing-workflow-with-persistent。 html –

回答

3

对不起,不得不下雨你的游行,但这不会飞。 ICLRTask接口是在SQL Server团队的快速请求中添加的。他们支持SQLCLR主机,这是CLR的自定义托管,允许程序员在存储过程中编写托管代码。他们要求CLR团队打破当前框架中托管线程与操作系统线程ProcessThread之间的硬连接。目的是将托管线程实现为光纤,这是当时SQL Server的核心功能。

这实际上并没有发生,他们无法得到它足够可靠并放弃了该项目。而且该项目正在迅速耗尽原因,纤维与具有自己的L1缓存的多核cpus不匹配。

不具有一个heckofalot与你试图完成什么。到目前为止,要想破解最棘手的问题,除了可靠地捕获进程状态之外,还不能处理执行本机代码的线程。特别是那种禁止winapi函数并阻止内核驱动程序完成I/O请求的类型。你不能捕获内核状态,也不会有钩子。将挂钩添加到pinvoke编组器会让它太慢。 Hibernate是一个系统功能,它不能成为一个进程功能。

+0

感谢您的好信息!我曾看到SwitchOut的功能下降,但我认为它已在更高版本中实施。只有这样,你才能得到我的投票才能得到可靠的答案! –

2

暂停正在运行的进程,然后序列化和移动到另一台机器(或稍后的时间)和恢复的能力在单声道运行时实现的,当它被集成为Second Life的脚本引擎。这是几年前,我不确定这项工作是否被纳入开源Mono代码。但所有报道都是成功的。

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

约究竟做from another post了一些端倪:

2006年,吉姆LindenLabs介绍,他们在SecondLife的做了支持microthreading工作。

吉姆的工作比乔要求的要多得多。 SecondLife要求代码在任何时间点都被暂停,并且其整个状态可以被序列化为适合存储到数据库中的格式。序列化状态然后可以在不同时间点或不同计算机上恢复(例如,当从一个节点移动到另一个节点时)。

对于这项工作,他们需要一个系统,准确地跟踪整个调用堆栈链,局部变量和参数,以及能够在任何时候暂停代码。

Jim通过使用CIL重写引擎来完成此操作,该引擎将状态序列化和轮回注入到现有的CIL指令流中。他在2006年的Lang.NET谈话中详细介绍了该技术。

该技术于2008年投入生产,今天该继续框架为SecondLife提供了1000万个单声道脚本。

+0

这也吓人真棒!感谢您的链接。这也许没有完全回答我的问题,但它肯定回答了我的意图。我一定会仔细看看这个...... –

+0

谢谢!所以看起来当时有两件类似的作品:一些是由一个叫Tomi的人和一个由Linden Labs创作的。 Tomi的工作(本身不支持序列化)被拿起并折叠回Mono.Tasklets.Continuations(http://www.mono-project.com/Continuations)。但是,我不确定序列化支持是否曾被添加过。你知道吗?如果不是,如果林登实验室发布了他们的Mono版本,会有什么线索?我一直在做一点挖掘,但没有到目前为止...... –

+0

我不确定它是否类似。 Continuations基本上为您提供异步的管道,就像C#5中的工具一样。运行时序列化非常复杂。您可以在Mono开发列表上询问:http://lists.ximian.com/mailman/listinfo/mono-devel-list。 – Govert