2

有人知道一种可以捕获正在运行的线程的状态并将其序列化以进一步恢复的机制吗?
JVM有什么可用的吗?
pthreads怎么样?
我的主要目标是能够将正在运行的线程迁移到远程机器。

4

4 回答 4

8

在该线程的配合下,您可以通过线程支持的任何机制来完成。没有那个线程的配合,是不可能的。如果该线程持有您的序列化代码所需的锁,会发生什么?

如果您迁移当前正在使用某些内核资源(例如管道)的正在运行的线程,会发生什么情况。您会迁移该资源吗?

您的问题的正确解决方案可能是让线程支持迁移机制。你如何做到这一点取决于该线程正在做什么。如果您准确地解释是什么,您将获得更有可能帮助您解决实际问题的答案。

于 2012-09-27T20:35:42.257 回答
1

这个问题的答案实际上取决于什么构成了正在运行的线程的状态。

如果状态是允许复制和保存线程状态然后插入回新线程的本地线程数据,那么该机制基本上只是用某种可序列化对象保存状态,然后用于创建具有已保存状态的新线程,然后开始运行。

但是,如果线程状态依赖于外部对象或实体,则问题会更加棘手。例如,如果您有一个使用 TCP 充当服务器的线程,并且您想保存其状态然后稍后重新启动它,则套接字将更改,并且正在访问服务器线程的客户端将知道服务器线程停止通信一阵子。

这意味着对于依赖于线程的任何外部实体,需要知道线程正在被保存和冻结,他们将需要有一些东西可以让他们要么跌倒到替代方案,要么保存和冻结自己,并且需要某种协议,以便重新启动的线程可以让其他实体知道它已恢复业务及其当前状态。

此外,如果线程依赖于某些外部实体,那么这些实体必须能够处理被冻结的线程。可能需要某种机制,以便线程可以释放各种资源,其状态已保存,然后在重新启动时能够回收这些资源或类似资源,然后将这些资源重置为已保存状态。

于 2012-09-27T20:50:45.597 回答
0

我不知道您可以通过任何方式发送线程本身。但是,您可以使用诸如 memento 模式之类的模式来保存线程的状态。

在继续之前请参阅这些参考资料,以便了解术语:

基本上,你会得到这个:

  1. 设计一个可以在任何开始状态下运行的作业(线程),包括执行中的状态。
  2. 当它需要迁移时,获取该线程的状态。
    • 在 Java 中,您可以使用ThreadLocal变量来存储线程状态。
  3. 将该状态序列化到另一台机器。
  4. 使用该状态以您反序列化的状态启动一个新线程。

这是一种比实际迁移线程、其状态、堆栈等更好的方法,因为您可以选择绝对需要移动的内容,而不是无论如何都移动所有内容。

于 2012-09-27T21:07:12.790 回答
0

如果您想将正在运行的 JVM 从一台机器移动到另一台机器,您很可能不会自己做,而是使用 VM 管理器的实时迁移功能。

VM 管理器会将整个虚拟机从一台物理机移动到另一台物理机,而无需停止虚拟机或进程,但它比序列化/反序列化线程要高得多。由于线程可能使用操作系统本地的资源,例如文件系统或套接字,因此整个操作系统需要跟随线程到达另一台物理机器。

于 2012-09-27T20:48:17.007 回答