我一直在研究暂停和恢复.Net应用程序的能力,特别是关注能够暂停应用程序,存储其状态以及稍后再次启动它。
我一直在寻找通过编写自定义CLR主机提供的选项,这是一个神秘的艺术。看来自定义主机可以为任务,内存管理,锁等提供自己的实现。所以从这看起来我可能能够创建一个可以通过ICLRTask暂停和恢复应用程序的自定义CLR主机,但是我我不确定所提供的接口是否有足够的挂钩来暂停所有任务,将整个程序状态存储到磁盘,然后在稍后将应用程序恢复生机。有人可以明确地告诉我,这根本不可能吗?我也不介意它是否只适用于一小部分应用程序,我只是对这里的可能性感到好奇。
答案 0 :(得分:3)
对不起,你的游行必须下雨,但那不会飞。根据SQL Server团队的明确请求添加了ICLRTask接口。它们支持SQLCLR主机,它是CLR的自定义托管,允许程序员在存储过程中编写托管代码。他们要求CLR团队打破托管线程与当前框架中的操作系统线程ProcessThread之间的硬链接。旨在将托管线程实现为光纤,这是当时SQL Server的核心功能。
实际上并没有发生,他们无法让它足够可靠并且放弃了这个项目。而且该项目很快就没有理由让它工作,光纤与多核cpu和自己的L1缓存不匹配。
没有heckofalot与你想要完成的事情有关。到目前为止,除了可靠地捕获进程状态之外,最难以破解的是,您无法真正处理执行本机代码的线程。特别是那种使用winapi函数并阻止内核驱动程序完成I / O请求的类型。你无法捕获内核状态,也没有钩子。向pinvoke marshaller添加钩子会使它太慢。 Hibernate是一个系统功能,它不能是一个过程功能。
答案 1 :(得分:2)
当Mono运行时集成为Second Life脚本引擎时,能够暂停正在运行的进程,然后序列化并移动到另一台计算机(或更晚的时间)并恢复。这是几年前的事,我不确定这项工作是否已纳入开源Mono代码中。但据报道,这是一次成功的演习。
来自Miguel的这篇博文可能是一个很好的开始http://tirania.org/blog/archive/2008/Jan-29.html,还有一些链接到LANG.NET视频,其中讨论了Mono on Mono的工作。
关于究竟做了什么的更多线索from another post:
2006年,来自LindenLabs的Jim介绍了他们在SecondLife中为支持微线程所做的工作。
Jim的工作比Joe要求的要雄心勃勃。 SecondLife要求代码在任何时间点暂停,并且其整个状态可序列化为适合存储到数据库中的格式。然后可以在不同的时间点或在不同的计算机上恢复序列化状态(例如,在从节点移动到节点时)。
为了实现这一点,他们需要一个能够精确跟踪整个调用堆栈链,局部变量和参数以及能够在任何时候暂停代码的系统。
Jim通过使用CIL重写引擎完成了这项工作,该引擎将状态序列化和转世注入现有的CIL指令流。他在2006年的Lang.NET演讲中详细介绍了该技术。
该技术于2008年投入生产,今天这个延续框架为SecondLife提供了1000万个Mono脚本。